{"Description":"(SO0310) - DeepRacer on AWS. Version v1.2.11","Parameters":{"AdminEmail":{"Type":"String","AllowedPattern":"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","ConstraintDescription":"Must be a valid email address","Description":"Email address for the initial admin user. This user will be automatically added to the admin group."},"Namespace":{"Type":"String","Default":"default","AllowedPattern":"^[a-z0-9]{3,12}$","Description":"The namespace for this deployment of DeepRacer. Lowercase alphanumeric characters of length between 3 and 12"},"CustomDomain":{"Type":"String","Default":"","AllowedPattern":"^(https?://([a-zA-Z0-9.-]+)(\\.([a-zA-Z0-9.-]{2,6}))?(:[0-9]+)?)?$","Description":"Custom domain URL for CORS allowlist (only if you have or plan to map a custom domain to CloudFront)"},"EmailDeliveryMethod":{"Type":"String","Default":"COGNITO","AllowedValues":["COGNITO","SES"],"Description":"Method for delivering authentication emails. If choosing SES, you will need to have production access approved for your account in order to send emails. If choosing Cognito, you will need to consider the daily email limit. See the implementation guide for more information."},"SesVerifiedEmail":{"Type":"String","Default":"","AllowedPattern":"^$|^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","ConstraintDescription":"Must be a valid email address or empty.","Description":"Verified SES email address used to send emails from. Required when EmailDeliveryMethod is SES."},"SesIdentity":{"Type":"String","Default":"","AllowedPattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9.-]*\\.[a-zA-Z]{2,}$","ConstraintDescription":"Must be a valid domain name or empty.","Description":"Optional. SES verified identity used to authorize sending. Use a domain (e.g. example.com) if verified at domain level. Defaults to SesVerifiedEmail."}},"Rules":{"SesRequiresVerifiedEmail":{"Assertions":[{"Assert":{"Fn::Or":[{"Fn::Equals":[{"Ref":"EmailDeliveryMethod"},"COGNITO"]},{"Fn::Not":[{"Fn::Equals":[{"Ref":"SesVerifiedEmail"},""]}]}]},"AssertDescription":"SesVerifiedEmail must not be empty when EmailDeliveryMethod is SES."}]}},"Conditions":{"IsSesEnabled":{"Fn::Equals":[{"Ref":"EmailDeliveryMethod"},"SES"]},"IsSesIdentityProvided":{"Fn::Not":[{"Fn::Equals":[{"Ref":"SesIdentity"},""]}]},"WebsiteSupportsCloudFrontLogging36BD107F":{"Fn::Not":[{"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-south-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-4"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"il-central-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"me-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]}]}]}]},"HasCustomDomain":{"Fn::Not":[{"Fn::Equals":[{"Ref":"CustomDomain"},""]}]},"MetricsInfraSendAnonymizedData168371B5":{"Fn::Equals":[{"Fn::FindInMap":["MetricsInfraAnonymizedData6566E64E","SendAnonymizedData","Data"]},"Yes"]},"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":{"DynamoDBTable7400F6BB":{"Type":"AWS::DynamoDB::GlobalTable","Properties":{"AttributeDefinitions":[{"AttributeName":"pk","AttributeType":"S"},{"AttributeName":"sk","AttributeType":"S"},{"AttributeName":"gsi1pk","AttributeType":"S"},{"AttributeName":"gsi1sk","AttributeType":"S"},{"AttributeName":"closeTime","AttributeType":"S"},{"AttributeName":"rankingScore","AttributeType":"N"}],"BillingMode":"PAY_PER_REQUEST","GlobalSecondaryIndexes":[{"IndexName":"gsi1pk-gsi1sk","KeySchema":[{"AttributeName":"gsi1pk","KeyType":"HASH"},{"AttributeName":"gsi1sk","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"}},{"IndexName":"sk-index","KeySchema":[{"AttributeName":"sk","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}],"KeySchema":[{"AttributeName":"pk","KeyType":"HASH"},{"AttributeName":"sk","KeyType":"RANGE"}],"LocalSecondaryIndexes":[{"IndexName":"closeTime","KeySchema":[{"AttributeName":"pk","KeyType":"HASH"},{"AttributeName":"closeTime","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"}},{"IndexName":"rankingScore","KeySchema":[{"AttributeName":"pk","KeyType":"HASH"},{"AttributeName":"rankingScore","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"}}],"Replicas":[{"GlobalSecondaryIndexes":[{"IndexName":"gsi1pk-gsi1sk"},{"IndexName":"sk-index"}],"PointInTimeRecoverySpecification":{"PointInTimeRecoveryEnabled":true},"Region":{"Ref":"AWS::Region"}}],"StreamSpecification":{"StreamViewType":"NEW_AND_OLD_IMAGES"},"TableName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndy.Main"]]}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DynamoDBTable/Table/Resource"}},"S3BucketAccessLogsBucketCC80D389":{"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},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/AccessLogsBucket/Resource","guard":{"SuppressedRules":["S3_BUCKET_LOGGING_ENABLED"]}}},"S3BucketAccessLogsBucketPolicy52534B3C":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"S3BucketAccessLogsBucketCC80D389"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["S3BucketAccessLogsBucketCC80D389","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketAccessLogsBucketCC80D389","Arn"]},"/*"]]}]},{"Action":"s3:PutObject","Condition":{"StringEquals":{"aws:SourceAccount":{"Ref":"AWS::AccountId"}}},"Effect":"Allow","Principal":{"Service":"logging.s3.amazonaws.com"},"Resource":{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketAccessLogsBucketCC80D389","Arn"]},"/*"]]}}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/AccessLogsBucket/Policy/Resource"}},"S3BucketModelStorageBucket01547CCF":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"CorsConfiguration":{"CorsRules":[{"AllowedHeaders":["*"],"AllowedMethods":["GET"],"AllowedOrigins":["*"]}]},"LoggingConfiguration":{"DestinationBucketName":{"Ref":"S3BucketAccessLogsBucketCC80D389"},"LogFilePrefix":"model-storage-bucket-logs/"},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-cdk:auto-delete-objects","Value":"true"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/Resource"}},"S3BucketModelStorageBucketPolicyF2A3C9FA":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"S3BucketModelStorageBucket01547CCF"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]},{"Action":["s3:PutBucketPolicy","s3:GetBucket*","s3:List*","s3:DeleteObject*"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/Policy/Resource"}},"S3BucketModelStorageBucketAutoDeleteObjectsCustomResource760ED3F6":{"Type":"Custom::S3AutoDeleteObjects","Properties":{"ServiceToken":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F","Arn"]},"BucketName":{"Ref":"S3BucketModelStorageBucket01547CCF"}},"DependsOn":["S3BucketModelStorageBucketPolicyF2A3C9FA"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/AutoDeleteObjectsCustomResource/Default"}},"S3BucketModelStorageBucketNotificationsHandlerPolicy52973B83":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"s3:PutBucketNotification","Effect":"Allow","Resource":{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"S3BucketModelStorageBucketNotificationsHandlerPolicy52973B83","Roles":[{"Ref":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/Notifications/HandlerPolicy/Resource"}},"S3BucketModelStorageBucketNotifications1EF26196":{"Type":"Custom::S3BucketNotifications","Properties":{"ServiceToken":{"Fn::GetAtt":["BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691","Arn"]},"BucketName":{"Ref":"S3BucketModelStorageBucket01547CCF"},"NotificationConfiguration":{"LambdaFunctionConfigurations":[{"Events":["s3:ObjectCreated:*"],"LambdaFunctionArn":{"Fn::GetAtt":["UsageFunctionsUpdateStorageUsedByProfileFnE6F69AD3","Arn"]}},{"Events":["s3:ObjectRemoved:*"],"LambdaFunctionArn":{"Fn::GetAtt":["UsageFunctionsUpdateStorageUsedByProfileFnE6F69AD3","Arn"]}}]},"Managed":true,"SkipDestinationValidation":false},"DependsOn":["S3BucketModelStorageBucketAllowBucketNotificationsTodeepraceronawsUsageFunctionsUpdateStorageUsedByProfileFn14338B203C6EDEA3","S3BucketModelStorageBucketNotificationsHandlerPolicy52973B83","S3BucketModelStorageBucketPolicyF2A3C9FA"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/Notifications/Resource"}},"S3BucketModelStorageBucketAllowBucketNotificationsTodeepraceronawsUsageFunctionsUpdateStorageUsedByProfileFn14338B203C6EDEA3":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UsageFunctionsUpdateStorageUsedByProfileFnE6F69AD3","Arn"]},"Principal":"s3.amazonaws.com","SourceAccount":{"Ref":"AWS::AccountId"},"SourceArn":{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/ModelStorageBucket/AllowBucketNotificationsTodeepraceronawsUsageFunctionsUpdateStorageUsedByProfileFn14338B20"}},"S3BucketVirtualModelBucketE3ACD733":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"CorsConfiguration":{"CorsRules":[{"AllowedHeaders":["*"],"AllowedMethods":["GET"],"AllowedOrigins":["*"]}]},"LoggingConfiguration":{"DestinationBucketName":{"Ref":"S3BucketAccessLogsBucketCC80D389"},"LogFilePrefix":"virtual-model-bucket-logs/"},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-cdk:auto-delete-objects","Value":"true"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/VirtualModelBucket/Resource"}},"S3BucketVirtualModelBucketPolicy540D1096":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"S3BucketVirtualModelBucketE3ACD733"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["S3BucketVirtualModelBucketE3ACD733","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketVirtualModelBucketE3ACD733","Arn"]},"/*"]]}]},{"Action":["s3:PutBucketPolicy","s3:GetBucket*","s3:List*","s3:DeleteObject*"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["S3BucketVirtualModelBucketE3ACD733","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketVirtualModelBucketE3ACD733","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/VirtualModelBucket/Policy/Resource"}},"S3BucketVirtualModelBucketAutoDeleteObjectsCustomResourceFFE7AEB6":{"Type":"Custom::S3AutoDeleteObjects","Properties":{"ServiceToken":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F","Arn"]},"BucketName":{"Ref":"S3BucketVirtualModelBucketE3ACD733"}},"DependsOn":["S3BucketVirtualModelBucketPolicy540D1096"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/VirtualModelBucket/AutoDeleteObjectsCustomResource/Default"}},"S3BucketUploadBucketE3BDB254":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"CorsConfiguration":{"CorsRules":[{"AllowedHeaders":["*"],"AllowedMethods":["POST","GET","PUT","DELETE","HEAD"],"AllowedOrigins":["*"],"ExposedHeaders":["ETag","x-amz-server-side-encryption","x-amz-request-id","x-amz-id-2"],"MaxAge":3600}]},"LifecycleConfiguration":{"Rules":[{"AbortIncompleteMultipartUpload":{"DaysAfterInitiation":1},"ExpirationInDays":1,"Id":"AutoDeleteUploadedArtifacts","Status":"Enabled"}]},"LoggingConfiguration":{"DestinationBucketName":{"Ref":"S3BucketAccessLogsBucketCC80D389"},"LogFilePrefix":"upload-bucket-logs/"},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-cdk:auto-delete-objects","Value":"true"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/UploadBucket/Resource"}},"S3BucketUploadBucketPolicyDA06AE85":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"S3BucketUploadBucketE3BDB254"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"/*"]]}]},{"Action":["s3:PutBucketPolicy","s3:GetBucket*","s3:List*","s3:DeleteObject*"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/UploadBucket/Policy/Resource"}},"S3BucketUploadBucketAutoDeleteObjectsCustomResource5A5F52DE":{"Type":"Custom::S3AutoDeleteObjects","Properties":{"ServiceToken":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F","Arn"]},"BucketName":{"Ref":"S3BucketUploadBucketE3BDB254"}},"DependsOn":["S3BucketUploadBucketPolicyDA06AE85"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/S3Bucket/UploadBucket/AutoDeleteObjectsCustomResource/Default"}},"CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Version":"2012-10-17","Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}]},"ManagedPolicyArns":[{"Fn::Sub":"arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role"}},"CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetfaa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6.zip"},"Timeout":900,"MemorySize":128,"Handler":"index.handler","Role":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]},"Runtime":"nodejs24.x","Description":{"Fn::Join":["",["Lambda function for auto-deleting objects in ",{"Ref":"S3BucketModelStorageBucket01547CCF"}," S3 bucket."]]}},"DependsOn":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","aws:asset:path":"asset.faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6","aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"EcrNestedStackEcrNestedStackResourceD4475E64":{"Type":"AWS::CloudFormation::Stack","Properties":{"Parameters":{"referencetodeepraceronawsNamespaceCB5FC4A9Ref":{"Ref":"Namespace"}},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"TemplateURL":{"Fn::Join":["",["https://",{"Fn::Sub":"solutions-${AWS::Region}"},".s3.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/deepracer-on-aws/v1.2.11/deepraceronawsEcr47B19D6B.nested.template"]]}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Ecr.NestedStack/Ecr.NestedStackResource","aws:asset:path":"deepracer-on-aws/v1.2.11/deepraceronawsEcr47B19D6B.nested.template","aws:asset:property":"TemplateURL"}},"VpcuserExecutionVpc7A34B912":{"Type":"AWS::EC2::VPC","Properties":{"CidrBlock":"10.0.0.0/16","EnableDnsHostnames":true,"EnableDnsSupport":true,"InstanceTenancy":"default","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionVpc"}]},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/Resource"}},"VpcuserExecutionVpcprivateSubnet1SubnetD75F691E":{"Type":"AWS::EC2::Subnet","Properties":{"AvailabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"CidrBlock":"10.0.0.0/24","MapPublicIpOnLaunch":false,"Tags":[{"Key":"aws-cdk:subnet-name","Value":"private"},{"Key":"aws-cdk:subnet-type","Value":"Isolated"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet1"}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet1/Subnet"}},"VpcuserExecutionVpcprivateSubnet1RouteTable50843989":{"Type":"AWS::EC2::RouteTable","Properties":{"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet1"}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet1/RouteTable"}},"VpcuserExecutionVpcprivateSubnet1RouteTableAssociation58E053E1":{"Type":"AWS::EC2::SubnetRouteTableAssociation","Properties":{"RouteTableId":{"Ref":"VpcuserExecutionVpcprivateSubnet1RouteTable50843989"},"SubnetId":{"Ref":"VpcuserExecutionVpcprivateSubnet1SubnetD75F691E"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet1/RouteTableAssociation"}},"VpcuserExecutionVpcprivateSubnet2Subnet142EA691":{"Type":"AWS::EC2::Subnet","Properties":{"AvailabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"CidrBlock":"10.0.1.0/24","MapPublicIpOnLaunch":false,"Tags":[{"Key":"aws-cdk:subnet-name","Value":"private"},{"Key":"aws-cdk:subnet-type","Value":"Isolated"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet2"}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet2/Subnet"}},"VpcuserExecutionVpcprivateSubnet2RouteTable59CE409C":{"Type":"AWS::EC2::RouteTable","Properties":{"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet2"}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet2/RouteTable"}},"VpcuserExecutionVpcprivateSubnet2RouteTableAssociationD4C2D580":{"Type":"AWS::EC2::SubnetRouteTableAssociation","Properties":{"RouteTableId":{"Ref":"VpcuserExecutionVpcprivateSubnet2RouteTable59CE409C"},"SubnetId":{"Ref":"VpcuserExecutionVpcprivateSubnet2Subnet142EA691"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/privateSubnet2/RouteTableAssociation"}},"VpcuserExecutionVpcRestrictDefaultSecurityGroupCustomResource7280C02A":{"Type":"Custom::VpcRestrictDefaultSG","Properties":{"ServiceToken":{"Fn::GetAtt":["CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E","Arn"]},"DefaultSecurityGroupId":{"Fn::GetAtt":["VpcuserExecutionVpc7A34B912","DefaultSecurityGroup"]},"Account":{"Ref":"AWS::AccountId"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionVpc/RestrictDefaultSecurityGroupCustomResource/Default"}},"VpcuserExecutionSecurityGroupD815F9BC":{"Type":"AWS::EC2::SecurityGroup","Properties":{"GroupDescription":"deepracer-on-aws/Vpc/userExecutionSecurityGroup","SecurityGroupEgress":[{"CidrIp":"255.255.255.255/32","Description":"Disallow all traffic","FromPort":252,"IpProtocol":"icmp","ToPort":86}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionSecurityGroup/Resource","guard":{"SuppressedRules":["SECURITY_GROUP_EGRESS_PORT_RANGE_RULE"]}}},"VpcuserExecutionAcl25700C6A":{"Type":"AWS::EC2::NetworkAcl","Properties":{"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},{"Key":"Name","Value":"deepracer-on-aws/Vpc/userExecutionAcl"}],"VpcId":{"Ref":"VpcuserExecutionVpc7A34B912"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionAcl/Resource"}},"VpcuserExecutionAclDefaultAssociationdeepraceronawsVpcuserExecutionVpcprivateSubnet1A44A7089AD627662":{"Type":"AWS::EC2::SubnetNetworkAclAssociation","Properties":{"NetworkAclId":{"Ref":"VpcuserExecutionAcl25700C6A"},"SubnetId":{"Ref":"VpcuserExecutionVpcprivateSubnet1SubnetD75F691E"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionAcl/DefaultAssociationdeepraceronawsVpcuserExecutionVpcprivateSubnet1A44A7089/Resource"}},"VpcuserExecutionAclDefaultAssociationdeepraceronawsVpcuserExecutionVpcprivateSubnet21BD56B924BA9ED68":{"Type":"AWS::EC2::SubnetNetworkAclAssociation","Properties":{"NetworkAclId":{"Ref":"VpcuserExecutionAcl25700C6A"},"SubnetId":{"Ref":"VpcuserExecutionVpcprivateSubnet2Subnet142EA691"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Vpc/userExecutionAcl/DefaultAssociationdeepraceronawsVpcuserExecutionVpcprivateSubnet21BD56B92/Resource"}},"CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Version":"2012-10-17","Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}]},"ManagedPolicyArns":[{"Fn::Sub":"arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"}],"Policies":[{"PolicyName":"Inline","PolicyDocument":{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["ec2:AuthorizeSecurityGroupIngress","ec2:AuthorizeSecurityGroupEgress","ec2:RevokeSecurityGroupIngress","ec2:RevokeSecurityGroupEgress"],"Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ec2:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":security-group/",{"Fn::GetAtt":["VpcuserExecutionVpc7A34B912","DefaultSecurityGroup"]}]]}]}]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","guard":{"SuppressedRules":["IAM_NO_INLINE_POLICY_CHECK"]}}},"CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset02b51ab524e7bcf8f477de3e71e5f9a72e448301b26ba62e9e75a14f9c55a093.zip"},"Timeout":900,"MemorySize":128,"Handler":"__entrypoint__.handler","Role":{"Fn::GetAtt":["CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0","Arn"]},"Runtime":"nodejs24.x","Description":"Lambda function for removing all inbound/outbound rules from the VPC default security group"},"DependsOn":["CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","aws:asset:path":"asset.02b51ab524e7bcf8f477de3e71e5f9a72e448301b26ba62e9e75a14f9c55a093","aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"GlobalSettingsApplicationF700C2F1":{"Type":"AWS::AppConfig::Application","Properties":{"Description":"DeepRacer on AWS AppConfig application","Name":{"Fn::Join":["",[{"Ref":"Namespace"},"-deepracer-on-aws-app"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/Application"}},"GlobalSettingsEnvironment0C8D83D6":{"Type":"AWS::AppConfig::Environment","Properties":{"ApplicationId":{"Ref":"GlobalSettingsApplicationF700C2F1"},"Description":"DeepRacer on AWS AppConfig environment","Name":{"Fn::Join":["",[{"Ref":"Namespace"},"-deepracer-on-aws-env"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/Environment"}},"GlobalSettingsConfigurationProfile385EEC94":{"Type":"AWS::AppConfig::ConfigurationProfile","Properties":{"ApplicationId":{"Ref":"GlobalSettingsApplicationF700C2F1"},"Description":"DeepRacer on AWS AppConfig configuration profile","LocationUri":"hosted","Name":{"Fn::Join":["",[{"Ref":"Namespace"},"-deepracer-on-aws-config-prof"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/ConfigurationProfile"}},"GlobalSettingsDeploymentStrategyEEDE25EB":{"Type":"AWS::AppConfig::DeploymentStrategy","Properties":{"DeploymentDurationInMinutes":0,"Description":"DeepRacer on AWS AppConfig deployment strategy","FinalBakeTimeInMinutes":0,"GrowthFactor":100,"GrowthType":"LINEAR","Name":{"Fn::Join":["",[{"Ref":"Namespace"},"-deepracer-on-aws-deployment"]]},"ReplicateTo":"NONE","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/DeploymentStrategy"}},"GlobalSettingsHostedConfigurationVersion73F440C7":{"Type":"AWS::AppConfig::HostedConfigurationVersion","Properties":{"ApplicationId":{"Ref":"GlobalSettingsApplicationF700C2F1"},"ConfigurationProfileId":{"Ref":"GlobalSettingsConfigurationProfile385EEC94"},"Content":"{\"usageQuotas\":{\"global\":{\"globalComputeMinutesLimit\":-1,\"globalModelCountLimit\":-1},\"newUser\":{\"newUserComputeMinutesLimit\":-1,\"newUserModelCountLimit\":-1}},\"registration\":{\"type\":\"invite-only\"}}","ContentType":"application/json","Description":"DeepRacer on AWS AppConfig hosted configuration version"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/HostedConfigurationVersion"}},"GlobalSettingsDeployment078FE457":{"Type":"AWS::AppConfig::Deployment","Properties":{"ApplicationId":{"Ref":"GlobalSettingsApplicationF700C2F1"},"ConfigurationProfileId":{"Ref":"GlobalSettingsConfigurationProfile385EEC94"},"ConfigurationVersion":{"Ref":"GlobalSettingsHostedConfigurationVersion73F440C7"},"DeploymentStrategyId":{"Ref":"GlobalSettingsDeploymentStrategyEEDE25EB"},"Description":"DeepRacer on Aws AppConfig deployment","EnvironmentId":{"Ref":"GlobalSettingsEnvironment0C8D83D6"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/GlobalSettings/Deployment"}},"UserPoolPreSignUpFunctionServiceRole60148732":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PreSignUpFunction/ServiceRole/Resource"}},"UserPoolPreSignUpFunctionServiceRoleDefaultPolicy8656B111":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["appconfig:GetLatestConfiguration","appconfig:StartConfigurationSession"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":appconfig:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":application/",{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]},"/environment/",{"Fn::GetAtt":["GlobalSettingsEnvironment0C8D83D6","EnvironmentId"]},"/configuration/",{"Fn::GetAtt":["GlobalSettingsConfigurationProfile385EEC94","ConfigurationProfileId"]}]]}},{"Action":["appconfig:CreateHostedConfigurationVersion","appconfig:StartDeployment"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":appconfig:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":application/",{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]}]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":appconfig:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":application/",{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]},"/configurationprofile/",{"Fn::GetAtt":["GlobalSettingsConfigurationProfile385EEC94","ConfigurationProfileId"]}]]}]},{"Action":"appconfig:StartDeployment","Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":appconfig:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":deploymentstrategy/",{"Fn::GetAtt":["GlobalSettingsDeploymentStrategyEEDE25EB","Id"]}]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":appconfig:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":application/",{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]},"/environment/",{"Fn::GetAtt":["GlobalSettingsEnvironment0C8D83D6","EnvironmentId"]}]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolPreSignUpFunctionServiceRoleDefaultPolicy8656B111","Roles":[{"Ref":"UserPoolPreSignUpFunctionServiceRole60148732"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PreSignUpFunction/ServiceRole/DefaultPolicy/Resource"}},"UserPoolPreSignUpFunction0F50514D":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset7d626b9ecdf672a434d2536719b31124ffc4d3a005fd5e300c14ab956c848c8e.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","AWS_APPCONFIG_APPLICATION_ID":{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]},"AWS_APPCONFIG_ENVIRONMENT_ID":{"Fn::GetAtt":["GlobalSettingsEnvironment0C8D83D6","EnvironmentId"]},"AWS_APPCONFIG_CONFIGURATION_PROFILE_ID":{"Fn::GetAtt":["GlobalSettingsConfigurationProfile385EEC94","ConfigurationProfileId"]},"AWS_APPCONFIG_DEPLOYMENT_STRATEGY":{"Fn::GetAtt":["GlobalSettingsDeploymentStrategyEEDE25EB","Id"]}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-PreSignUpFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolPreSignUpFunctionServiceRole60148732","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolPreSignUpFunctionServiceRoleDefaultPolicy8656B111","UserPoolPreSignUpFunctionServiceRole60148732"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PreSignUpFunction/Resource","aws:asset:path":"asset.7d626b9ecdf672a434d2536719b31124ffc4d3a005fd5e300c14ab956c848c8e","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolPreSignUpErrorAlarm3307DC04":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Alert when a PreSignUpFunction failure occurs","ComparisonOperator":"GreaterThanOrEqualToThreshold","Dimensions":[{"Name":"FunctionName","Value":{"Ref":"UserPoolPreSignUpFunction0F50514D"}}],"EvaluationPeriods":1,"MetricName":{"Fn::Join":["",[{"Ref":"Namespace"},"-PreSignUpFunctionErrors"]]},"Namespace":"AWS/Lambda","Period":60,"Statistic":"Sum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":1,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PreSignUpErrorAlarm/Resource"}},"UserPoolPostConfirmationFunctionServiceRoleB9F3147A":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PostConfirmationFunction/ServiceRole/Resource"}},"UserPoolPostConfirmationFunctionServiceRoleDefaultPolicy7E308CF3":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"cognito-idp:AdminAddUserToGroup","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":cognito-idp:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":userpool/",{"Ref":"AWS::Region"},"_*"]]}}],"Version":"2012-10-17"},"PolicyName":"UserPoolPostConfirmationFunctionServiceRoleDefaultPolicy7E308CF3","Roles":[{"Ref":"UserPoolPostConfirmationFunctionServiceRoleB9F3147A"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PostConfirmationFunction/ServiceRole/DefaultPolicy/Resource"}},"UserPoolPostConfirmationFunctionB434DC55":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetb1b5ca716520c4636d46a94f4603b08c85b1181db0b0c5cf27b81fa3ce47947a.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-PostConfirmationFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolPostConfirmationFunctionServiceRoleB9F3147A","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolPostConfirmationFunctionServiceRoleDefaultPolicy7E308CF3","UserPoolPostConfirmationFunctionServiceRoleB9F3147A"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PostConfirmationFunction/Resource","aws:asset:path":"asset.b1b5ca716520c4636d46a94f4603b08c85b1181db0b0c5cf27b81fa3ce47947a","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolPostSignUpErrorAlarmBF8E665E":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Alert when a PostSignUpFunction failure occurs","ComparisonOperator":"GreaterThanOrEqualToThreshold","Dimensions":[{"Name":"FunctionName","Value":{"Ref":"UserPoolPostConfirmationFunctionB434DC55"}}],"EvaluationPeriods":1,"MetricName":{"Fn::Join":["",[{"Ref":"Namespace"},"-PostSignUpFunctionErrors"]]},"Namespace":"AWS/Lambda","Period":60,"Statistic":"Sum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":1,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/PostSignUpErrorAlarm/Resource"}},"UserPoolPreSignUpCognito975866FE":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolPreSignUpFunction0F50514D","Arn"]},"Principal":"cognito-idp.amazonaws.com","SourceArn":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UserPool/PreSignUpCognito"}},"UserPoolPostConfirmationCognitoCC9615D3":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolPostConfirmationFunctionB434DC55","Arn"]},"Principal":"cognito-idp.amazonaws.com","SourceArn":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UserPool/PostConfirmationCognito"}},"UserPool6D0DFADB":{"Type":"AWS::Cognito::UserPool","Properties":{"AccountRecoverySetting":{"RecoveryMechanisms":[{"Name":"verified_phone_number","Priority":1},{"Name":"verified_email","Priority":2}]},"AdminCreateUserConfig":{"AllowAdminCreateUserOnly":true,"InviteMessageTemplate":{"EmailMessage":"Hello,<br><br>You have been invited to join DeepRacer on AWS. Your temporary password is: {####}<br><br>You will be asked to create a new password upon successful verification.<br><br><br><br><i>Account ID: {username}</i>","EmailSubject":"Welcome to DeepRacer on AWS"}},"AliasAttributes":["email"],"AutoVerifiedAttributes":["email"],"EmailConfiguration":{"EmailSendingAccount":{"Fn::If":["IsSesEnabled","DEVELOPER","COGNITO_DEFAULT"]},"From":{"Fn::If":["IsSesEnabled",{"Ref":"SesVerifiedEmail"},{"Ref":"AWS::NoValue"}]},"SourceArn":{"Fn::If":["IsSesEnabled",{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ses:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":identity/",{"Fn::If":["IsSesIdentityProvided",{"Ref":"SesIdentity"},{"Ref":"SesVerifiedEmail"}]}]]},{"Ref":"AWS::NoValue"}]}},"EmailVerificationMessage":"The verification code to your new account is {####}","EmailVerificationSubject":"Verify your new account","LambdaConfig":{"CustomMessage":{"Fn::GetAtt":["UserPoolCognitoEmailMetricFunction89E4CA7C","Arn"]},"PostConfirmation":{"Fn::GetAtt":["UserPoolPostConfirmationFunctionB434DC55","Arn"]},"PreSignUp":{"Fn::GetAtt":["UserPoolPreSignUpFunction0F50514D","Arn"]}},"Policies":{"PasswordPolicy":{"MinimumLength":8,"RequireLowercase":true,"RequireNumbers":true,"RequireSymbols":true,"RequireUppercase":true}},"SmsVerificationMessage":"The verification code to your new account is {####}","UserPoolName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyUserPool"]]},"UserPoolTags":{"aws-solutions:dr-id":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}},"UsernameConfiguration":{"CaseSensitive":false},"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","Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UserPool/Resource"}},"UserPoolWebClientEB451012":{"Type":"AWS::Cognito::UserPoolClient","Properties":{"AllowedOAuthFlows":["implicit","code"],"AllowedOAuthFlowsUserPoolClient":true,"AllowedOAuthScopes":["profile","phone","email","openid","aws.cognito.signin.user.admin"],"CallbackURLs":["https://example.com"],"ExplicitAuthFlows":["ALLOW_USER_PASSWORD_AUTH","ALLOW_USER_SRP_AUTH","ALLOW_REFRESH_TOKEN_AUTH"],"RefreshTokenValidity":1440,"SupportedIdentityProviders":["COGNITO"],"TokenValidityUnits":{"RefreshToken":"minutes"},"UserPoolId":{"Ref":"UserPool6D0DFADB"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UserPool/WebClient/Resource"}},"UserPoolCognitoEmailMetricFunctionServiceRole0BD0B776":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoEmailMetricFunction/ServiceRole/Resource"}},"UserPoolCognitoEmailMetricFunctionServiceRoleDefaultPolicy80759D86":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"cloudwatch:PutMetricData","Condition":{"StringEquals":{"cloudwatch:namespace":"DeepRacerOnAWS/Email"}},"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"UserPoolCognitoEmailMetricFunctionServiceRoleDefaultPolicy80759D86","Roles":[{"Ref":"UserPoolCognitoEmailMetricFunctionServiceRole0BD0B776"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoEmailMetricFunction/ServiceRole/DefaultPolicy/Resource"}},"UserPoolCognitoEmailMetricFunction89E4CA7C":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset07889b6ec8e9753a8a60e8aa2ab2c0fc6e1655e074344b524f41182d2bf308b1.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-CognitoEmailMetricFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolCognitoEmailMetricFunctionServiceRole0BD0B776","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolCognitoEmailMetricFunctionServiceRoleDefaultPolicy80759D86","UserPoolCognitoEmailMetricFunctionServiceRole0BD0B776"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoEmailMetricFunction/Resource","aws:asset:path":"asset.07889b6ec8e9753a8a60e8aa2ab2c0fc6e1655e074344b524f41182d2bf308b1","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolCognitoEmailMetricFunctionAllowCognitoInvoke0BE1513D":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolCognitoEmailMetricFunction89E4CA7C","Arn"]},"Principal":"cognito-idp.amazonaws.com","SourceArn":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoEmailMetricFunction/AllowCognitoInvoke"}},"UserPoolEmailVolumeAnomalyDetector2BE115EB":{"Type":"AWS::CloudWatch::AnomalyDetector","Properties":{"Dimensions":[{"Name":"Namespace","Value":{"Ref":"Namespace"}}],"MetricName":"TransactionalEmailSent","Namespace":"DeepRacerOnAWS/Email","Stat":"Sum"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/EmailVolumeAnomalyDetector"},"Condition":"IsSesEnabled"},"UserPoolEmailVolumeAnomalyAlarm13AA4C91":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Unusual email sending volume detected","ComparisonOperator":"LessThanLowerOrGreaterThanUpperThreshold","DatapointsToAlarm":2,"EvaluationPeriods":3,"Metrics":[{"Id":"emailVolume","MetricStat":{"Metric":{"Dimensions":[{"Name":"Namespace","Value":{"Ref":"Namespace"}}],"MetricName":"TransactionalEmailSent","Namespace":"DeepRacerOnAWS/Email"},"Period":3600,"Stat":"Sum"},"ReturnData":true},{"Expression":"ANOMALY_DETECTION_BAND(emailVolume, 2)","Id":"anomalyBand","ReturnData":true}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"ThresholdMetricId":"anomalyBand","TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/EmailVolumeAnomalyAlarm"},"Condition":"IsSesEnabled"},"UserPoolSesBounceRateAlarmDB4AACA1":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"SES bounce rate exceeds 5% — risk of SES sending suspension","ComparisonOperator":"GreaterThanThreshold","EvaluationPeriods":1,"MetricName":"Reputation.BounceRate","Namespace":"AWS/SES","Period":300,"Statistic":"Average","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":0.05,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/SesBounceRateAlarm"},"Condition":"IsSesEnabled"},"UserPoolSesComplaintRateAlarm3DF4D832":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"SES complaint rate exceeds 0.1% — risk of SES sending suspension","ComparisonOperator":"GreaterThanThreshold","EvaluationPeriods":1,"MetricName":"Reputation.ComplaintRate","Namespace":"AWS/SES","Period":300,"Statistic":"Average","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":0.001,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/SesComplaintRateAlarm"},"Condition":"IsSesEnabled"},"UserPoolIdentityPoolA58D72D6":{"Type":"AWS::Cognito::IdentityPool","Properties":{"AllowUnauthenticatedIdentities":false,"CognitoIdentityProviders":[{"ClientId":{"Ref":"UserPoolWebClientEB451012"},"ProviderName":{"Fn::GetAtt":["UserPool6D0DFADB","ProviderName"]}}],"IdentityPoolName":{"Fn::Join":["",[{"Ref":"Namespace"},"-dr-idp"]]},"IdentityPoolTags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/IdentityPool"}},"UserPoolAdminRole3DAD93BC":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRoleWithWebIdentity","Condition":{"StringEquals":{"cognito-identity.amazonaws.com:aud":{"Ref":"UserPoolIdentityPoolA58D72D6"}},"ForAnyValue:StringLike":{"cognito-identity.amazonaws.com:amr":"authenticated"}},"Effect":"Allow","Principal":{"Federated":"cognito-identity.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AdminRole/Resource"}},"UserPoolAdminRoleDefaultPolicyE95DE84C":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["s3:PutObject","s3:PutObjectAcl","s3:ListMultipartUploadParts","s3:AbortMultipartUpload","s3:ListBucketMultipartUploads","s3:CreateMultipartUpload","s3:CompleteMultipartUpload"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"/*"]]}},{"Action":"execute-api:Invoke","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/*/*"]]}},{"Action":"iot:Connect","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":client/*"]]}},{"Action":["iot:Subscribe","iot:Receive"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topicfilter/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolAdminRoleDefaultPolicyE95DE84C","Roles":[{"Ref":"UserPoolAdminRole3DAD93BC"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AdminRole/DefaultPolicy/Resource"}},"UserPoolRaceFacilitatorRole275C3028":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRoleWithWebIdentity","Condition":{"StringEquals":{"cognito-identity.amazonaws.com:aud":{"Ref":"UserPoolIdentityPoolA58D72D6"}},"ForAnyValue:StringLike":{"cognito-identity.amazonaws.com:amr":"authenticated"}},"Effect":"Allow","Principal":{"Federated":"cognito-identity.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RaceFacilitatorRole/Resource"}},"UserPoolRaceFacilitatorRoleDefaultPolicy81FB4BF6":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["s3:PutObject","s3:PutObjectAcl","s3:ListMultipartUploadParts","s3:AbortMultipartUpload","s3:ListBucketMultipartUploads","s3:CreateMultipartUpload","s3:CompleteMultipartUpload"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"/*"]]}},{"Action":"iot:Connect","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":client/*"]]}},{"Action":["iot:Subscribe","iot:Receive"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topicfilter/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolRaceFacilitatorRoleDefaultPolicy81FB4BF6","Roles":[{"Ref":"UserPoolRaceFacilitatorRole275C3028"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RaceFacilitatorRole/DefaultPolicy/Resource"}},"UserPoolRaceFacilitatorRoleOverflowPolicy196CEAAC8":{"Type":"AWS::IAM::ManagedPolicy","Properties":{"Description":"Part of the policies for deepracer-on-aws/UserPool/RaceFacilitatorRole","Path":"/","PolicyDocument":{"Statement":[{"Action":"execute-api:Invoke","Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/importmodel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/importmodel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/DELETE/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/PATCH/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/ranking"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/ranking"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/rankings"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/rankings"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/liveQueue"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/liveQueue/reorder"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue/reorder"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/DELETE/leaderboards/*/liveQueue/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/liveQueue/*/resetModel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue/*/resetModel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/liveQueue/resetAll"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue/resetAll"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/liveQueue/launch"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue/launch"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/declareWinner"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/declareWinner"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/liveState"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveState"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/DELETE/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/PATCH/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluation"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/models/*/evaluation"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/evaluations"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluations"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/evaluations/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluations/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/admin/profiles"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/admin/profiles"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/admin/profiles/*/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/admin/profiles/*/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/admin/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/admin/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/PATCH/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/rewardFunction"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/rewardFunction"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/settings/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/settings/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/live-race/connect"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/live-race/connect"]]}]}],"Version":"2012-10-17"},"Roles":[{"Ref":"UserPoolRaceFacilitatorRole275C3028"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RaceFacilitatorRole/OverflowPolicy1/Resource"}},"UserPoolRacerRoleE35E47D7":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRoleWithWebIdentity","Condition":{"StringEquals":{"cognito-identity.amazonaws.com:aud":{"Ref":"UserPoolIdentityPoolA58D72D6"}},"ForAnyValue:StringLike":{"cognito-identity.amazonaws.com:amr":"authenticated"}},"Effect":"Allow","Principal":{"Federated":"cognito-identity.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RacerRole/Resource"}},"UserPoolRacerRoleDefaultPolicyBAF829F4":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["s3:PutObject","s3:PutObjectAcl","s3:ListMultipartUploadParts","s3:AbortMultipartUpload","s3:ListBucketMultipartUploads","s3:CreateMultipartUpload","s3:CompleteMultipartUpload"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"/*"]]}},{"Action":"execute-api:Invoke","Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/importmodel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/importmodel"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/ranking"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/ranking"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/rankings"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/rankings"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/leaderboards/*/submissions"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/liveQueue"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveQueue"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/leaderboards/*/liveState"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/leaderboards/*/liveState"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/models"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/DELETE/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/PATCH/models/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluation"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/models/*/evaluation"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/evaluations"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluations"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/evaluations/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/evaluations/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/models/*/getasset"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/PATCH/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/profile"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/rewardFunction"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/rewardFunction"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/GET/settings/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/settings/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/POST/live-race/connect"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*/OPTIONS/live-race/connect"]]}]},{"Action":"iot:Connect","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":client/*"]]}},{"Action":["iot:Subscribe","iot:Receive"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topicfilter/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolRacerRoleDefaultPolicyBAF829F4","Roles":[{"Ref":"UserPoolRacerRoleE35E47D7"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RacerRole/DefaultPolicy/Resource"}},"UserPoolIdentityPoolRoleAttachmentE127856F":{"Type":"AWS::Cognito::IdentityPoolRoleAttachment","Properties":{"IdentityPoolId":{"Ref":"UserPoolIdentityPoolA58D72D6"},"RoleMappings":{"cognito-user-pool":{"AmbiguousRoleResolution":"Deny","IdentityProvider":{"Fn::Join":["",[{"Fn::GetAtt":["UserPool6D0DFADB","ProviderName"]},":",{"Ref":"UserPoolWebClientEB451012"}]]},"RulesConfiguration":{"Rules":[{"Claim":"cognito:groups","MatchType":"Contains","RoleARN":{"Fn::GetAtt":["UserPoolAdminRole3DAD93BC","Arn"]},"Value":"dr-admins"},{"Claim":"cognito:groups","MatchType":"Contains","RoleARN":{"Fn::GetAtt":["UserPoolRaceFacilitatorRole275C3028","Arn"]},"Value":"dr-race-facilitators"},{"Claim":"cognito:groups","MatchType":"Contains","RoleARN":{"Fn::GetAtt":["UserPoolRacerRoleE35E47D7","Arn"]},"Value":"dr-racers"}]},"Type":"Rules"}},"Roles":{}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/IdentityPoolRoleAttachment"}},"UserPoolAddAdminToGroupFunctionServiceRole8634B616":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupFunction/ServiceRole/Resource"}},"UserPoolAddAdminToGroupFunctionServiceRoleDefaultPolicy4B44BBDD":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["cognito-idp:AdminAddUserToGroup","cognito-idp:AdminCreateUser"],"Effect":"Allow","Resource":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"UserPoolAddAdminToGroupFunctionServiceRoleDefaultPolicy4B44BBDD","Roles":[{"Ref":"UserPoolAddAdminToGroupFunctionServiceRole8634B616"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupFunction/ServiceRole/DefaultPolicy/Resource"}},"UserPoolAddAdminToGroupFunctionCA8F20A2":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete495b0f7a854004f16c154a6d87cc7f3d5af25fee5cabfedffa4dc0b372f254e.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-AddAdminToGroupFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolAddAdminToGroupFunctionServiceRole8634B616","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolAddAdminToGroupFunctionServiceRoleDefaultPolicy4B44BBDD","UserPoolAddAdminToGroupFunctionServiceRole8634B616"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupFunction/Resource","aws:asset:path":"asset.e495b0f7a854004f16c154a6d87cc7f3d5af25fee5cabfedffa4dc0b372f254e","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolAddAdminToGroupProviderframeworkonEventServiceRole678D0DCE":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupProvider/framework-onEvent/ServiceRole/Resource"}},"UserPoolAddAdminToGroupProviderframeworkonEventServiceRoleDefaultPolicy2EC1138F":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["UserPoolAddAdminToGroupFunctionCA8F20A2","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["UserPoolAddAdminToGroupFunctionCA8F20A2","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["UserPoolAddAdminToGroupFunctionCA8F20A2","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"UserPoolAddAdminToGroupProviderframeworkonEventServiceRoleDefaultPolicy2EC1138F","Roles":[{"Ref":"UserPoolAddAdminToGroupProviderframeworkonEventServiceRole678D0DCE"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"UserPoolAddAdminToGroupProviderframeworkonEventBBE36F99":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/UserPool/AddAdminToGroupProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["UserPoolAddAdminToGroupFunctionCA8F20A2","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"Role":{"Fn::GetAtt":["UserPoolAddAdminToGroupProviderframeworkonEventServiceRole678D0DCE","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["UserPoolAddAdminToGroupProviderframeworkonEventServiceRoleDefaultPolicy2EC1138F","UserPoolAddAdminToGroupProviderframeworkonEventServiceRole678D0DCE"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroupProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolAddAdminToGroup94C99B49":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["UserPoolAddAdminToGroupProviderframeworkonEventBBE36F99","Arn"]},"userPoolId":{"Ref":"UserPool6D0DFADB"},"adminEmail":{"Ref":"AdminEmail"}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AddAdminToGroup/Default"}},"UserPoolAdminUserPoolGroup21281686":{"Type":"AWS::Cognito::UserPoolGroup","Properties":{"Description":"DeepRacer on AWS - Admin user group","GroupName":"dr-admins","UserPoolId":{"Ref":"UserPool6D0DFADB"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/AdminUserPoolGroup"}},"UserPoolRaceFacilitatorUserPoolGroup8F192B0A":{"Type":"AWS::Cognito::UserPoolGroup","Properties":{"Description":"DeepRacer on AWS - Race facilitator user group","GroupName":"dr-race-facilitators","UserPoolId":{"Ref":"UserPool6D0DFADB"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RaceFacilitatorUserPoolGroup"}},"UserPoolRacerUserPoolGroupC1E2106C":{"Type":"AWS::Cognito::UserPoolGroup","Properties":{"Description":"DeepRacer on AWS - Racer user group","GroupName":"dr-racers","UserPoolId":{"Ref":"UserPool6D0DFADB"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/RacerUserPoolGroup"}},"UserPoolProfileRoleChangeHandlerServiceRoleA4D4401E":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileRoleChangeHandler/ServiceRole/Resource"}},"UserPoolProfileRoleChangeHandlerServiceRoleDefaultPolicy2E76051B":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"cognito-idp:ListUsers","Effect":"Allow","Resource":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}},{"Action":["dynamodb:BatchWriteItem","dynamodb:PutItem","dynamodb:UpdateItem","dynamodb:DeleteItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolProfileRoleChangeHandlerServiceRoleDefaultPolicy2E76051B","Roles":[{"Ref":"UserPoolProfileRoleChangeHandlerServiceRoleA4D4401E"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileRoleChangeHandler/ServiceRole/DefaultPolicy/Resource"}},"UserPoolProfileRoleChangeHandlerA3E1F617":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetb24601c60678e36910a8fcca1de1d5aab9262a6e4d9ad49d3e32f4a661b8bb2a.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-ProfileRoleChangeHandler"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolProfileRoleChangeHandlerServiceRoleA4D4401E","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolProfileRoleChangeHandlerServiceRoleDefaultPolicy2E76051B","UserPoolProfileRoleChangeHandlerServiceRoleA4D4401E"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileRoleChangeHandler/Resource","aws:asset:path":"asset.b24601c60678e36910a8fcca1de1d5aab9262a6e4d9ad49d3e32f4a661b8bb2a","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolProfileRoleChangeHandlerAllowEventRuleInvokeDF1B7BD1":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolProfileRoleChangeHandlerA3E1F617","Arn"]},"Principal":"events.amazonaws.com","SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":events:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":rule/CognitoUserPoolGroupChangeRule*"]]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileRoleChangeHandler/AllowEventRuleInvoke"}},"UserPoolCognitoUserPoolGroupChangeRuleA6AAB423":{"Type":"AWS::Events::Rule","Properties":{"EventPattern":{"source":["aws.cognito-idp"],"detail-type":["AWS API Call via CloudTrail"],"detail":{"eventSource":["cognito-idp.amazonaws.com"],"eventName":["AdminAddUserToGroup","AdminRemoveUserFromGroup"],"requestParameters":{"userPoolId":[{"Ref":"UserPool6D0DFADB"}]}}},"State":"ENABLED","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Targets":[{"Arn":{"Fn::GetAtt":["UserPoolProfileRoleChangeHandlerA3E1F617","Arn"]},"Id":"Target0"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoUserPoolGroupChangeRule/Resource"}},"UserPoolCognitoUserPoolGroupChangeRuleAllowEventRuledeepraceronawsUserPoolProfileRoleChangeHandler58A81962050981E7":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolProfileRoleChangeHandlerA3E1F617","Arn"]},"Principal":"events.amazonaws.com","SourceArn":{"Fn::GetAtt":["UserPoolCognitoUserPoolGroupChangeRuleA6AAB423","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoUserPoolGroupChangeRule/AllowEventRuledeepraceronawsUserPoolProfileRoleChangeHandler58A81962"}},"UserPoolProfileEmailChangeHandlerServiceRole6AEF8601":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileEmailChangeHandler/ServiceRole/Resource"}},"UserPoolProfileEmailChangeHandlerServiceRoleDefaultPolicy5B1B98C7":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["cognito-idp:AdminGetUser","cognito-idp:ListUsers"],"Effect":"Allow","Resource":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]}},{"Action":["dynamodb:BatchWriteItem","dynamodb:PutItem","dynamodb:UpdateItem","dynamodb:DeleteItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolProfileEmailChangeHandlerServiceRoleDefaultPolicy5B1B98C7","Roles":[{"Ref":"UserPoolProfileEmailChangeHandlerServiceRole6AEF8601"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileEmailChangeHandler/ServiceRole/DefaultPolicy/Resource"}},"UserPoolProfileEmailChangeHandlerDC3D1702":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset53da5d7786e6b270c86c452ad2ff9c4c8d3fcfc718b3fd26305e99b74cb549ae.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-ProfileEmailChangeHandler"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolProfileEmailChangeHandlerServiceRole6AEF8601","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolProfileEmailChangeHandlerServiceRoleDefaultPolicy5B1B98C7","UserPoolProfileEmailChangeHandlerServiceRole6AEF8601"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileEmailChangeHandler/Resource","aws:asset:path":"asset.53da5d7786e6b270c86c452ad2ff9c4c8d3fcfc718b3fd26305e99b74cb549ae","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolProfileEmailChangeHandlerAllowEmailChangeEventRuleInvokeBDC6534E":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolProfileEmailChangeHandlerDC3D1702","Arn"]},"Principal":"events.amazonaws.com","SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":events:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":rule/CognitoUserPoolEmailChangeRule*"]]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/ProfileEmailChangeHandler/AllowEmailChangeEventRuleInvoke"}},"UserPoolCognitoUserPoolEmailChangeRuleE67E708E":{"Type":"AWS::Events::Rule","Properties":{"EventPattern":{"source":["aws.cognito-idp"],"detail-type":["AWS API Call via CloudTrail"],"detail":{"eventSource":["cognito-idp.amazonaws.com"],"eventName":["AdminUpdateUserAttributes"],"requestParameters":{"userPoolId":[{"Ref":"UserPool6D0DFADB"}]}}},"State":"ENABLED","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Targets":[{"Arn":{"Fn::GetAtt":["UserPoolProfileEmailChangeHandlerDC3D1702","Arn"]},"Id":"Target0"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoUserPoolEmailChangeRule/Resource"}},"UserPoolCognitoUserPoolEmailChangeRuleAllowEventRuledeepraceronawsUserPoolProfileEmailChangeHandler17F67E7D0BA4FCEE":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["UserPoolProfileEmailChangeHandlerDC3D1702","Arn"]},"Principal":"events.amazonaws.com","SourceArn":{"Fn::GetAtt":["UserPoolCognitoUserPoolEmailChangeRuleE67E708E","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/CognitoUserPoolEmailChangeRule/AllowEventRuledeepraceronawsUserPoolProfileEmailChangeHandler17F67E7D"}},"UserPoolEmailTemplateSyncHandlerServiceRole37B433AC":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/EmailTemplateSyncHandler/ServiceRole/Resource"}},"UserPoolEmailTemplateSyncHandlerServiceRoleDefaultPolicyE0CD50A9":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["cognito-idp:UpdateUserPool","cognito-idp:DescribeUserPool","cognito-idp:AdminCreateUser","cognito-idp:AdminGetUser","cognito-idp:ListUsers","cloudformation:DescribeStacks"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":cloudformation:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":stack/deepracer-on-aws/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UserPoolEmailTemplateSyncHandlerServiceRoleDefaultPolicyE0CD50A9","Roles":[{"Ref":"UserPoolEmailTemplateSyncHandlerServiceRole37B433AC"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/EmailTemplateSyncHandler/ServiceRole/DefaultPolicy/Resource"}},"UserPoolEmailTemplateSyncHandler88905103":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset938801a5d68f08d757a76039d960c38d47035a9e80d43e03265155b16f977f6d.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","USER_POOL_ID":{"Ref":"UserPool6D0DFADB"},"ADMIN_EMAIL":{"Ref":"AdminEmail"}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-EmailTemplateSyncHandler"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"MemorySize":512,"Role":{"Fn::GetAtt":["UserPoolEmailTemplateSyncHandlerServiceRole37B433AC","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UserPoolEmailTemplateSyncHandlerServiceRoleDefaultPolicyE0CD50A9","UserPoolEmailTemplateSyncHandlerServiceRole37B433AC"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/EmailTemplateSyncHandler/Resource","aws:asset:path":"asset.938801a5d68f08d757a76039d960c38d47035a9e80d43e03265155b16f977f6d","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRole10F03A52":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UpdateEmailTemplateWithUrlProvider/framework-onEvent/ServiceRole/Resource"}},"UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRoleDefaultPolicy0312172F":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["UserPoolEmailTemplateSyncHandler88905103","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["UserPoolEmailTemplateSyncHandler88905103","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["UserPoolEmailTemplateSyncHandler88905103","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRoleDefaultPolicy0312172F","Roles":[{"Ref":"UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRole10F03A52"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UpdateEmailTemplateWithUrlProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventCE62CA1D":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/UserPool/UpdateEmailTemplateWithUrlProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["UserPoolEmailTemplateSyncHandler88905103","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"Role":{"Fn::GetAtt":["UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRole10F03A52","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRoleDefaultPolicy0312172F","UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventServiceRole10F03A52"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UpdateEmailTemplateWithUrlProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UserPoolUpdateEmailTemplateWithUrlB361E767":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["UserPoolUpdateEmailTemplateWithUrlProviderframeworkonEventCE62CA1D","Arn"]},"websiteUrl":{"Fn::If":["HasCustomDomain",{"Ref":"CustomDomain"},{"Fn::Join":["",["https://",{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C","DomainName"]}]]}]},"stackName":"deepracer-on-aws","forceUpdate":"1789414585062"},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/UserPool/UpdateEmailTemplateWithUrl/Default"}},"DeepRacerUserIdentityLogGroup1631EFAE":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"Namespace"},"-DeepRacerUserIdentity"]]},"RetentionInDays":3653,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DeepRacerUserIdentityLogGroup/Resource"}},"ApiStackNestedStackApiStackNestedStackResource56E3B9D0":{"Type":"AWS::CloudFormation::Stack","Properties":{"Parameters":{"referencetodeepraceronawsNamespaceCB5FC4A9Ref":{"Ref":"Namespace"},"referencetodeepraceronawsDynamoDBTable5BE2F721Arn":{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"referencetodeepraceronawsS3BucketModelStorageBucket0B4C0A17Arn":{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"referencetodeepraceronawsUserPoolD1EE740DArn":{"Fn::GetAtt":["UserPool6D0DFADB","Arn"]},"referencetodeepraceronawsLiveRaceWorkflowLiveRaceStateMachine0E3D91D7Name":{"Fn::GetAtt":["LiveRaceWorkflowLiveRaceStateMachine048BF309","Name"]},"referencetodeepraceronawsS3BucketModelStorageBucket0B4C0A17Ref":{"Ref":"S3BucketModelStorageBucket01547CCF"},"referencetodeepraceronawsGlobalSettingsApplicationBA8B1EBDApplicationId":{"Fn::GetAtt":["GlobalSettingsApplicationF700C2F1","ApplicationId"]},"referencetodeepraceronawsGlobalSettingsEnvironmentF7EEEAA4EnvironmentId":{"Fn::GetAtt":["GlobalSettingsEnvironment0C8D83D6","EnvironmentId"]},"referencetodeepraceronawsGlobalSettingsConfigurationProfileFFFB87F8ConfigurationProfileId":{"Fn::GetAtt":["GlobalSettingsConfigurationProfile385EEC94","ConfigurationProfileId"]},"referencetodeepraceronawsGlobalSettingsDeploymentStrategy17682AB1Id":{"Fn::GetAtt":["GlobalSettingsDeploymentStrategyEEDE25EB","Id"]},"referencetodeepraceronawsUserPoolD1EE740DRef":{"Ref":"UserPool6D0DFADB"},"referencetodeepraceronawsS3BucketVirtualModelBucket59112BEBArn":{"Fn::GetAtt":["S3BucketVirtualModelBucketE3ACD733","Arn"]},"referencetodeepraceronawsS3BucketUploadBucketB32E1B71Arn":{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","Arn"]},"referencetodeepraceronawsLiveRaceWorkflowLiveRaceStateMachine0E3D91D7Ref":{"Ref":"LiveRaceWorkflowLiveRaceStateMachine048BF309"},"referencetodeepraceronawsS3BucketVirtualModelBucket59112BEBRef":{"Ref":"S3BucketVirtualModelBucketE3ACD733"},"referencetodeepraceronawsEcrNestedStackEcrNestedStackResourceAC5C6175OutputsdeepraceronawsEcrEcrRepo1RepositoryA36776ABArn":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo1RepositoryA36776ABArn"]},"referencetodeepraceronawsEcrNestedStackEcrNestedStackResourceAC5C6175OutputsdeepraceronawsEcrEcrRepo1RepositoryA36776ABRef":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo1RepositoryA36776ABRef"]},"referencetodeepraceronawsVpcuserExecutionVpcprivateSubnet1Subnet45B3F2C6Ref":{"Ref":"VpcuserExecutionVpcprivateSubnet1SubnetD75F691E"},"referencetodeepraceronawsVpcuserExecutionVpcprivateSubnet2Subnet46E4A5F5Ref":{"Ref":"VpcuserExecutionVpcprivateSubnet2Subnet142EA691"},"referencetodeepraceronawsVpcuserExecutionSecurityGroupA5FF3084GroupId":{"Fn::GetAtt":["VpcuserExecutionSecurityGroupD815F9BC","GroupId"]},"referencetodeepraceronawsEcrNestedStackEcrNestedStackResourceAC5C6175OutputsdeepraceronawsEcrEcrRepo2RepositoryAAE606C9Arn":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo2RepositoryAAE606C9Arn"]},"referencetodeepraceronawsEcrNestedStackEcrNestedStackResourceAC5C6175OutputsdeepraceronawsEcrEcrRepo2RepositoryAAE606C9Ref":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo2RepositoryAAE606C9Ref"]},"referencetodeepraceronawsDynamoDBTable5BE2F721Ref":{"Ref":"DynamoDBTable7400F6BB"},"referencetodeepraceronawsEcrNestedStackEcrNestedStackResourceAC5C6175OutputsdeepraceronawsEcrDeepRacerCMK1FB00512Arn":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]}},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"TemplateURL":{"Fn::Join":["",["https://",{"Fn::Sub":"solutions-${AWS::Region}"},".s3.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/deepracer-on-aws/v1.2.11/deepraceronawsApiStack80305628.nested.template"]]}},"DependsOn":["EcrNestedStackEcrNestedStackResourceD4475E64","VpcuserExecutionVpcprivateSubnet1RouteTableAssociation58E053E1","VpcuserExecutionVpcprivateSubnet2RouteTableAssociationD4C2D580"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/ApiStack.NestedStack/ApiStack.NestedStackResource","aws:asset:path":"deepracer-on-aws/v1.2.11/deepraceronawsApiStack80305628.nested.template","aws:asset:property":"TemplateURL"}},"SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRole349D6CA4":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckFunction/ServiceRole/Resource"},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRoleDefaultPolicy0CAD0DE1":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"ses:GetAccount","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRoleDefaultPolicy0CAD0DE1","Roles":[{"Ref":"SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRole349D6CA4"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckFunction/ServiceRole/DefaultPolicy/Resource"},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckFunction0BB1F1D2":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetf0e335d45e2244aee8ac48e35969b161edd363c0e679996f65a1681234482f0c.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-SesProductionAccessCheck"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRole349D6CA4","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRoleDefaultPolicy0CAD0DE1","SesProductionAccessCheckSesProductionAccessCheckFunctionServiceRole349D6CA4"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckFunction/Resource","aws:asset:path":"asset.f0e335d45e2244aee8ac48e35969b161edd363c0e679996f65a1681234482f0c","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRole9DE0A0B1":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckProvider/framework-onEvent/ServiceRole/Resource"},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRoleDefaultPolicy2FA84AD6":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckFunction0BB1F1D2","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckFunction0BB1F1D2","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckFunction0BB1F1D2","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRoleDefaultPolicy2FA84AD6","Roles":[{"Ref":"SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRole9DE0A0B1"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEvent2A43D085":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckFunction0BB1F1D2","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRole9DE0A0B1","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRoleDefaultPolicy2FA84AD6","SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEventServiceRole9DE0A0B1"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}},"Condition":"IsSesEnabled"},"SesProductionAccessCheckSesProductionAccessCheckResource7A984AB4":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["SesProductionAccessCheckSesProductionAccessCheckProviderframeworkonEvent2A43D085","Arn"]},"emailDeliveryMethod":{"Ref":"EmailDeliveryMethod"},"sesVerifiedEmail":{"Ref":"SesVerifiedEmail"},"forceUpdate":"1789414568095"},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/SesProductionAccessCheck/SesProductionAccessCheckResource/Default"},"Condition":"IsSesEnabled"},"EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRole50EC2E3D":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodChangeFunction/ServiceRole/Resource"}},"EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRoleDefaultPolicy5CDAE23A":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRoleDefaultPolicy5CDAE23A","Roles":[{"Ref":"EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRole50EC2E3D"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodChangeFunction/ServiceRole/DefaultPolicy/Resource"}},"EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionA52FB1E6":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetd0f905aa9d7675c9d367b3ac0a0ec96840f1089cba2d22252616e4dca3e4d66e.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-EmailDeliveryMethodAudit"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRole50EC2E3D","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":10,"TracingConfig":{"Mode":"Active"}},"DependsOn":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRoleDefaultPolicy5CDAE23A","EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionServiceRole50EC2E3D"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodChangeFunction/Resource","aws:asset:path":"asset.d0f905aa9d7675c9d367b3ac0a0ec96840f1089cba2d22252616e4dca3e4d66e","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRole550AE16C":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodAuditProvider/framework-onEvent/ServiceRole/Resource"}},"EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRoleDefaultPolicy9A5DBF06":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionA52FB1E6","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionA52FB1E6","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionA52FB1E6","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRoleDefaultPolicy9A5DBF06","Roles":[{"Ref":"EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRole550AE16C"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodAuditProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEvent68B4895D":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodAuditProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodChangeFunctionA52FB1E6","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRole550AE16C","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRoleDefaultPolicy9A5DBF06","EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEventServiceRole550AE16C"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodAuditProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"EmailDeliveryMethodAuditEmailDeliveryMethodAuditResource45653C1F":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["EmailDeliveryMethodAuditEmailDeliveryMethodAuditProviderframeworkonEvent68B4895D","Arn"]},"emailDeliveryMethod":{"Ref":"EmailDeliveryMethod"},"sesVerifiedEmail":{"Ref":"SesVerifiedEmail"},"forceUpdate":"1789414569163"},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/EmailDeliveryMethodAudit/EmailDeliveryMethodAuditResource/Default"}},"WorkflowSageMakerRole27179619":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"sagemaker.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/SageMakerRole/Resource"}},"WorkflowSageMakerRoleDefaultPolicy8F135E52":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"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":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"WorkflowSageMakerRoleDefaultPolicy8F135E52","Roles":[{"Ref":"WorkflowSageMakerRole27179619"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/SageMakerRole/DefaultPolicy/Resource"}},"WorkflowSageMakerAccessPolicy9F49D7B1":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"sagemaker:*TrainingJob*","Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:sagemaker:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":training-job/deepracerindy-*"]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Ref":"Namespace"},"-deepracer-on-aws-*"]]}},{"Action":["kinesisvideo:DescribeStream","kinesisvideo:GetDataEndpoint","kinesisvideo:PutMedia"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:kinesisvideo:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":stream/deepracerindy-*"]]}},{"Action":"cloudwatch:PutMetricData","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:DescribeLogStreams","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/sagemaker/TrainingJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/sagemaker/TrainingJobs:log-stream:*"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/TrainingJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/TrainingJobs:log-stream:*"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/SimulationJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/SimulationJobs:log-stream:*"]]}]},{"Action":["ec2:CreateNetworkInterface","ec2:CreateNetworkInterfacePermission","ec2:DeleteNetworkInterface","ec2:DeleteNetworkInterfacePermission","ec2:DescribeDhcpOptions","ec2:DescribeNetworkInterfaces","ec2:DescribeSecurityGroups","ec2:DescribeSubnets","ec2:DescribeVpcs"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"WorkflowSageMakerAccessPolicy9F49D7B1","Roles":[{"Ref":"WorkflowSageMakerRole27179619"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/SageMakerAccessPolicy/Resource"}},"WorkflowJobInitializerFunctionServiceRole37DEE0E6":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobInitializerFunction/ServiceRole/Resource"}},"WorkflowJobInitializerFunctionServiceRoleDefaultPolicy13C4B0A6":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"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":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]},{"Action":"kinesisvideo:CreateStream","Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:kinesisvideo:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":stream/deepracerindy-*"]]}},{"Action":"sagemaker:CreateTrainingJob","Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:sagemaker:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":training-job/deepracerindy-*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":{"Fn::GetAtt":["WorkflowSageMakerRole27179619","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobInitializerFunctionServiceRoleDefaultPolicy13C4B0A6","Roles":[{"Ref":"WorkflowJobInitializerFunctionServiceRole37DEE0E6"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobInitializerFunction/ServiceRole/DefaultPolicy/Resource"}},"WorkflowJobInitializerFunction74C9D7B8":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetc0a0df5ccd6312f0124a939c35485930dc34b8ba17d3520ab1a7bb27e53bae39.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndyWorkflow","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","MODEL_DATA_BUCKET_NAME":{"Ref":"S3BucketModelStorageBucket01547CCF"},"SAGEMAKER_ROLE_ARN":{"Fn::GetAtt":["WorkflowSageMakerRole27179619","Arn"]},"SAGEMAKER_TRAINING_IMAGE":{"Fn::Join":["",[{"Fn::Select":[4,{"Fn::Split":[":",{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo0RepositoryAC9EE669Arn"]}]}]},".dkr.ecr.",{"Fn::Select":[3,{"Fn::Split":[":",{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo0RepositoryAC9EE669Arn"]}]}]},".",{"Ref":"AWS::URLSuffix"},"/",{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrEcrRepo0RepositoryAC9EE669Ref"]},":v1.2.11"]]},"SAGEMAKER_INSTANCE_TYPE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyWorkflow-JobInitializerFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerTrainingLogGroup803B7F5E"}},"MemorySize":512,"Role":{"Fn::GetAtt":["WorkflowJobInitializerFunctionServiceRole37DEE0E6","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["WorkflowJobInitializerFunctionServiceRoleDefaultPolicy13C4B0A6","WorkflowJobInitializerFunctionServiceRole37DEE0E6"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobInitializerFunction/Resource","aws:asset:path":"asset.c0a0df5ccd6312f0124a939c35485930dc34b8ba17d3520ab1a7bb27e53bae39","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WorkflowJobMonitorFunctionServiceRoleB23773CC":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobMonitorFunction/ServiceRole/Resource"}},"WorkflowJobMonitorFunctionServiceRoleDefaultPolicy34205F6B":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"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":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]},{"Action":["sagemaker:DescribeTrainingJob","sagemaker:StopTrainingJob"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:sagemaker:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":training-job/deepracerindy-*"]]}},{"Action":["kinesisvideo:GetDataEndpoint","kinesisvideo:GetHLSStreamingSessionURL"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:kinesisvideo:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":stream/deepracerindy-*"]]}}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobMonitorFunctionServiceRoleDefaultPolicy34205F6B","Roles":[{"Ref":"WorkflowJobMonitorFunctionServiceRoleB23773CC"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobMonitorFunction/ServiceRole/DefaultPolicy/Resource"}},"WorkflowJobMonitorFunction06625369":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset791f3188fd13a839d0fd88622f077d330aa1ca60d6f5dab3434f0fdf451fcede.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndyWorkflow","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","MODEL_DATA_BUCKET_NAME":{"Ref":"S3BucketModelStorageBucket01547CCF"}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyWorkflow-JobMonitorFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerTrainingLogGroup803B7F5E"}},"MemorySize":512,"Role":{"Fn::GetAtt":["WorkflowJobMonitorFunctionServiceRoleB23773CC","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["WorkflowJobMonitorFunctionServiceRoleDefaultPolicy34205F6B","WorkflowJobMonitorFunctionServiceRoleB23773CC"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobMonitorFunction/Resource","aws:asset:path":"asset.791f3188fd13a839d0fd88622f077d330aa1ca60d6f5dab3434f0fdf451fcede","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WorkflowJobFinalizerFunctionServiceRole1563BB03":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobFinalizerFunction/ServiceRole/Resource"}},"WorkflowJobFinalizerFunctionServiceRoleDefaultPolicy861573E9":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"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":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]},{"Action":"kinesisVideo:DeleteStream","Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:kinesisvideo:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":stream/deepracerindy-*"]]}},{"Action":["logs:DescribeLogGroups","logs:DescribeLogStreams","logs:GetLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/sagemaker/TrainingJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/sagemaker/TrainingJobs:log-stream:*"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/TrainingJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/TrainingJobs:log-stream:*"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/SimulationJobs"]]},{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/deepracer/training/SimulationJobs:log-stream:*"]]}]},{"Action":["sagemaker:DescribeTrainingJob","sagemaker:StopTrainingJob"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:aws:sagemaker:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":training-job/deepracerindy-*"]]}}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobFinalizerFunctionServiceRoleDefaultPolicy861573E9","Roles":[{"Ref":"WorkflowJobFinalizerFunctionServiceRole1563BB03"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobFinalizerFunction/ServiceRole/DefaultPolicy/Resource"}},"WorkflowJobFinalizerFunctionFF3C37AE":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset7fadeca599037529281d16ea211d61f10fee6212e3fea18ab4d8fdc8ea049442.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndyWorkflow","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","MODEL_DATA_BUCKET_NAME":{"Ref":"S3BucketModelStorageBucket01547CCF"}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyWorkflow-JobFinalizerFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerTrainingLogGroup803B7F5E"}},"MemorySize":512,"Role":{"Fn::GetAtt":["WorkflowJobFinalizerFunctionServiceRole1563BB03","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900,"TracingConfig":{"Mode":"Active"}},"DependsOn":["WorkflowJobFinalizerFunctionServiceRoleDefaultPolicy861573E9","WorkflowJobFinalizerFunctionServiceRole1563BB03"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobFinalizerFunction/Resource","aws:asset:path":"asset.7fadeca599037529281d16ea211d61f10fee6212e3fea18ab4d8fdc8ea049442","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WorkflowExecutionLogsE67184FE":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/vendedlogs/states/",{"Ref":"Namespace"},"-DeepRacerIndyWorkflow"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/ExecutionLogs/Resource"}},"WorkflowStateMachineRoleAB27BF0D":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"states.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/StateMachine/Role/Resource"}},"WorkflowStateMachineRoleDefaultPolicyB2EAF58E":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","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":"*"},{"Action":["kms:Decrypt","kms:Encrypt","kms:ReEncrypt*","kms:GenerateDataKey*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]}}],"Version":"2012-10-17"},"PolicyName":"WorkflowStateMachineRoleDefaultPolicyB2EAF58E","Roles":[{"Ref":"WorkflowStateMachineRoleAB27BF0D"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/StateMachine/Role/DefaultPolicy/Resource"}},"WorkflowStateMachine8F1B1C15":{"Type":"AWS::StepFunctions::StateMachine","Properties":{"DefinitionString":{"Fn::Join":["",["{\"StartAt\":\"Job Initializer\",\"States\":{\"Job Initializer\":{\"Next\":\"Job Monitor\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"Job Finalizer\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},"\",\"Payload.$\":\"$\"}},\"Job Monitor\":{\"Next\":\"Job running?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"Job Finalizer\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},"\",\"Payload.$\":\"$\"}},\"Wait while job runs\":{\"Type\":\"Wait\",\"Seconds\":60,\"Next\":\"Job Monitor\"},\"Job running?\":{\"Type\":\"Choice\",\"Choices\":[{\"Or\":[{\"Variable\":\"$.trainingJob.status\",\"StringEquals\":\"InProgress\"},{\"Variable\":\"$.trainingJob.status\",\"StringEquals\":\"Stopping\"}],\"Next\":\"Wait while job runs\"}],\"Default\":\"Job Finalizer\"},\"Job Finalizer\":{\"Next\":\"Workflow completed successfully?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"Next\":\"Job failed\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","Arn"]},"\",\"Payload.$\":\"$\"}},\"Workflow completed successfully?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.errorDetails\",\"IsPresent\":true,\"Next\":\"Job failed\"}],\"Default\":\"Job succeeded\"},\"Job succeeded\":{\"Type\":\"Succeed\"},\"Job failed\":{\"Type\":\"Fail\"}}}"]]},"LoggingConfiguration":{"Destinations":[{"CloudWatchLogsLogGroup":{"LogGroupArn":{"Fn::GetAtt":["WorkflowExecutionLogsE67184FE","Arn"]}}}],"IncludeExecutionData":true,"Level":"ALL"},"RoleArn":{"Fn::GetAtt":["WorkflowStateMachineRoleAB27BF0D","Arn"]},"StateMachineName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyWorkflow"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"TracingConfiguration":{"Enabled":true}},"DependsOn":["WorkflowStateMachineRoleDefaultPolicyB2EAF58E","WorkflowStateMachineRoleAB27BF0D"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/StateMachine/Resource"}},"WorkflowJobDispatcherFunctionRole0400E762":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherFunctionRole/Resource"}},"WorkflowJobDispatcherFunctionRoleDefaultPolicyD1316F84":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["sqs:ReceiveMessage","sqs:ChangeMessageVisibility","sqs:GetQueueUrl","sqs:DeleteMessage","sqs:GetQueueAttributes"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CArn"]}},{"Action":["sqs:SendMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CArn"]}}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobDispatcherFunctionRoleDefaultPolicyD1316F84","Roles":[{"Ref":"WorkflowJobDispatcherFunctionRole0400E762"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherFunctionRole/DefaultPolicy/Resource"}},"WorkflowJobDispatcherSageMakerPolicyB44FEC00":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"sagemaker:ListTrainingJobs","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobDispatcherSageMakerPolicyB44FEC00","Roles":[{"Ref":"WorkflowJobDispatcherFunctionRole0400E762"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherSageMakerPolicy/Resource"}},"WorkflowJobDispatcherServiceQuotasPolicyF865BDE6":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"servicequotas:GetServiceQuota","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobDispatcherServiceQuotasPolicyF865BDE6","Roles":[{"Ref":"WorkflowJobDispatcherFunctionRole0400E762"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherServiceQuotasPolicy/Resource"}},"WorkflowJobDispatcherStepFunctionPolicy5A338432":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"states:StartExecution","Effect":"Allow","Resource":{"Ref":"WorkflowStateMachine8F1B1C15"}}],"Version":"2012-10-17"},"PolicyName":"WorkflowJobDispatcherStepFunctionPolicy5A338432","Roles":[{"Ref":"WorkflowJobDispatcherFunctionRole0400E762"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherStepFunctionPolicy/Resource"}},"WorkflowJobDispatcherFunction925E9E8A":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset9868f352058dc96cd465be637a59967581a67898a557b946bc874deeb93943e2.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndyWorkflow","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","MODEL_DATA_BUCKET_NAME":{"Ref":"S3BucketModelStorageBucket01547CCF"},"WORKFLOW_STATE_MACHINE_ARN":{"Ref":"WorkflowStateMachine8F1B1C15"},"WORKFLOW_JOB_QUEUE_URL":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CRef"]}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyWorkflow-JobDispatcherFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerTrainingLogGroup803B7F5E"}},"MemorySize":256,"Role":{"Fn::GetAtt":["WorkflowJobDispatcherFunctionRole0400E762","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["WorkflowJobDispatcherFunctionRoleDefaultPolicyD1316F84","WorkflowJobDispatcherFunctionRole0400E762"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherFunction/Resource","aws:asset:path":"asset.9868f352058dc96cd465be637a59967581a67898a557b946bc874deeb93943e2","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WorkflowJobDispatcherFunctionSqsEventSourcedeepraceronawsApiStackApiWorkflowJobQueue1A8F51CC4923C432":{"Type":"AWS::Lambda::EventSourceMapping","Properties":{"BatchSize":1,"EventSourceArn":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CArn"]},"FunctionName":{"Ref":"WorkflowJobDispatcherFunction925E9E8A"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Workflow/JobDispatcherFunction/SqsEventSource:deepraceronawsApiStackApiWorkflowJobQueue1A8F51CC/Resource"}},"DeepRacerTrainingLogGroup803B7F5E":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"Namespace"},"-DeepRacerTraining"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DeepRacerTrainingLogGroup/Resource"}},"LiveRaceWorkflowGetNextPendingFunctionServiceRoleE56A1FB2":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/GetNextPendingFunction/ServiceRole/Resource"}},"LiveRaceWorkflowGetNextPendingFunctionServiceRoleDefaultPolicyD79E7C72":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["dynamodb:BatchGetItem","dynamodb:Query","dynamodb:GetItem","dynamodb:Scan","dynamodb:ConditionCheckItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowGetNextPendingFunctionServiceRoleDefaultPolicyD79E7C72","Roles":[{"Ref":"LiveRaceWorkflowGetNextPendingFunctionServiceRoleE56A1FB2"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/GetNextPendingFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowGetNextPendingFunction2C724408":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetd9c111744fa264c03e489c76ade62c2c06489a86104856a272c57efea7bfd3ef.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-GetNextPendingFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowGetNextPendingFunctionServiceRoleE56A1FB2","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowGetNextPendingFunctionServiceRoleDefaultPolicyD79E7C72","LiveRaceWorkflowGetNextPendingFunctionServiceRoleE56A1FB2"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/GetNextPendingFunction/Resource","aws:asset:path":"asset.d9c111744fa264c03e489c76ade62c2c06489a86104856a272c57efea7bfd3ef","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowCheckAutolaunchFunctionServiceRole2A0396E6":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/CheckAutolaunchFunction/ServiceRole/Resource"}},"LiveRaceWorkflowCheckAutolaunchFunctionServiceRoleDefaultPolicyF04743D2":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["dynamodb:BatchGetItem","dynamodb:Query","dynamodb:GetItem","dynamodb:Scan","dynamodb:ConditionCheckItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowCheckAutolaunchFunctionServiceRoleDefaultPolicyF04743D2","Roles":[{"Ref":"LiveRaceWorkflowCheckAutolaunchFunctionServiceRole2A0396E6"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/CheckAutolaunchFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowCheckAutolaunchFunctionCC6F5582":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset09f7eef6c91e5c0d6438667c3a7e7e0d064cc0fdf686e48bd32f9f83435e1b0b.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-CheckAutolaunchFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowCheckAutolaunchFunctionServiceRole2A0396E6","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowCheckAutolaunchFunctionServiceRoleDefaultPolicyF04743D2","LiveRaceWorkflowCheckAutolaunchFunctionServiceRole2A0396E6"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/CheckAutolaunchFunction/Resource","aws:asset:path":"asset.09f7eef6c91e5c0d6438667c3a7e7e0d064cc0fdf686e48bd32f9f83435e1b0b","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowUpdateQueueStatusFunctionServiceRole3263C709":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/UpdateQueueStatusFunction/ServiceRole/Resource"}},"LiveRaceWorkflowUpdateQueueStatusFunctionServiceRoleDefaultPolicyC03201E2":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowUpdateQueueStatusFunctionServiceRoleDefaultPolicyC03201E2","Roles":[{"Ref":"LiveRaceWorkflowUpdateQueueStatusFunctionServiceRole3263C709"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/UpdateQueueStatusFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asseta3430741337ef9f96eb97a66afed339973b2a3615419f5d37864c14ae879022d.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-UpdateQueueStatusFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionServiceRole3263C709","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowUpdateQueueStatusFunctionServiceRoleDefaultPolicyC03201E2","LiveRaceWorkflowUpdateQueueStatusFunctionServiceRole3263C709"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/UpdateQueueStatusFunction/Resource","aws:asset:path":"asset.a3430741337ef9f96eb97a66afed339973b2a3615419f5d37864c14ae879022d","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowClearExecutionLockFunctionServiceRole9AF4308F":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/ClearExecutionLockFunction/ServiceRole/Resource"}},"LiveRaceWorkflowClearExecutionLockFunctionServiceRoleDefaultPolicyE7CF03B8":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowClearExecutionLockFunctionServiceRoleDefaultPolicyE7CF03B8","Roles":[{"Ref":"LiveRaceWorkflowClearExecutionLockFunctionServiceRole9AF4308F"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/ClearExecutionLockFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowClearExecutionLockFunction719F47EC":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset2df8daf3bea913102e8b3537566825da967153ab0b1ce10353d8ecccf35d27c7.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-ClearExecutionLockFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowClearExecutionLockFunctionServiceRole9AF4308F","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowClearExecutionLockFunctionServiceRoleDefaultPolicyE7CF03B8","LiveRaceWorkflowClearExecutionLockFunctionServiceRole9AF4308F"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/ClearExecutionLockFunction/Resource","aws:asset:path":"asset.2df8daf3bea913102e8b3537566825da967153ab0b1ce10353d8ecccf35d27c7","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowLiveRaceExecutionLogsCB7611CB":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/vendedlogs/states/",{"Ref":"Namespace"},"-LiveRaceWorkflow"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/LiveRaceExecutionLogs/Resource"}},"LiveRaceWorkflowLiveRaceStateMachineRole6A27D7D5":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"states.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/LiveRaceStateMachine/Role/Resource"}},"LiveRaceWorkflowLiveRaceStateMachineRoleDefaultPolicy0FDF4C8F":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceWorkflowGetNextPendingFunction2C724408","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceWorkflowGetNextPendingFunction2C724408","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceWorkflowCheckAutolaunchFunctionCC6F5582","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceWorkflowCheckAutolaunchFunctionCC6F5582","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceWorkflowClearExecutionLockFunction719F47EC","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceWorkflowClearExecutionLockFunction719F47EC","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":"*"},{"Action":["kms:Decrypt","kms:Encrypt","kms:ReEncrypt*","kms:GenerateDataKey*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowLiveRaceStateMachineRoleDefaultPolicy0FDF4C8F","Roles":[{"Ref":"LiveRaceWorkflowLiveRaceStateMachineRole6A27D7D5"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/LiveRaceStateMachine/Role/DefaultPolicy/Resource"}},"LiveRaceWorkflowLiveRaceStateMachine048BF309":{"Type":"AWS::StepFunctions::StateMachine","Properties":{"DefinitionString":{"Fn::Join":["",["{\"StartAt\":\"InitializeCounter\",\"States\":{\"InitializeCounter\":{\"Type\":\"Pass\",\"Result\":0,\"ResultPath\":\"$.modelsProcessed\",\"Next\":\"GetNextPending\"},\"GetNextPending\":{\"Next\":\"Queue empty?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"ClearLockOnError\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowGetNextPendingFunction2C724408","Arn"]},"\",\"Payload.$\":\"$\"}},\"Queue empty?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.queueEmpty\",\"BooleanEquals\":true,\"Next\":\"ClearExecutionLock\"}],\"Default\":\"SetInProgress\"},\"SetInProgress\":{\"Next\":\"LiveRace JobInitializer\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.TaskFailed\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"CheckAutolaunch\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF","Arn"]},"\",\"Payload\":{\"context.$\":\"$\",\"status\":\"IN_PROGRESS\",\"expectedStatus\":\"PENDING\"}}},\"LiveRace JobInitializer\":{\"Next\":\"LiveRace JobMonitor\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"LiveRace JobFinalizer\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobInitializerFunction74C9D7B8","Arn"]},"\",\"Payload.$\":\"$\"}},\"LiveRace JobMonitor\":{\"Next\":\"Evaluation done?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"LiveRace JobFinalizer\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobMonitorFunction06625369","Arn"]},"\",\"Payload.$\":\"$\"}},\"Wait for evaluation\":{\"Type\":\"Wait\",\"Seconds\":30,\"Next\":\"LiveRace JobMonitor\"},\"Evaluation done?\":{\"Type\":\"Choice\",\"Choices\":[{\"Or\":[{\"Variable\":\"$.trainingJob.status\",\"StringEquals\":\"InProgress\"},{\"Variable\":\"$.trainingJob.status\",\"StringEquals\":\"Stopping\"}],\"Next\":\"Wait for evaluation\"}],\"Default\":\"LiveRace JobFinalizer\"},\"LiveRace JobFinalizer\":{\"Next\":\"Job failed?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"SetFailed\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["WorkflowJobFinalizerFunctionFF3C37AE","Arn"]},"\",\"Payload.$\":\"$\"}},\"Job failed?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.jobStatus\",\"StringEquals\":\"FAILED\",\"Next\":\"SetFailed\"}],\"Default\":\"SetCompleted\"},\"SetCompleted\":{\"Next\":\"CheckAutolaunch\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.TaskFailed\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"CheckAutolaunch\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF","Arn"]},"\",\"Payload\":{\"context.$\":\"$\",\"status\":\"COMPLETED\",\"expectedStatus\":\"IN_PROGRESS\"}}},\"CheckAutolaunch\":{\"Next\":\"Continue loop?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.errorDetails\",\"Next\":\"ClearLockOnError\"}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowCheckAutolaunchFunctionCC6F5582","Arn"]},"\",\"Payload.$\":\"$\"}},\"SetFailed\":{\"Next\":\"CheckAutolaunch\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowUpdateQueueStatusFunctionD5346FAF","Arn"]},"\",\"Payload\":{\"context.$\":\"$\",\"status\":\"FAILED\",\"expectedStatus\":\"IN_PROGRESS\"}}},\"Continue loop?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.continueLoop\",\"BooleanEquals\":false,\"Next\":\"ClearExecutionLock\"}],\"Default\":\"IncrementCounter\"},\"IncrementCounter\":{\"Type\":\"Pass\",\"Parameters\":{\"leaderboardId.$\":\"$.leaderboardId\",\"modelsProcessed.$\":\"States.MathAdd($.modelsProcessed, 1)\",\"currentSubmissionId.$\":\"$.currentSubmissionId\",\"profileId.$\":\"$.profileId\",\"queueEmpty.$\":\"$.queueEmpty\",\"continueLoop.$\":\"$.continueLoop\"},\"Next\":\"Counter limit reached?\"},\"Counter limit reached?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.modelsProcessed\",\"NumericGreaterThan\":60,\"Next\":\"ClearExecutionLock\"}],\"Default\":\"GetNextPending\"},\"ClearExecutionLock\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowClearExecutionLockFunction719F47EC","Arn"]},"\",\"Payload.$\":\"$\"}},\"ClearLockOnError\":{\"Next\":\"LiveRace Failed\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",{"Fn::GetAtt":["LiveRaceWorkflowClearExecutionLockFunction719F47EC","Arn"]},"\",\"Payload.$\":\"$\"}},\"LiveRace Failed\":{\"Type\":\"Fail\"}}}"]]},"LoggingConfiguration":{"Destinations":[{"CloudWatchLogsLogGroup":{"LogGroupArn":{"Fn::GetAtt":["LiveRaceWorkflowLiveRaceExecutionLogsCB7611CB","Arn"]}}}],"IncludeExecutionData":true,"Level":"ALL"},"RoleArn":{"Fn::GetAtt":["LiveRaceWorkflowLiveRaceStateMachineRole6A27D7D5","Arn"]},"StateMachineName":{"Fn::Join":["",[{"Ref":"Namespace"},"-LiveRaceWorkflow"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"TracingConfiguration":{"Enabled":true}},"DependsOn":["LiveRaceWorkflowLiveRaceStateMachineRoleDefaultPolicy0FDF4C8F","LiveRaceWorkflowLiveRaceStateMachineRole6A27D7D5"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/LiveRaceStateMachine/Resource"}},"LiveRaceWorkflowStreamHandlerDLQ7B087DDB":{"Type":"AWS::SQS::Queue","Properties":{"KmsMasterKeyId":"alias/aws/sqs","QueueName":{"Fn::Join":["",[{"Ref":"Namespace"},"-LiveRaceStreamDLQ"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamHandlerDLQ/Resource"}},"LiveRaceWorkflowStreamHandlerDLQPolicyCB56B87D":{"Type":"AWS::SQS::QueuePolicy","Properties":{"PolicyDocument":{"Statement":[{"Action":"sqs:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":{"Fn::GetAtt":["LiveRaceWorkflowStreamHandlerDLQ7B087DDB","Arn"]}}],"Version":"2012-10-17"},"Queues":[{"Ref":"LiveRaceWorkflowStreamHandlerDLQ7B087DDB"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamHandlerDLQ/Policy/Resource"}},"LiveRaceWorkflowStreamHandlerFunctionServiceRole391A99A1":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamHandlerFunction/ServiceRole/Resource"}},"LiveRaceWorkflowStreamHandlerFunctionServiceRoleDefaultPolicy00B6EE10":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":"states:StartExecution","Effect":"Allow","Resource":{"Ref":"LiveRaceWorkflowLiveRaceStateMachine048BF309"}},{"Action":"dynamodb:ListStreams","Effect":"Allow","Resource":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]}},{"Action":["dynamodb:DescribeStream","dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]}},{"Action":["sqs:SendMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl"],"Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceWorkflowStreamHandlerDLQ7B087DDB","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowStreamHandlerFunctionServiceRoleDefaultPolicy00B6EE10","Roles":[{"Ref":"LiveRaceWorkflowStreamHandlerFunctionServiceRole391A99A1"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamHandlerFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowStreamHandlerFunction1C2A6EFA":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset22714a61fa7c01ea2a4a428c3d79e31f82a1ce65ce1a1f8c003a961ce0cab2c7.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","LIVE_RACE_STATE_MACHINE_ARN":{"Ref":"LiveRaceWorkflowLiveRaceStateMachine048BF309"}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-StreamHandlerFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowStreamHandlerFunctionServiceRole391A99A1","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowStreamHandlerFunctionServiceRoleDefaultPolicy00B6EE10","LiveRaceWorkflowStreamHandlerFunctionServiceRole391A99A1"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamHandlerFunction/Resource","aws:asset:path":"asset.22714a61fa7c01ea2a4a428c3d79e31f82a1ce65ce1a1f8c003a961ce0cab2c7","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowStreamEventSourceECE886E6":{"Type":"AWS::Lambda::EventSourceMapping","Properties":{"BisectBatchOnFunctionError":true,"DestinationConfig":{"OnFailure":{"Destination":{"Fn::GetAtt":["LiveRaceWorkflowStreamHandlerDLQ7B087DDB","Arn"]}}},"EventSourceArn":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]},"FilterCriteria":{"Filters":[{"Pattern":"{\"eventName\":[\"INSERT\",\"MODIFY\"],\"dynamodb\":{\"Keys\":{\"pk\":{\"S\":[{\"suffix\":\"#livequeueitem\"}]}}}}"}]},"FunctionName":{"Ref":"LiveRaceWorkflowStreamHandlerFunction1C2A6EFA"},"MaximumBatchingWindowInSeconds":1,"MaximumRecordAgeInSeconds":300,"MaximumRetryAttempts":3,"StartingPosition":"LATEST","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamEventSource/Resource"}},"LiveRaceWorkflowSafetyNetFunctionServiceRoleAC786990":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/SafetyNetFunction/ServiceRole/Resource"}},"LiveRaceWorkflowSafetyNetFunctionServiceRoleDefaultPolicyC03A7E72":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceWorkflowSafetyNetFunctionServiceRoleDefaultPolicyC03A7E72","Roles":[{"Ref":"LiveRaceWorkflowSafetyNetFunctionServiceRoleAC786990"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/SafetyNetFunction/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceWorkflowSafetyNetFunction98F6CC40":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assetba13762c0de0f703185cbf939b4ac9192f8ed892ce2b521e4a66fb754d1bed61.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerIndyLiveRace-SafetyNetFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceWorkflowSafetyNetFunctionServiceRoleAC786990","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceWorkflowSafetyNetFunctionServiceRoleDefaultPolicyC03A7E72","LiveRaceWorkflowSafetyNetFunctionServiceRoleAC786990"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/SafetyNetFunction/Resource","aws:asset:path":"asset.ba13762c0de0f703185cbf939b4ac9192f8ed892ce2b521e4a66fb754d1bed61","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceWorkflowSFTerminalStateRule08C0B7B2":{"Type":"AWS::Events::Rule","Properties":{"EventPattern":{"source":["aws.states"],"detail-type":["Step Functions Execution Status Change"],"detail":{"stateMachineArn":[{"Ref":"LiveRaceWorkflowLiveRaceStateMachine048BF309"}],"status":["SUCCEEDED","FAILED","ABORTED","TIMED_OUT"]}},"State":"ENABLED","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Targets":[{"Arn":{"Fn::GetAtt":["LiveRaceWorkflowSafetyNetFunction98F6CC40","Arn"]},"Id":"Target0"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/SFTerminalStateRule/Resource"}},"LiveRaceWorkflowSFTerminalStateRuleAllowEventRuledeepraceronawsLiveRaceWorkflowSafetyNetFunction4CD5B6203F404DB5":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["LiveRaceWorkflowSafetyNetFunction98F6CC40","Arn"]},"Principal":"events.amazonaws.com","SourceArn":{"Fn::GetAtt":["LiveRaceWorkflowSFTerminalStateRule08C0B7B2","Arn"]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/SFTerminalStateRule/AllowEventRuledeepraceronawsLiveRaceWorkflowSafetyNetFunction4CD5B620"}},"LiveRaceWorkflowLiveRaceWorkflowErrorsAlarm5205ACAF":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"LiveRaceWorkflow Step Function execution failure","ComparisonOperator":"GreaterThanOrEqualToThreshold","Dimensions":[{"Name":"StateMachineArn","Value":{"Ref":"LiveRaceWorkflowLiveRaceStateMachine048BF309"}}],"EvaluationPeriods":1,"MetricName":"ExecutionsFailed","Namespace":"AWS/States","Period":300,"Statistic":"Sum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":1,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/LiveRaceWorkflowErrorsAlarm/Resource"}},"LiveRaceWorkflowStreamDLQAlarmB10FD8E8":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"LiveRace stream DLQ has unprocessed records — PENDING items may be orphaned","ComparisonOperator":"GreaterThanOrEqualToThreshold","Dimensions":[{"Name":"QueueName","Value":{"Fn::GetAtt":["LiveRaceWorkflowStreamHandlerDLQ7B087DDB","QueueName"]}}],"EvaluationPeriods":1,"MetricName":"ApproximateNumberOfMessagesVisible","Namespace":"AWS/SQS","Period":300,"Statistic":"Maximum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":1,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceWorkflow/StreamDLQAlarm/Resource"}},"DeepRacerLiveRacingLogGroup82793AD5":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"Namespace"},"-DeepRacerLiveRacing"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DeepRacerLiveRacingLogGroup/Resource"}},"LiveRaceEventsSpectatorIoTPolicy126CF99A":{"Type":"AWS::IoT::Policy","Properties":{"PolicyDocument":{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"iot:Connect","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":client/*"]]}},{"Effect":"Allow","Action":"iot:Subscribe","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topicfilter/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}},{"Effect":"Allow","Action":"iot:Receive","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}},{"Effect":"Deny","Action":"iot:Publish","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}}]},"PolicyName":{"Fn::Join":["",[{"Ref":"Namespace"},"-SpectatorIoTPolicy"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/SpectatorIoTPolicy"}},"LiveRaceEventsDeleteIoTPolicyFnServiceRole2F560D0C":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyFn/ServiceRole/Resource"}},"LiveRaceEventsDeleteIoTPolicyFnServiceRoleDefaultPolicy1E38C8D2":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"iot:ListTargetsForPolicy","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsSpectatorIoTPolicy126CF99A","Arn"]}},{"Action":"iot:DetachPolicy","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyFnServiceRoleDefaultPolicy1E38C8D2","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyFnServiceRole2F560D0C"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyFn/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset3c5ac8a60036d487f38d38f266385f38058b071ebae73b9dd59a9698f55a555d.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-",{"Ref":"Namespace"},"-LiveRace-DeleteIoTPolicy"]]},"Handler":"index.onEventHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnServiceRole2F560D0C","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceEventsDeleteIoTPolicyFnServiceRoleDefaultPolicy1E38C8D2","LiveRaceEventsDeleteIoTPolicyFnServiceRole2F560D0C"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyFn/Resource","aws:asset:path":"asset.3c5ac8a60036d487f38d38f266385f38058b071ebae73b9dd59a9698f55a555d","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleD1D80D3F":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyIsCompleteFn/ServiceRole/Resource"}},"LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleDefaultPolicy4EA05BE2":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"iot:DeletePolicy","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsSpectatorIoTPolicy126CF99A","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleDefaultPolicy4EA05BE2","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleD1D80D3F"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyIsCompleteFn/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset3c5ac8a60036d487f38d38f266385f38058b071ebae73b9dd59a9698f55a555d.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-",{"Ref":"Namespace"},"-LiveRace-DeleteIoTPolicy-IsComplete"]]},"Handler":"index.isCompleteHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleD1D80D3F","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleDefaultPolicy4EA05BE2","LiveRaceEventsDeleteIoTPolicyIsCompleteFnServiceRoleD1D80D3F"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyIsCompleteFn/Resource","aws:asset:path":"asset.3c5ac8a60036d487f38d38f266385f38058b071ebae73b9dd59a9698f55a555d","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRole687CCDF4":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onEvent/ServiceRole/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRoleDefaultPolicy7C53DFB9":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]}},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]}},{"Action":"states:StartExecution","Effect":"Allow","Resource":{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachine29C1EE36"}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRoleDefaultPolicy7C53DFB9","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRole687CCDF4"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonEvent1BB0364A":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},"USER_IS_COMPLETE_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},"WAITER_STATE_MACHINE_ARN":{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachine29C1EE36"}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRole687CCDF4","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRoleDefaultPolicy7C53DFB9","LiveRaceEventsDeleteIoTPolicyProviderframeworkonEventServiceRole687CCDF4"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleF215C9B8":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-isComplete/ServiceRole/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleDefaultPolicyA3A8FD2D":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]}},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleDefaultPolicyA3A8FD2D","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleF215C9B8"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-isComplete/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteCFA87DE2":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - isComplete (deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},"USER_IS_COMPLETE_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]}}},"Handler":"framework.isComplete","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleF215C9B8","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleDefaultPolicyA3A8FD2D","LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteServiceRoleF215C9B8"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-isComplete/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRole9917AC1B":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onTimeout/ServiceRole/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRoleDefaultPolicyEC27EDB5":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]}},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRoleDefaultPolicyEC27EDB5","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRole9917AC1B"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onTimeout/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeout64307EE3":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onTimeout (deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyFnAB0BB4F9","Arn"]},"USER_IS_COMPLETE_FUNCTION_ARN":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyIsCompleteFn18DA047D","Arn"]}}},"Handler":"framework.onTimeout","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRole9917AC1B","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRoleDefaultPolicyEC27EDB5","LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeoutServiceRole9917AC1B"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/framework-onTimeout/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRole25DFBAD3":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"states.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/waiter-state-machine/Role/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRoleDefaultPolicy63ED3BEF":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteCFA87DE2","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteCFA87DE2","Arn"]},":*"]]}]},{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeout64307EE3","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeout64307EE3","Arn"]},":*"]]}]}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRoleDefaultPolicy63ED3BEF","Roles":[{"Ref":"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRole25DFBAD3"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/waiter-state-machine/Role/DefaultPolicy/Resource"}},"LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachine29C1EE36":{"Type":"AWS::StepFunctions::StateMachine","Properties":{"DefinitionString":{"Fn::Join":["",["{\"StartAt\":\"framework-isComplete-task\",\"States\":{\"framework-isComplete-task\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"States.ALL\"],\"IntervalSeconds\":15,\"MaxAttempts\":40,\"BackoffRate\":1}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"Next\":\"framework-onTimeout-task\"}],\"Type\":\"Task\",\"Resource\":\"",{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkisCompleteCFA87DE2","Arn"]},"\"},\"framework-onTimeout-task\":{\"End\":true,\"Type\":\"Task\",\"Resource\":\"",{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonTimeout64307EE3","Arn"]},"\"}}}"]]},"RoleArn":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRole25DFBAD3","Arn"]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"DependsOn":["LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRoleDefaultPolicy63ED3BEF","LiveRaceEventsDeleteIoTPolicyProviderwaiterstatemachineRole25DFBAD3"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyProvider/waiter-state-machine/Resource"}},"LiveRaceEventsDeleteIoTPolicyResourceFEFC6B23":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["LiveRaceEventsDeleteIoTPolicyProviderframeworkonEvent1BB0364A","Arn"]},"policyName":{"Fn::Join":["",[{"Ref":"Namespace"},"-SpectatorIoTPolicy"]]}},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/DeleteIoTPolicyResource/Default"}},"LiveRaceEventsIoTEndpointE66C9398":{"Type":"Custom::AWS","Properties":{"ServiceToken":{"Fn::GetAtt":["AWS679f53fac002430cb0da5b7982bd22872D164C4C","Arn"]},"Create":"{\"service\":\"IoT\",\"action\":\"describeEndpoint\",\"parameters\":{\"endpointType\":\"iot:Data-ATS\"},\"physicalResourceId\":{\"responsePath\":\"endpointAddress\"}}","InstallLatestAwsSdk":true},"DependsOn":["LiveRaceEventsIoTEndpointCustomResourcePolicy31AC74D5"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/IoTEndpoint/Resource/Default"}},"LiveRaceEventsIoTEndpointCustomResourcePolicy31AC74D5":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"iot:DescribeEndpoint","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsIoTEndpointCustomResourcePolicy31AC74D5","Roles":[{"Ref":"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/IoTEndpoint/CustomResourcePolicy/Resource"}},"LiveRaceEventsBroadcastDLQ116BC95A":{"Type":"AWS::SQS::Queue","Properties":{"KmsMasterKeyId":"alias/aws/sqs","QueueName":{"Fn::Join":["",[{"Ref":"Namespace"},"-LiveRaceBroadcastDLQ"]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/BroadcastDLQ/Resource"}},"LiveRaceEventsBroadcastDLQPolicy7D30A358":{"Type":"AWS::SQS::QueuePolicy","Properties":{"PolicyDocument":{"Statement":[{"Action":"sqs:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":{"Fn::GetAtt":["LiveRaceEventsBroadcastDLQ116BC95A","Arn"]}}],"Version":"2012-10-17"},"Queues":[{"Ref":"LiveRaceEventsBroadcastDLQ116BC95A"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/BroadcastDLQ/Policy/Resource"}},"LiveRaceEventsBroadcastDLQAlarm108425B4":{"Type":"AWS::CloudWatch::Alarm","Properties":{"ComparisonOperator":"GreaterThanThreshold","Dimensions":[{"Name":"QueueName","Value":{"Fn::GetAtt":["LiveRaceEventsBroadcastDLQ116BC95A","QueueName"]}}],"EvaluationPeriods":1,"MetricName":"ApproximateNumberOfMessagesVisible","Namespace":"AWS/SQS","Period":300,"Statistic":"Maximum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":0,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/BroadcastDLQAlarm/Resource"}},"LiveRaceEventsLiveBroadcastHandlerServiceRole2C94C02A":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/LiveBroadcastHandler/ServiceRole/Resource"}},"LiveRaceEventsLiveBroadcastHandlerServiceRoleDefaultPolicy784DFC76":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":"iot:Publish","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/deepracer/",{"Ref":"Namespace"},"/leaderboard/*"]]}},{"Action":["dynamodb:BatchGetItem","dynamodb:Query","dynamodb:GetItem","dynamodb:Scan","dynamodb:ConditionCheckItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":"dynamodb:ListStreams","Effect":"Allow","Resource":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]}},{"Action":["dynamodb:DescribeStream","dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]}},{"Action":["sqs:SendMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl"],"Effect":"Allow","Resource":{"Fn::GetAtt":["LiveRaceEventsBroadcastDLQ116BC95A","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"LiveRaceEventsLiveBroadcastHandlerServiceRoleDefaultPolicy784DFC76","Roles":[{"Ref":"LiveRaceEventsLiveBroadcastHandlerServiceRole2C94C02A"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/LiveBroadcastHandler/ServiceRole/DefaultPolicy/Resource"}},"LiveRaceEventsLiveBroadcastHandlerC6870E94":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset6593d940585c98a4891e112fe18c6bd7ff5e298fca78c7bc2339b686316ad54b.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","IOT_ENDPOINT":{"Fn::GetAtt":["LiveRaceEventsIoTEndpointE66C9398","endpointAddress"]},"TOPIC_PREFIX":{"Fn::Join":["",["deepracer/",{"Ref":"Namespace"},"/leaderboard"]]}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-",{"Ref":"Namespace"},"-LiveRace-BroadcastHandler"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"MemorySize":512,"Role":{"Fn::GetAtt":["LiveRaceEventsLiveBroadcastHandlerServiceRole2C94C02A","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["LiveRaceEventsLiveBroadcastHandlerServiceRoleDefaultPolicy784DFC76","LiveRaceEventsLiveBroadcastHandlerServiceRole2C94C02A"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/LiveBroadcastHandler/Resource","aws:asset:path":"asset.6593d940585c98a4891e112fe18c6bd7ff5e298fca78c7bc2339b686316ad54b","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"LiveRaceEventsIoTPublishFailureAlarm2AB24825":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Alert when LiveBroadcastHandler fails to publish to IoT Core","ComparisonOperator":"GreaterThanThreshold","Dimensions":[{"Name":"service","Value":"LiveBroadcastHandler"}],"EvaluationPeriods":3,"MetricName":"IoTPublishFailure","Namespace":"DeepRacerIndy","Period":60,"Statistic":"Sum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":0,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/IoTPublishFailureAlarm/Resource"}},"LiveRaceEventsIoTPublishLatencyAlarmA75968D9":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Alert when IoT Core publish P99 latency exceeds 1000ms","ComparisonOperator":"GreaterThanThreshold","Dimensions":[{"Name":"service","Value":"LiveBroadcastHandler"}],"EvaluationPeriods":3,"ExtendedStatistic":"p99","MetricName":"IoTPublishLatency","Namespace":"DeepRacerIndy","Period":60,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":1000,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/IoTPublishLatencyAlarm/Resource"}},"LiveRaceEventsAttachPolicyLambdaErrorsAlarm6687B9C2":{"Type":"AWS::CloudWatch::Alarm","Properties":{"AlarmDescription":"Alert when AttachPolicy Lambda errors exceed 10 per minute","ComparisonOperator":"GreaterThanThreshold","Dimensions":[{"Name":"FunctionName","Value":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiAttachLiveRacePolicyFunction3EC0BCABRef"]}}],"EvaluationPeriods":3,"MetricName":"Errors","Namespace":"AWS/Lambda","Period":60,"Statistic":"Sum","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Threshold":10,"TreatMissingData":"notBreaching"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/AttachPolicyLambdaErrorsAlarm/Resource"}},"LiveRaceEventsBroadcastStreamEventSource3C2B3081":{"Type":"AWS::Lambda::EventSourceMapping","Properties":{"BisectBatchOnFunctionError":true,"DestinationConfig":{"OnFailure":{"Destination":{"Fn::GetAtt":["LiveRaceEventsBroadcastDLQ116BC95A","Arn"]}}},"EventSourceArn":{"Fn::GetAtt":["DynamoDBTable7400F6BB","StreamArn"]},"FilterCriteria":{"Filters":[{"Pattern":"{\"eventName\":[\"INSERT\",\"MODIFY\"]}"}]},"FunctionName":{"Ref":"LiveRaceEventsLiveBroadcastHandlerC6870E94"},"FunctionResponseTypes":["ReportBatchItemFailures"],"MaximumBatchingWindowInSeconds":1,"MaximumRecordAgeInSeconds":300,"MaximumRetryAttempts":3,"StartingPosition":"LATEST","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LiveRaceEvents/BroadcastStreamEventSource/Resource"}},"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole/Resource"}},"AWS679f53fac002430cb0da5b7982bd22872D164C4C":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset9b8fce7ae7f25ef82fdbaf6b72523b99d0875c0c9c826642819fb51f11d9b125.zip"},"Handler":"index.handler","Role":{"Fn::GetAtt":["AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":120},"DependsOn":["AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/AWS679f53fac002430cb0da5b7982bd2287/Resource","aws:asset:path":"asset.9b8fce7ae7f25ef82fdbaf6b72523b99d0875c0c9c826642819fb51f11d9b125","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WebsiteCloudFrontToS3S3LoggingBucket3285FF05":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/S3LoggingBucket/Resource","cfn_nag":{"rules_to_suppress":[{"id":"W35","reason":"This S3 bucket is used as the access logging bucket for another bucket"}]}}},"WebsiteCloudFrontToS3S3LoggingBucketPolicyFB1AAAF6":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"WebsiteCloudFrontToS3S3LoggingBucket3285FF05"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3LoggingBucket3285FF05","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3LoggingBucket3285FF05","Arn"]},"/*"]]}]},{"Action":"s3:PutObject","Condition":{"ArnLike":{"aws:SourceArn":{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]}},"StringEquals":{"aws:SourceAccount":{"Ref":"AWS::AccountId"}}},"Effect":"Allow","Principal":{"Service":"logging.s3.amazonaws.com"},"Resource":{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3LoggingBucket3285FF05","Arn"]},"/*"]]}}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/S3LoggingBucket/Policy/Resource"}},"WebsiteCloudFrontToS3S3Bucket18AD4248":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"LifecycleConfiguration":{"Rules":[{"NoncurrentVersionTransitions":[{"StorageClass":"GLACIER","TransitionInDays":90}],"Status":"Enabled"}]},"LoggingConfiguration":{"DestinationBucketName":{"Ref":"WebsiteCloudFrontToS3S3LoggingBucket3285FF05"}},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-cdk:cr-owned:42a09d17","Value":"true"},{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/S3Bucket/Resource"}},"WebsiteCloudFrontToS3S3BucketPolicy59EB757C":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"WebsiteCloudFrontToS3S3Bucket18AD4248"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},"/*"]]}]},{"Action":"s3:GetObject","Condition":{"StringEquals":{"AWS:SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":cloudfront::",{"Ref":"AWS::AccountId"},":distribution/",{"Ref":"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C"}]]}}},"Effect":"Allow","Principal":{"Service":"cloudfront.amazonaws.com"},"Resource":{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},"/*"]]}},{"Action":"s3:ListBucket","Condition":{"StringEquals":{"AWS:SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":cloudfront::",{"Ref":"AWS::AccountId"},":distribution/",{"Ref":"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C"}]]}}},"Effect":"Allow","Principal":{"Service":"cloudfront.amazonaws.com"},"Resource":{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]}}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/S3Bucket/Policy/Resource","cfn_nag":{"rules_to_suppress":[{"id":"F16","reason":"Public website bucket policy requires a wildcard principal"}]}}},"WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03":{"Type":"AWS::S3::Bucket","Properties":{"BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudfrontLoggingBucketAccessLog/Resource","cfn_nag":{"rules_to_suppress":[{"id":"W35","reason":"This S3 bucket is used as the access logging bucket for another bucket"}]}}},"WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogPolicyB645E530":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03","Arn"]},"/*"]]}]},{"Action":"s3:PutObject","Condition":{"ArnLike":{"aws:SourceArn":{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9","Arn"]}},"StringEquals":{"aws:SourceAccount":{"Ref":"AWS::AccountId"}}},"Effect":"Allow","Principal":{"Service":"logging.s3.amazonaws.com"},"Resource":{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03","Arn"]},"/*"]]}}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudfrontLoggingBucketAccessLog/Policy/Resource"}},"WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9":{"Type":"AWS::S3::Bucket","Properties":{"AccessControl":"LogDeliveryWrite","BucketEncryption":{"ServerSideEncryptionConfiguration":[{"ServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]},"LoggingConfiguration":{"DestinationBucketName":{"Ref":"WebsiteCloudFrontToS3CloudfrontLoggingBucketAccessLogD8FF6B03"}},"OwnershipControls":{"Rules":[{"ObjectOwnership":"ObjectWriter"}]},"PublicAccessBlockConfiguration":{"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"VersioningConfiguration":{"Status":"Enabled"}},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudfrontLoggingBucket/Resource"}},"WebsiteCloudFrontToS3CloudfrontLoggingBucketPolicy5BF04B0B":{"Type":"AWS::S3::BucketPolicy","Properties":{"Bucket":{"Ref":"WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9"},"PolicyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudfrontLoggingBucket/Policy/Resource"}},"WebsiteCloudFrontToS3CloudFrontOacF32C1CF8":{"Type":"AWS::CloudFront::OriginAccessControl","Properties":{"OriginAccessControlConfig":{"Description":"Origin access control provisioned by aws-cloudfront-s3","Name":{"Fn::Join":["",["aws-cloudfront-s3-CloutToS3-",{"Fn::Select":[2,{"Fn::Split":["/",{"Ref":"AWS::StackId"}]}]}]]},"OriginAccessControlOriginType":"s3","SigningBehavior":"always","SigningProtocol":"sigv4"}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudFrontOac"}},"WebsiteCloudFrontToS3ResponseHeadersPolicy7577A66F":{"Type":"AWS::CloudFront::ResponseHeadersPolicy","Properties":{"ResponseHeadersPolicyConfig":{"CustomHeadersConfig":{"Items":[{"Header":"Cache-Control","Override":true,"Value":"no-cache,no-store"},{"Header":"Cross-Origin-Opener-Policy","Override":true,"Value":"same-origin"}]},"Name":{"Fn::Join":["",[{"Ref":"Namespace"},"SecurityHeadersPolicy-",{"Ref":"AWS::Region"}]]},"SecurityHeadersConfig":{"ContentSecurityPolicy":{"ContentSecurityPolicy":{"Fn::Join":["",["base-uri 'none'; default-src 'none'; frame-ancestors 'none'; font-src 'self' data:; img-src 'self' data:; media-src 'self' blob: https://",{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","RegionalDomainName"]},"; object-src 'none'; style-src 'self'; script-src 'self' 'wasm-unsafe-eval'; worker-src 'self' blob:; connect-src 'self' blob: https://",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},".execute-api.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiDeploymentStageprod2937C774Ref"]},"/ https://cognito-idp.",{"Ref":"AWS::Region"},".amazonaws.com https://cognito-identity.",{"Ref":"AWS::Region"},".amazonaws.com https://*.kinesisvideo.",{"Ref":"AWS::Region"},".amazonaws.com https://",{"Fn::GetAtt":["S3BucketUploadBucketE3BDB254","RegionalDomainName"]}," https://",{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","RegionalDomainName"]}," https://www.gstatic.com/draco/versioned/decoders/ https://api.github.com wss://",{"Fn::GetAtt":["LiveRaceEventsIoTEndpointE66C9398","endpointAddress"]},"; upgrade-insecure-requests"]]},"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,"Preload":true},"XSSProtection":{"ModeBlock":true,"Override":true,"Protection":true}}}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/ResponseHeadersPolicy/Resource"}},"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C":{"Type":"AWS::CloudFront::Distribution","Properties":{"DistributionConfig":{"CustomErrorResponses":[{"ErrorCode":404,"ResponseCode":200,"ResponsePagePath":"/index.html"},{"ErrorCode":403,"ResponseCode":200,"ResponsePagePath":"/index.html"}],"DefaultCacheBehavior":{"CachePolicyId":"658327ea-f89d-4fab-a63d-7e88639e58f6","Compress":true,"ResponseHeadersPolicyId":{"Ref":"WebsiteCloudFrontToS3ResponseHeadersPolicy7577A66F"},"TargetOriginId":"deepraceronawsWebsiteCloudFrontToS3CloudFrontDistributionOrigin1C6706192","ViewerProtocolPolicy":"redirect-to-https"},"DefaultRootObject":"index.html","Enabled":true,"HttpVersion":"http2","IPV6Enabled":true,"Logging":{"Fn::If":["WebsiteSupportsCloudFrontLogging36BD107F",{"Bucket":{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudfrontLoggingBucketF02A63E9","DomainName"]},"IncludeCookies":false},{"Ref":"AWS::NoValue"}]},"Origins":[{"DomainName":{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","RegionalDomainName"]},"Id":"deepraceronawsWebsiteCloudFrontToS3CloudFrontDistributionOrigin1C6706192","OriginAccessControlId":{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudFrontOacF32C1CF8","Id"]},"S3OriginConfig":{"OriginAccessIdentity":""}}]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CloudFrontToS3/CloudFrontDistribution/Resource","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"}]}}},"WebsiteDeployWebsiteAwsCliLayerBA460CCE":{"Type":"AWS::Lambda::LayerVersion","Properties":{"Content":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asseta72522445441e9b66c2f16956c54d4786af8c61c156b80c48a6e7c32fcc49023.zip"},"Description":"/opt/awscli/aws"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/DeployWebsite/AwsCliLayer/Resource","aws:asset:path":"asset.a72522445441e9b66c2f16956c54d4786af8c61c156b80c48a6e7c32fcc49023.zip","aws:asset:is-bundled":false,"aws:asset:property":"Content"}},"WebsiteDeployWebsiteCustomResource2048MiB749F534D":{"Type":"Custom::CDKBucketDeployment","Properties":{"ServiceToken":{"Fn::GetAtt":["CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiB8AA4A604","Arn"]},"SourceBucketNames":[{"Fn::Sub":"solutions-${AWS::Region}"}],"SourceObjectKeys":["deepracer-on-aws/v1.2.11/asset395cf16b2c13b173a3a972bcf41fb83a5342ac512877aed21e517095b38665b2.zip"],"DestinationBucketName":{"Ref":"WebsiteCloudFrontToS3S3Bucket18AD4248"},"WaitForDistributionInvalidation":true,"Prune":true,"DistributionId":{"Ref":"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C"},"OutputObjectKeys":true},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/DeployWebsite/CustomResource-2048MiB/Default"}},"WebsiteCreateWebsiteEnvFileServiceRoleA206CED4":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateWebsiteEnvFile/ServiceRole/Resource"}},"WebsiteCreateWebsiteEnvFileServiceRoleDefaultPolicyCED01828":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["s3:PutObject","s3:PutObjectAcl"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},"/*"]]}},{"Action":"cloudfront:CreateInvalidation","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":cloudfront::",{"Ref":"AWS::AccountId"},":distribution/",{"Ref":"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C"}]]}}],"Version":"2012-10-17"},"PolicyName":"WebsiteCreateWebsiteEnvFileServiceRoleDefaultPolicyCED01828","Roles":[{"Ref":"WebsiteCreateWebsiteEnvFileServiceRoleA206CED4"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateWebsiteEnvFile/ServiceRole/DefaultPolicy/Resource"}},"WebsiteCreateWebsiteEnvFile0F4D62FE":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset14b7808e79e6c50d3644075f9be24d988b0eb6fdc9b19075b30b96b08500118b.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-CreateWebsiteEnvFile"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["WebsiteCreateWebsiteEnvFileServiceRoleA206CED4","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":60,"TracingConfig":{"Mode":"Active"}},"DependsOn":["WebsiteCreateWebsiteEnvFileServiceRoleDefaultPolicyCED01828","WebsiteCreateWebsiteEnvFileServiceRoleA206CED4"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateWebsiteEnvFile/Resource","aws:asset:path":"asset.14b7808e79e6c50d3644075f9be24d988b0eb6fdc9b19075b30b96b08500118b","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WebsiteCreateEnvFileProviderframeworkonEventServiceRoleA21F2D80":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateEnvFileProvider/framework-onEvent/ServiceRole/Resource"}},"WebsiteCreateEnvFileProviderframeworkonEventServiceRoleDefaultPolicyBD0FB5C9":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["WebsiteCreateWebsiteEnvFile0F4D62FE","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCreateWebsiteEnvFile0F4D62FE","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["WebsiteCreateWebsiteEnvFile0F4D62FE","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"WebsiteCreateEnvFileProviderframeworkonEventServiceRoleDefaultPolicyBD0FB5C9","Roles":[{"Ref":"WebsiteCreateEnvFileProviderframeworkonEventServiceRoleA21F2D80"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateEnvFileProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"WebsiteCreateEnvFileProviderframeworkonEvent79338D92":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/Website/CreateEnvFileProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["WebsiteCreateWebsiteEnvFile0F4D62FE","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["WebsiteCreateEnvFileProviderframeworkonEventServiceRoleA21F2D80","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["WebsiteCreateEnvFileProviderframeworkonEventServiceRoleDefaultPolicyBD0FB5C9","WebsiteCreateEnvFileProviderframeworkonEventServiceRoleA21F2D80"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateEnvFileProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"WebsiteCreateEnvFileResource71F46A47":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["WebsiteCreateEnvFileProviderframeworkonEvent79338D92","Arn"]},"bucketName":{"Ref":"WebsiteCloudFrontToS3S3Bucket18AD4248"},"fileName":"env.js","fileContent":{"Fn::Join":["",["window.EnvironmentConfig = {\"apiEndpointUrl\":\"https://",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},".execute-api.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiDeploymentStageprod2937C774Ref"]},"/\",\"userPoolId\":\"",{"Ref":"UserPool6D0DFADB"},"\",\"userPoolClientId\":\"",{"Ref":"UserPoolWebClientEB451012"},"\",\"identityPoolId\":\"",{"Ref":"UserPoolIdentityPoolA58D72D6"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"uploadBucketName\":\"",{"Ref":"S3BucketUploadBucketE3BDB254"},"\",\"iotEndpoint\":\"",{"Fn::GetAtt":["LiveRaceEventsIoTEndpointE66C9398","endpointAddress"]},"\",\"solutionVersion\":\"v1.2.11\",\"namespace\":\"",{"Ref":"Namespace"},"\"};"]]},"namespace":{"Ref":"Namespace"},"distributionId":{"Ref":"WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C"},"forceUpdate":"1789414583994"},"DependsOn":["WebsiteDeployWebsiteAwsCliLayerBA460CCE","WebsiteDeployWebsiteCustomResource2048MiB749F534D"],"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/Website/CreateEnvFileResource/Default"}},"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleB37F9ACF":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiB/ServiceRole/Resource"}},"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleDefaultPolicy5D765796":{"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":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["WebsiteCloudFrontToS3S3Bucket18AD4248","Arn"]},"/*"]]}]},{"Action":["cloudfront:GetInvalidation","cloudfront:CreateInvalidation"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleDefaultPolicy5D765796","Roles":[{"Ref":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleB37F9ACF"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiB/ServiceRole/DefaultPolicy/Resource"}},"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiB8AA4A604":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset97e9ebf0b174a5c8f7faa505739022b7f509edddffcab9211dcd08b759944c4f.zip"},"Environment":{"Variables":{"AWS_CA_BUNDLE":"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"}},"Handler":"index.handler","Layers":[{"Ref":"WebsiteDeployWebsiteAwsCliLayerBA460CCE"}],"MemorySize":2048,"Role":{"Fn::GetAtt":["CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleB37F9ACF","Arn"]},"Runtime":"python3.13","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleDefaultPolicy5D765796","CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiBServiceRoleB37F9ACF"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C2048MiB/Resource","aws:asset:path":"asset.97e9ebf0b174a5c8f7faa505739022b7f509edddffcab9211dcd08b759944c4f","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UpdateApiCorsUpdateCorsFunctionServiceRoleF29522AE":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsFunction/ServiceRole/Resource"}},"UpdateApiCorsUpdateCorsFunctionServiceRoleDefaultPolicy4B14DD18":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["apigateway:GET","apigateway:PUT","apigateway:PATCH","apigateway:POST"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:aws:apigateway:*::/restapis/",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]}]]},{"Fn::Join":["",["arn:aws:apigateway:*::/restapis/",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UpdateApiCorsUpdateCorsFunctionServiceRoleDefaultPolicy4B14DD18","Roles":[{"Ref":"UpdateApiCorsUpdateCorsFunctionServiceRoleF29522AE"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsFunction/ServiceRole/DefaultPolicy/Resource"}},"UpdateApiCorsUpdateCorsFunctionC369CA21":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset83e80ab6547f961f467cccbc043f8963984a613c0f4f99415036b5c8a284dd3d.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":""}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-UpdateApiCors"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["UpdateApiCorsUpdateCorsFunctionServiceRoleF29522AE","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":300,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UpdateApiCorsUpdateCorsFunctionServiceRoleDefaultPolicy4B14DD18","UpdateApiCorsUpdateCorsFunctionServiceRoleF29522AE"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsFunction/Resource","aws:asset:path":"asset.83e80ab6547f961f467cccbc043f8963984a613c0f4f99415036b5c8a284dd3d","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleFBF18EED":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsProvider/framework-onEvent/ServiceRole/Resource"}},"UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleDefaultPolicy7D1F739A":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":[{"Fn::GetAtt":["UpdateApiCorsUpdateCorsFunctionC369CA21","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["UpdateApiCorsUpdateCorsFunctionC369CA21","Arn"]},":*"]]}]},{"Action":"lambda:GetFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["UpdateApiCorsUpdateCorsFunctionC369CA21","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleDefaultPolicy7D1F739A","Roles":[{"Ref":"UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleFBF18EED"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource"}},"UpdateApiCorsUpdateCorsProviderframeworkonEventFC5D994F":{"Type":"AWS::Lambda::Function","Properties":{"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"},"Description":"AWS CDK resource provider framework - onEvent (deepracer-on-aws/UpdateApiCors/UpdateCorsProvider)","Environment":{"Variables":{"USER_ON_EVENT_FUNCTION_ARN":{"Fn::GetAtt":["UpdateApiCorsUpdateCorsFunctionC369CA21","Arn"]}}},"Handler":"framework.onEvent","LoggingConfig":{"ApplicationLogLevel":"FATAL","LogFormat":"JSON"},"Role":{"Fn::GetAtt":["UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleFBF18EED","Arn"]},"Runtime":"nodejs24.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900},"DependsOn":["UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleDefaultPolicy7D1F739A","UpdateApiCorsUpdateCorsProviderframeworkonEventServiceRoleFBF18EED"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsProvider/framework-onEvent/Resource","aws:asset:path":"asset.e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63","aws:asset:is-bundled":false,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"UpdateApiCorsUpdateCorsResource98633B54":{"Type":"AWS::CloudFormation::CustomResource","Properties":{"ServiceToken":{"Fn::GetAtt":["UpdateApiCorsUpdateCorsProviderframeworkonEventFC5D994F","Arn"]},"apiId":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},"allowedOrigin":{"Fn::If":["HasCustomDomain",{"Ref":"CustomDomain"},{"Fn::Join":["",["https://",{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C","DomainName"]}]]}]},"forceUpdate":"1789414585059"},"UpdateReplacePolicy":"Delete","DeletionPolicy":"Delete","Metadata":{"aws:cdk:path":"deepracer-on-aws/UpdateApiCors/UpdateCorsResource/Default"}},"UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDB81ACFF":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UsageFunctions/UpdateStorageUsedByProfileFn/ServiceRole/Resource"}},"UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDefaultPolicy8454B82B":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["s3:GetObject*","s3:GetBucket*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["S3BucketModelStorageBucket01547CCF","Arn"]},"/*"]]}]},{"Action":["dynamodb:BatchWriteItem","dynamodb:PutItem","dynamodb:UpdateItem","dynamodb:DeleteItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDefaultPolicy8454B82B","Roles":[{"Ref":"UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDB81ACFF"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/UsageFunctions/UpdateStorageUsedByProfileFn/ServiceRole/DefaultPolicy/Resource"}},"UsageFunctionsUpdateStorageUsedByProfileFnE6F69AD3":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/assete6aafe3ae6e9a91cec4defae163bb5463cd6d08b323975da1266d3077ace14f8.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","MODEL_STORAGE_BUCKET_NAME":{"Ref":"S3BucketModelStorageBucket01547CCF"}}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-UpdateStorageUsedByProfileFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"MemorySize":512,"Role":{"Fn::GetAtt":["UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDB81ACFF","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDefaultPolicy8454B82B","UsageFunctionsUpdateStorageUsedByProfileFnServiceRoleDB81ACFF"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/UsageFunctions/UpdateStorageUsedByProfileFn/Resource","aws:asset:path":"asset.e6aafe3ae6e9a91cec4defae163bb5463cd6d08b323975da1266d3077ace14f8","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/Resource"}},"BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691":{"Type":"AWS::Lambda::Function","Properties":{"Description":"AWS CloudFormation handler for \"Custom::S3BucketNotifications\" resources (@aws-cdk/aws-s3)","Code":{"ZipFile":"import boto3  # type: ignore\nimport json\nimport logging\nimport urllib.request\n\ns3 = boto3.client(\"s3\")\n\nEVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration'\nCONFIGURATION_TYPES = [\"TopicConfigurations\", \"QueueConfigurations\", \"LambdaFunctionConfigurations\"]\n\ndef handler(event: dict, context):\n  response_status = \"SUCCESS\"\n  error_message = \"\"\n  try:\n    props = event[\"ResourceProperties\"]\n    notification_configuration = props[\"NotificationConfiguration\"]\n    managed = props.get('Managed', 'true').lower() == 'true'\n    skipDestinationValidation = props.get('SkipDestinationValidation', 'false').lower() == 'true'\n    stack_id = event['StackId']\n    old = event.get(\"OldResourceProperties\", {}).get(\"NotificationConfiguration\", {})\n    if managed:\n      config = handle_managed(event[\"RequestType\"], notification_configuration)\n    else:\n      config = handle_unmanaged(props[\"BucketName\"], stack_id, event[\"RequestType\"], notification_configuration, old)\n    s3.put_bucket_notification_configuration(Bucket=props[\"BucketName\"], NotificationConfiguration=config, SkipDestinationValidation=skipDestinationValidation)\n  except Exception as e:\n    logging.exception(\"Failed to put bucket notification configuration\")\n    response_status = \"FAILED\"\n    error_message = f\"Error: {str(e)}. \"\n  finally:\n    submit_response(event, context, response_status, error_message)\n\ndef handle_managed(request_type, notification_configuration):\n  if request_type == 'Delete':\n    return {}\n  return notification_configuration\n\ndef handle_unmanaged(bucket, stack_id, request_type, notification_configuration, old):\n  def get_id(n):\n    n['Id'] = ''\n    sorted_notifications = sort_filter_rules(n)\n    strToHash=json.dumps(sorted_notifications, sort_keys=True).replace('\"Name\": \"prefix\"', '\"Name\": \"Prefix\"').replace('\"Name\": \"suffix\"', '\"Name\": \"Suffix\"')\n    return f\"{stack_id}-{hash(strToHash)}\"\n  def with_id(n):\n    n['Id'] = get_id(n)\n    return n\n\n  external_notifications = {}\n  existing_notifications = s3.get_bucket_notification_configuration(Bucket=bucket)\n  for t in CONFIGURATION_TYPES:\n    if request_type == 'Update':\n        old_incoming_ids = [get_id(n) for n in old.get(t, [])]\n        external_notifications[t] = [n for n in existing_notifications.get(t, []) if not get_id(n) in old_incoming_ids]      \n    elif request_type == 'Delete':\n        external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\"{stack_id}-\")]\n    elif request_type == 'Create':\n        external_notifications[t] = [n for n in existing_notifications.get(t, [])]\n  if EVENTBRIDGE_CONFIGURATION in existing_notifications:\n    external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION]\n\n  if request_type == 'Delete':\n    return external_notifications\n\n  notifications = {}\n  for t in CONFIGURATION_TYPES:\n    external = external_notifications.get(t, [])\n    incoming = [with_id(n) for n in notification_configuration.get(t, [])]\n    notifications[t] = external + incoming\n\n  if EVENTBRIDGE_CONFIGURATION in notification_configuration:\n    notifications[EVENTBRIDGE_CONFIGURATION] = notification_configuration[EVENTBRIDGE_CONFIGURATION]\n  elif EVENTBRIDGE_CONFIGURATION in external_notifications:\n    notifications[EVENTBRIDGE_CONFIGURATION] = external_notifications[EVENTBRIDGE_CONFIGURATION]\n\n  return notifications\n\ndef submit_response(event: dict, context, response_status: str, error_message: str):\n  response_body = json.dumps(\n    {\n      \"Status\": response_status,\n      \"Reason\": f\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\",\n      \"PhysicalResourceId\": event.get(\"PhysicalResourceId\") or event[\"LogicalResourceId\"],\n      \"StackId\": event[\"StackId\"],\n      \"RequestId\": event[\"RequestId\"],\n      \"LogicalResourceId\": event[\"LogicalResourceId\"],\n      \"NoEcho\": False,\n    }\n  ).encode(\"utf-8\")\n  headers = {\"content-type\": \"\", \"content-length\": str(len(response_body))}\n  try:\n    req = urllib.request.Request(url=event[\"ResponseURL\"], headers=headers, data=response_body, method=\"PUT\")\n    with urllib.request.urlopen(req) as response:\n      print(response.read().decode(\"utf-8\"))\n    print(\"Status code: \" + response.reason)\n  except Exception as e:\n      print(\"send(..) failed executing request.urlopen(..): \" + str(e))\n\ndef sort_filter_rules(json_obj):\n  if not isinstance(json_obj, dict):\n      return json_obj\n  for key, value in json_obj.items():\n      if isinstance(value, dict):\n          json_obj[key] = sort_filter_rules(value)\n      elif isinstance(value, list):\n          json_obj[key] = [sort_filter_rules(item) for item in value]\n  if \"Filter\" in json_obj and \"Key\" in json_obj[\"Filter\"] and \"FilterRules\" in json_obj[\"Filter\"][\"Key\"]:\n      filter_rules = json_obj[\"Filter\"][\"Key\"][\"FilterRules\"]\n      sorted_filter_rules = sorted(filter_rules, key=lambda x: x[\"Name\"])\n      json_obj[\"Filter\"][\"Key\"][\"FilterRules\"] = sorted_filter_rules\n  return json_obj"},"Handler":"index.handler","Role":{"Fn::GetAtt":["BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC","Arn"]},"Runtime":"python3.13","Timeout":300,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"DependsOn":["BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Resource","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleB079C50C":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetFunction/ServiceRole/Resource"}},"MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleDefaultPolicy3F2354D7":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"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":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleDefaultPolicy3F2354D7","Roles":[{"Ref":"MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleB079C50C"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetFunction/ServiceRole/DefaultPolicy/Resource"}},"MonthlyQuotaResetMonthlyQuotaResetFunctionFDD5D8F7":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asseteaa3a0cfce92a4052db4b69852ea51d24627e8777b5e550a9a8e1679f1ac40b2.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","PROFILE_UPDATE_CONCURRENCY":"10","PROFILE_UPDATE_BATCH_SIZE":"100"}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-MonthlyQuotaResetFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}},"MemorySize":512,"Role":{"Fn::GetAtt":["MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleB079C50C","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":900,"TracingConfig":{"Mode":"Active"}},"DependsOn":["MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleDefaultPolicy3F2354D7","MonthlyQuotaResetMonthlyQuotaResetFunctionServiceRoleB079C50C"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetFunction/Resource","aws:asset:path":"asset.eaa3a0cfce92a4052db4b69852ea51d24627e8777b5e550a9a8e1679f1ac40b2","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}}},"MonthlyQuotaResetMonthlyQuotaResetSchedulerRoleEC5677EC":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"scheduler.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetSchedulerRole/Resource"}},"MonthlyQuotaResetMonthlyQuotaResetSchedulerRoleDefaultPolicyFA5BA36B":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["MonthlyQuotaResetMonthlyQuotaResetFunctionFDD5D8F7","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"MonthlyQuotaResetMonthlyQuotaResetSchedulerRoleDefaultPolicyFA5BA36B","Roles":[{"Ref":"MonthlyQuotaResetMonthlyQuotaResetSchedulerRoleEC5677EC"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetSchedulerRole/DefaultPolicy/Resource"}},"MonthlyQuotaResetMonthlyQuotaResetSchedule0AE5B5F4":{"Type":"AWS::Scheduler::Schedule","Properties":{"Description":"Triggers monthly quota reset function on the 1st of every month at midnight UTC","FlexibleTimeWindow":{"MaximumWindowInMinutes":240,"Mode":"FLEXIBLE"},"ScheduleExpression":"cron(0 0 1 * ? *)","State":"ENABLED","Target":{"Arn":{"Fn::GetAtt":["MonthlyQuotaResetMonthlyQuotaResetFunctionFDD5D8F7","Arn"]},"RetryPolicy":{"MaximumRetryAttempts":3},"RoleArn":{"Fn::GetAtt":["MonthlyQuotaResetMonthlyQuotaResetSchedulerRoleEC5677EC","Arn"]}}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonthlyQuotaReset/MonthlyQuotaResetSchedule"}},"DeepRacerScheduledLogGroup8209DD2E":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"Namespace"},"-DeepRacerScheduled"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DeepRacerScheduledLogGroup/Resource"}},"ResourceGroupTaggedResourceGroupC04007EA":{"Type":"AWS::ResourceGroups::Group","Properties":{"Name":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-TaggedResourceGroup"]]},"ResourceQuery":{"Query":{"ResourceTypeFilters":["AWS::AllSupported"],"TagFilters":[{"Key":"aws-solutions:dr-id","Values":[{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}]}]},"Type":"TAG_FILTERS_1_0"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/ResourceGroup/TaggedResourceGroup"}},"LogInsightsAllActivityQueryBE5FA8A8":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Recent Activity/AllActivity"]]},"QueryString":"fields @timestamp, @message, @logStream, level\n| sort @timestamp desc\n| limit 100"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/AllActivityQuery"}},"LogInsightsAllErrorsQueryAC5BA1B7":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Recent Activity/AllErrors"]]},"QueryString":"fields @timestamp, @message, @logStream, level\n| filter @message like /ERROR/ or @message like /Exception/ or @message like /FAILED/ or level = \"ERROR\"\n| sort @timestamp desc\n| limit 100"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/AllErrorsQuery"}},"LogInsightsDailyActiveUsersQuery24EB656A":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/User Activity/DailyActiveUsers"]]},"QueryString":"fields @timestamp, metricsLogData.profileId\n| filter metricsLogSubscriptionKey = \"UserLogIn\"\n| stats count_distinct(metricsLogData.profileId) as daily_active_users by bin(1h)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/DailyActiveUsersQuery"}},"LogInsightsUserLoginPatternsQueryE8FA2B01":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/User Activity/UserLoginPatterns"]]},"QueryString":"fields @timestamp, metricsLogData.profileId\n| filter metricsLogSubscriptionKey = \"UserLogIn\"\n| stats count() as login_count by metricsLogData.profileId\n| sort login_count desc\n| limit 50"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/UserLoginPatternsQuery"}},"LogInsightsUserEngagementQuery5639F9F0":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/User Activity/UserEngagement"]]},"QueryString":"fields @timestamp, metricsLogSubscriptionKey\n| filter metricsLogSubscriptionKey in [\"CreateModel\", \"CreateEvaluation\", \"CreateSubmission\", \"CreateLeaderboard\"]\n| stats count() as activity_count by metricsLogSubscriptionKey, bin(1d)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/UserEngagementQuery"}},"LogInsightsModelCreationTrendsQuery1852CC66":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Model Training/ModelCreationTrends"]]},"QueryString":"fields @timestamp\n| filter metricsLogSubscriptionKey = \"CreateModel\"\n| stats count() as models_created by bin(1d)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/ModelCreationTrendsQuery"}},"LogInsightsTrainingJobPerformanceQueryAD6B1466":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Model Training/TrainingJobPerformance"]]},"QueryString":"fields @timestamp, metricsLogData.jobType, metricsLogData.jobStatus, metricsLogData.sageMakerMinutes\n| filter metricsLogSubscriptionKey = \"DeepRacerJob\"\n| filter metricsLogData.jobType = \"training\"\n| stats count() as job_count, avg(metricsLogData.sageMakerMinutes) as avg_duration_minutes by metricsLogData.jobStatus, bin(1h)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/TrainingJobPerformanceQuery"}},"LogInsightsEvaluationJobAnalysisQuery6FAAAF4B":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Model Training/EvaluationJobAnalysis"]]},"QueryString":"fields @timestamp, metricsLogData.jobType, metricsLogData.jobStatus, metricsLogData.sageMakerMinutes, metricsLogData.modelId\n| filter metricsLogSubscriptionKey = \"DeepRacerJob\"\n| filter metricsLogData.jobType = \"evaluation\"\n| stats count() as evaluation_count, avg(metricsLogData.sageMakerMinutes) as avg_duration by metricsLogData.jobStatus, bin(1h)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/EvaluationJobAnalysisQuery"}},"LogInsightsModelDownloadPatternsQuery0435EB65":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Model Training/ModelDownloadPatterns"]]},"QueryString":"fields @timestamp, metricsLogData.modelId\n| filter metricsLogSubscriptionKey = \"DownloadModel\"\n| stats count() as download_count by metricsLogData.modelId\n| sort download_count desc\n| limit 20"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/ModelDownloadPatternsQuery"}},"LogInsightsSystemSummaryQuery2A9852CD":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/System Metrics/SystemSummary"]]},"QueryString":"fields @timestamp, metricsLogData.models, metricsLogData.users, metricsLogData.races, metricsLogData.trainingJobs, metricsLogData.evaluationJobs\n| filter metricsLogSubscriptionKey = \"DailyHeartbeat\"\n| sort @timestamp desc\n| limit 30"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/SystemSummaryQuery"}},"LogInsightsErrorFrequencyQueryAD9958D9":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Error Analysis/ErrorFrequency"]]},"QueryString":"fields @timestamp, @message, @logStream\n| filter @message like /ERROR/ or @message like /Exception/ or level = \"ERROR\"\n| stats count() as error_count by @logStream, bin(1h)\n| sort error_count desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/ErrorFrequencyQuery"}},"LogInsightsErrorTypesQueryFE30BD9B":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Error Analysis/ErrorTypes"]]},"QueryString":"fields @timestamp, @message\n| filter @message like /ERROR/ or @message like /Exception/\n| parse @message /(?<error_type>\\w*Error|\\w*Exception)/\n| stats count() as occurrence_count by error_type\n| sort occurrence_count desc\n| limit 20"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/ErrorTypesQuery"}},"LogInsightsFailedJobAnalysisQueryDFAAF726":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Error Analysis/FailedJobAnalysis"]]},"QueryString":"fields @timestamp, metricsLogData.jobType, metricsLogData.jobStatus, metricsLogData.modelId\n| filter metricsLogSubscriptionKey = \"DeepRacerJob\"\n| filter metricsLogData.jobStatus like /FAILED|ERROR/\n| stats count() as failed_jobs by metricsLogData.jobType, metricsLogData.jobStatus, bin(1h)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/FailedJobAnalysisQuery"}},"LogInsightsTimeoutAnalysisQueryCE7C675E":{"Type":"AWS::Logs::QueryDefinition","Properties":{"LogGroupNames":[{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]},{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]},{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]},{"Ref":"DeepRacerTrainingLogGroup803B7F5E"},{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"},{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}],"Name":{"Fn::Join":["",["DeepRacerOnAWS Sample Queries (",{"Ref":"Namespace"},")/Error Analysis/TimeoutAnalysis"]]},"QueryString":"fields @timestamp, @message, @duration, @billedDuration\n| filter @message like /Task timed out/ or @message like /timeout/\n| stats count() as timeout_count, avg(@duration) as avg_duration_before_timeout by bin(1h)\n| sort @timestamp desc"},"Metadata":{"aws:cdk:path":"deepracer-on-aws/LogInsights/TimeoutAnalysisQuery"}},"MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleC6F47985":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatLambda/ServiceRole/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleDefaultPolicy3BE45875":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"},{"Action":["dynamodb:BatchGetItem","dynamodb:Query","dynamodb:GetItem","dynamodb:Scan","dynamodb:ConditionCheckItem","dynamodb:DescribeTable"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]},{"Action":["dynamodb:GetRecords","dynamodb:GetShardIterator"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DynamoDBTable7400F6BB","Arn"]},"/index/*"]]}]}],"Version":"2012-10-17"},"PolicyName":"MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleDefaultPolicy3BE45875","Roles":[{"Ref":"MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleC6F47985"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatLambda/ServiceRole/DefaultPolicy/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraDailyHeartbeatCollectHeartbeatLambda4BC53AEF":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset868eec462e925573263124dac00908c785e56c401a667a5f602133066b940683.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","DB_READ_CONCURRENCY":"10"}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-CollectHeartbeatFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerMetricsLogGroup12AB979D"}},"MemorySize":512,"Role":{"Fn::GetAtt":["MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleC6F47985","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleDefaultPolicy3BE45875","MetricsInfraDailyHeartbeatCollectHeartbeatLambdaServiceRoleC6F47985"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatLambda/Resource","aws:asset:path":"asset.868eec462e925573263124dac00908c785e56c401a667a5f602133066b940683","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraDailyHeartbeatCollectHeartbeatSchedulerRoleA72D0571":{"Type":"AWS::IAM::Role","Properties":{"AssumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"scheduler.amazonaws.com"}}],"Version":"2012-10-17"},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatSchedulerRole/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraDailyHeartbeatCollectHeartbeatSchedulerRoleDefaultPolicy39A29E14":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":"lambda:InvokeFunction","Effect":"Allow","Resource":{"Fn::GetAtt":["MetricsInfraDailyHeartbeatCollectHeartbeatLambda4BC53AEF","Arn"]}}],"Version":"2012-10-17"},"PolicyName":"MetricsInfraDailyHeartbeatCollectHeartbeatSchedulerRoleDefaultPolicy39A29E14","Roles":[{"Ref":"MetricsInfraDailyHeartbeatCollectHeartbeatSchedulerRoleA72D0571"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatSchedulerRole/DefaultPolicy/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraDailyHeartbeatCollectHeartbeatSchedule6CC21B46":{"Type":"AWS::Scheduler::Schedule","Properties":{"Description":"Triggers daily heartbeat function at 12:10 AM every day","FlexibleTimeWindow":{"MaximumWindowInMinutes":120,"Mode":"FLEXIBLE"},"ScheduleExpression":"cron(10 0 * * ? *)","State":"ENABLED","Target":{"Arn":{"Fn::GetAtt":["MetricsInfraDailyHeartbeatCollectHeartbeatLambda4BC53AEF","Arn"]},"RetryPolicy":{"MaximumRetryAttempts":3},"RoleArn":{"Fn::GetAtt":["MetricsInfraDailyHeartbeatCollectHeartbeatSchedulerRoleA72D0571","Arn"]}}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/DailyHeartbeat/CollectHeartbeatSchedule"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20":{"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"]]}],"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscriberLambda/ServiceRole/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C":{"Type":"AWS::IAM::Policy","Properties":{"PolicyDocument":{"Statement":[{"Action":["xray:PutTraceSegments","xray:PutTelemetryRecords"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"PolicyName":"MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","Roles":[{"Ref":"MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscriberLambda/ServiceRole/DefaultPolicy/Resource"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85":{"Type":"AWS::Lambda::Function","Properties":{"Architectures":["arm64"],"Code":{"S3Bucket":{"Fn::Sub":"solutions-${AWS::Region}"},"S3Key":"deepracer-on-aws/v1.2.11/asset6d210a37c8cd4dc9f086c3bb3b8cff6373b9a1c5def5c77203783d97e9231244.zip"},"Environment":{"Variables":{"ACCOUNT_ID":{"Ref":"AWS::AccountId"},"REGION":{"Ref":"AWS::Region"},"NODE_OPTIONS":"--enable-source-maps","POWERTOOLS_SERVICE_NAME":"DeepRacerIndy","POWERTOOLS_METRICS_NAMESPACE":"DeepRacerIndy","NAMESPACE":{"Ref":"Namespace"},"CUSTOM_USER_AGENT":"AwsSolution/SO0310/v1.2.11","DEPLOYMENT_MODE":"","STACK_ARN":{"Ref":"AWS::StackId"},"SOLUTION_ID":"SO0310","SOLUTION_VERSION":"v1.2.11","METRICS_ENDPOINT":"https://metrics.awssolutionsbuilder.com/generic"}},"FunctionName":{"Fn::Join":["",[{"Ref":"Namespace"},"-DeepRacerOnAWS-ProcessSubscribedMetricsLogsFn"]]},"Handler":"index.lambdaHandler","LoggingConfig":{"ApplicationLogLevel":"INFO","LogFormat":"JSON","LogGroup":{"Ref":"DeepRacerMetricsLogGroup12AB979D"}},"MemorySize":512,"Role":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20","Arn"]},"Runtime":"nodejs22.x","Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}],"Timeout":30,"TracingConfig":{"Mode":"Active"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscriberLambda/Resource","aws:asset:path":"asset.6d210a37c8cd4dc9f086c3bb3b8cff6373b9a1c5def5c77203783d97e9231244","aws:asset:is-bundled":true,"aws:asset:property":"Code","guard":{"SuppressedRules":["LAMBDA_INSIDE_VPC","LAMBDA_CONCURRENCY_CHECK"]}},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865":{"Type":"AWS::Lambda::Permission","Properties":{"Action":"lambda:InvokeFunction","FunctionName":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"Principal":"logs.amazonaws.com","SourceArn":{"Fn::Join":["",["arn:aws:logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/lambda/*:*"]]}},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscriberLambda/LogsInvokePermission"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerEcrImagesLogGroup0F46749C":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerEcrImagesLogGroupD1DE8872Ref"]}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerEcrImagesLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerUserIdentityLogGroupE185B33E":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Ref":"DeepRacerUserIdentityLogGroup1631EFAE"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerUserIdentityLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerApisLogGroup29E38DE7":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerApisLogGroupFF908639Ref"]}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerApisLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerSystemEventsLogGroup8C97FF95":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerSystemEventsLogGroupE0E810EARef"]}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerSystemEventsLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerWorkflowLogGroupC5E10142":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackDeepRacerWorkflowLogGroupAB31CF9CRef"]}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerWorkflowLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerTrainingLogGroupD8426EAB":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Ref":"DeepRacerTrainingLogGroup803B7F5E"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerTrainingLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerLiveRacingLogGroupE658BB87":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Ref":"DeepRacerLiveRacingLogGroup82793AD5"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerLiveRacingLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerScheduledLogGroup27FF90C8":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Ref":"DeepRacerScheduledLogGroup8209DD2E"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerScheduledLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"MetricsInfraMetricsReporterMetricLogSubscriptionDeepRacerMetricsLogGroupBA59836E":{"Type":"AWS::Logs::SubscriptionFilter","Properties":{"DestinationArn":{"Fn::GetAtt":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","Arn"]},"FilterPattern":"{ ($.metricsLogSubscriptionKey = \"DailyHeartbeat\") || ($.metricsLogSubscriptionKey = \"UserLogIn\") || ($.metricsLogSubscriptionKey = \"ImportModel\") || ($.metricsLogSubscriptionKey = \"DownloadModel\") || ($.metricsLogSubscriptionKey = \"UnexpectedError\") || ($.metricsLogSubscriptionKey = \"CreateEvaluation\") || ($.metricsLogSubscriptionKey = \"CreateLeaderboard\") || ($.metricsLogSubscriptionKey = \"CreateModel\") || ($.metricsLogSubscriptionKey = \"CreateSubmission\") || ($.metricsLogSubscriptionKey = \"DeleteModel\") || ($.metricsLogSubscriptionKey = \"DeleteProfile\") || ($.metricsLogSubscriptionKey = \"DeleteProfileModels\") || ($.metricsLogSubscriptionKey = \"CreateUser\") || ($.metricsLogSubscriptionKey = \"DeepRacerJob\") }","LogGroupName":{"Ref":"DeepRacerMetricsLogGroup12AB979D"}},"DependsOn":["MetricsInfraMetricsReporterMetricLogSubscriberLambdaLogsInvokePermissionA32C9865","MetricsInfraMetricsReporterMetricLogSubscriberLambdaC8AC5B85","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRoleDefaultPolicyDF68804C","MetricsInfraMetricsReporterMetricLogSubscriberLambdaServiceRole00473C20"],"Metadata":{"aws:cdk:path":"deepracer-on-aws/MetricsInfra/MetricsReporter/MetricLogSubscription-DeepRacerMetricsLogGroup"},"Condition":"MetricsInfraSendAnonymizedData168371B5"},"DeepRacerMetricsLogGroup12AB979D":{"Type":"AWS::Logs::LogGroup","Properties":{"KmsKeyId":{"Fn::GetAtt":["EcrNestedStackEcrNestedStackResourceD4475E64","Outputs.deepraceronawsEcrDeepRacerCMK1FB00512Arn"]},"LogGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"Namespace"},"-DeepRacerMetrics"]]},"RetentionInDays":731,"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"UpdateReplacePolicy":"Retain","DeletionPolicy":"Retain","Metadata":{"aws:cdk:path":"deepracer-on-aws/DeepRacerMetricsLogGroup/Resource"}},"MonitoringDashboard9E35EEED":{"Type":"AWS::CloudWatch::Dashboard","Properties":{"DashboardBody":{"Fn::Join":["",["{\"widgets\":[{\"type\":\"text\",\"width\":24,\"height\":2,\"x\":0,\"y\":0,\"properties\":{\"markdown\":\"# DeepRacer Monitoring Dashboard\\nNamespace: **",{"Ref":"Namespace"},"**\"}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":2,\"properties\":{\"markdown\":\"## System Alarms\"}},{\"type\":\"alarm\",\"width\":24,\"height\":3,\"x\":0,\"y\":3,\"properties\":{\"title\":\"Alarm Status\",\"alarms\":[\"",{"Fn::GetAtt":["UserPoolPreSignUpErrorAlarm3307DC04","Arn"]},"\",\"",{"Fn::GetAtt":["UserPoolPostSignUpErrorAlarmBF8E665E","Arn"]},"\",\"",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiAssetPackagingDLQAlarm99E358D1Arn"]},"\",\"",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiimportWorkflowImportModelLambdaErrorsAlarmAF14FC2EArn"]},"\",\"",{"Fn::GetAtt":["LiveRaceWorkflowLiveRaceWorkflowErrorsAlarm5205ACAF","Arn"]},"\",\"",{"Fn::GetAtt":["LiveRaceWorkflowStreamDLQAlarmB10FD8E8","Arn"]},"\"]}},{\"type\":\"text\",\"width\":24,\"height\":2,\"x\":0,\"y\":6,\"properties\":{\"markdown\":\"## Training Instance Usage\\n\\nCurrent ml.c7i.4xlarge training job usage. [View quota limits and utilization](https://console.aws.amazon.com/servicequotas/home/services/sagemaker/quotas/L-1EC4D7FD)\"}},{\"type\":\"metric\",\"width\":24,\"height\":6,\"x\":0,\"y\":8,\"properties\":{\"view\":\"timeSeries\",\"title\":\"ml.c7i.4xlarge Training Jobs In Use\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/Usage\",\"ResourceCount\",\"Class\",\"None\",\"Resource\",\"training-job/ml.c7i.4xlarge\",\"Service\",\"SageMaker\",\"Type\",\"Resource\",{\"label\":\"Active Instances\",\"stat\":\"Maximum\"}]],\"yAxis\":{}}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":14,\"properties\":{\"markdown\":\"## Training & Evaluation Jobs\"}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":15,\"properties\":{\"view\":\"timeSeries\",\"title\":\"Training Job Outcomes\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"DeepRacerIndyWorkflow\",\"JobOutcome\",\"JobStatus\",\"COMPLETED\",\"JobType\",\"training\",\"service\",\"DeepRacerIndy\",{\"label\":\"Completed\",\"period\":3600,\"stat\":\"Sum\"}],[\"DeepRacerIndyWorkflow\",\"JobOutcome\",\"JobStatus\",\"FAILED\",\"JobType\",\"training\",\"service\",\"DeepRacerIndy\",{\"label\":\"Failed\",\"period\":3600,\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":12,\"y\":15,\"properties\":{\"view\":\"timeSeries\",\"title\":\"Evaluation Job Outcomes\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"DeepRacerIndyWorkflow\",\"JobOutcome\",\"JobStatus\",\"COMPLETED\",\"JobType\",\"evaluation\",\"service\",\"DeepRacerIndy\",{\"label\":\"Completed\",\"period\":3600,\"stat\":\"Sum\"}],[\"DeepRacerIndyWorkflow\",\"JobOutcome\",\"JobStatus\",\"FAILED\",\"JobType\",\"evaluation\",\"service\",\"DeepRacerIndy\",{\"label\":\"Failed\",\"period\":3600,\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":21,\"properties\":{\"markdown\":\"## Queue Metrics\"}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":22,\"properties\":{\"view\":\"timeSeries\",\"title\":\"Queue: ",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CQueueName"]}," - Messages\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/SQS\",\"ApproximateNumberOfMessagesVisible\",\"QueueName\",\"",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CQueueName"]},"\",{\"label\":\"Visible\",\"stat\":\"Maximum\"}],[\"AWS/SQS\",\"ApproximateNumberOfMessagesNotVisible\",\"QueueName\",\"",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiWorkflowJobQueue01EC220CQueueName"]},"\",{\"label\":\"In Flight\",\"stat\":\"Maximum\"}]],\"yAxis\":{}}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":28,\"properties\":{\"markdown\":\"## API Performance\"}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":29,\"properties\":{\"view\":\"timeSeries\",\"title\":\"API Request Count\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/ApiGateway\",\"Count\",\"ApiName\",\"",{"Ref":"Namespace"},"-DeepRacerIndyApi\",{\"stat\":\"SampleCount\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":12,\"y\":29,\"properties\":{\"view\":\"timeSeries\",\"title\":\"API Latency\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/ApiGateway\",\"Latency\",\"ApiName\",\"",{"Ref":"Namespace"},"-DeepRacerIndyApi\"]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":35,\"properties\":{\"view\":\"timeSeries\",\"title\":\"API 4XX Errors\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/ApiGateway\",\"4XXError\",\"ApiName\",\"",{"Ref":"Namespace"},"-DeepRacerIndyApi\",{\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":12,\"y\":35,\"properties\":{\"view\":\"timeSeries\",\"title\":\"API 5XX Errors\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/ApiGateway\",\"5XXError\",\"ApiName\",\"",{"Ref":"Namespace"},"-DeepRacerIndyApi\",{\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":41,\"properties\":{\"markdown\":\"## Database Performance\"}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":42,\"properties\":{\"view\":\"timeSeries\",\"title\":\"DynamoDB Read Capacity\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/DynamoDB\",\"ConsumedReadCapacityUnits\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":12,\"y\":42,\"properties\":{\"view\":\"timeSeries\",\"title\":\"DynamoDB Write Capacity\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/DynamoDB\",\"ConsumedWriteCapacityUnits\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":0,\"y\":48,\"properties\":{\"view\":\"timeSeries\",\"title\":\"DynamoDB User Errors\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"AWS/DynamoDB\",\"UserErrors\",{\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"metric\",\"width\":12,\"height\":6,\"x\":12,\"y\":48,\"properties\":{\"view\":\"timeSeries\",\"title\":\"DynamoDB System Errors\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[{\"label\":\"Sum of errors across all operations\",\"expression\":\"getitem + batchgetitem + scan + query + getrecords + putitem + deleteitem + updateitem + batchwriteitem + transactwriteitems + transactgetitems + executetransaction + batchexecutestatement + executestatement\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"GetItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"getitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"BatchGetItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"batchgetitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"Scan\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"scan\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"Query\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"query\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"GetRecords\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"getrecords\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"PutItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"putitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"DeleteItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"deleteitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"UpdateItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"updateitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"BatchWriteItem\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"batchwriteitem\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"TransactWriteItems\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"transactwriteitems\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"TransactGetItems\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"transactgetitems\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"ExecuteTransaction\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"executetransaction\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"BatchExecuteStatement\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"batchexecutestatement\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}],[\"AWS/DynamoDB\",\"SystemErrors\",\"Operation\",\"ExecuteStatement\",\"TableName\",\"",{"Ref":"DynamoDBTable7400F6BB"},"\",{\"id\":\"executestatement\",\"visible\":false,\"accountId\":\"",{"Ref":"AWS::AccountId"},"\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"stat\":\"Sum\"}]],\"yAxis\":{}}},{\"type\":\"text\",\"width\":24,\"height\":1,\"x\":0,\"y\":54,\"properties\":{\"markdown\":\"## Email\"}},{\"type\":\"metric\",\"width\":8,\"height\":3,\"x\":0,\"y\":55,\"properties\":{\"view\":\"singleValue\",\"title\":\"Daily authentication email count\",\"region\":\"",{"Ref":"AWS::Region"},"\",\"metrics\":[[\"DeepRacerOnAWS/Email\",\"TransactionalEmailSent\",\"Namespace\",\"",{"Ref":"Namespace"},"\",{\"label\":\"Number of authentication emails sent today.\",\"period\":86400,\"stat\":\"Sum\"}]],\"setPeriodToTimeRange\":true}}",{"Fn::If":["IsSesEnabled",{"Fn::Join":["",[",{\"type\":\"alarm\",\"width\":24,\"height\":3,\"properties\":{\"title\":\"SES Alarm Status\",\"alarms\":[\"",{"Fn::Join":["\",\"",[{"Fn::GetAtt":["UserPoolEmailVolumeAnomalyAlarm13AA4C91","Arn"]},{"Fn::GetAtt":["UserPoolSesBounceRateAlarmDB4AACA1","Arn"]},{"Fn::GetAtt":["UserPoolSesComplaintRateAlarm3DF4D832","Arn"]}]]},"\"]}}"]]},""]},"]}"]]},"DashboardName":{"Fn::Join":["",[{"Ref":"Namespace"},"-deepracer-monitoring-",{"Ref":"AWS::Region"}]]},"Tags":[{"Key":"aws-solutions:dr-id","Value":{"Fn::Join":["",["DeepRacerOnAWS-",{"Ref":"Namespace"}]]}}]},"Metadata":{"aws:cdk:path":"deepracer-on-aws/MonitoringDashboard/Dashboard/Resource"}},"CDKMetadata":{"Type":"AWS::CDK::Metadata","Properties":{"Analytics":"v2:deflate64:H4sIAAAAAAAA/21VX5PaOAz/LPtu3D2Y6XMpdNvO7LaU9PYeGeOIoMWxcpYMw2Ty3W/sBAK9fYn0019HkuWpbqcfp/rxwZx4YsvDxOFWt4UYe1CLnV+ZYGoQCAmso4NEF+RLFCSvzIk3bXn2pqZyq9vfZuvgdZpsvjraGpcFneKZbj9HewBJqoHryYoc2vMoHnAPPhuGTqGpdTvaDdya+sNk+mK8qaAcje4EnXKm3pZGt8kdQo3M6fSLnX+K3uY/uTJfjuCloBgsvJimQV8lu3ekBfrKgdAYY7Hzz+YM4RVCit8psFPdvjY2aV5XC7UKeDQCRdz6vhQjt6YokMs1ykfZnJksmpylABsDyvlroNhk4zvBD5AThcPcuqS7QX3MUXAb85ryXXWnTNNY8juscgnnTePQXj2/+CMG8jV4GaZjh1UMWb8KtMP+n5bQODonq0KCEahyo74RC5R3PkP57n0uPdx4KuGN9Y9MrqXn2aY1zCCs54mo8uqp+1m6DWUdxfJkxO51O3cm1CnXyHiqjTsvQcAKBbU0vN+SCWU+0QV0ylLlUUi3fzOEFVEu+JW/MAuHQ2H+L/legheU88X5Fqe5nosYu6//8M997hSkkWTdXm5lop1yVLFun6m6jsct/ytCOC9hhx5v+s42YJPwEzqB0CkWaHZDaVm3RbQWoFRPBp1a7AktqH8MiirECLwYu0ffj+0tXhnmP0JtxPCB9XPu5Hd/pAMo/pd1+ytChOGAEVT+jpf5BnYKSfS4BXInd4G85Mn8GbBCP7cWmBfkJZBTa+CGPMM3MCUEHsO+r1giS8BtvNTnFneK7R7K6CCkMxQDUAE4r4Yq1ZmTaujRIrJQvR7UQ9KBv1OtAh2xhJA2nsoTXIiphuXTb+Orp82em0tS1u3FO3cFwl0b5ie+T9WlkD+jNFEud8qlrbUxJ7YOdXJwmBdZv0nzuuvUX48z/fjwKb0TTC7XgyeWPEuIVvhDfkCu7ZjwTC8SekroNxWzTqWrq9/4w3E61dOZnj68MeIkRC9Yg1739D9AGHjqkQYAAA=="},"Metadata":{"aws:cdk:path":"deepracer-on-aws/CDKMetadata/Default"},"Condition":"CDKMetadataAvailable"}},"Outputs":{"UserPoolUserPoolIdC5F3DCB2":{"Value":{"Ref":"UserPool6D0DFADB"}},"UserPoolUserPoolClientIdFA5F5A35":{"Value":{"Ref":"UserPoolWebClientEB451012"}},"UserPoolIdentityPoolId3155995A":{"Value":{"Ref":"UserPoolIdentityPoolA58D72D6"}},"LiveRaceEventsIoTEndpointOutput9971DA1C":{"Description":"IoT Core ATS endpoint for MQTT over WSS","Value":{"Fn::GetAtt":["LiveRaceEventsIoTEndpointE66C9398","endpointAddress"]}},"WebsiteUrlB509D73D":{"Value":{"Fn::Join":["",["https://",{"Fn::GetAtt":["WebsiteCloudFrontToS3CloudFrontDistribution4313ED9C","DomainName"]}]]}},"ApiEndpoint":{"Value":{"Fn::Join":["",["https://",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiBB0205FFRef"]},".execute-api.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/",{"Fn::GetAtt":["ApiStackNestedStackApiStackNestedStackResource56E3B9D0","Outputs.deepraceronawsApiStackApiDeploymentStageprod2937C774Ref"]},"/"]]}}},"Mappings":{"MetricsInfraAnonymizedData6566E64E":{"SendAnonymizedData":{"Data":"Yes"}}}}