diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.assets.json index 392fff8e4deca..b6f0ccd4a031e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.assets.json @@ -15,7 +15,7 @@ } } }, - "21ae166c8774d80f1a7fecc0182cf6928f7d72aa27a13838e84368e14dd8323c": { + "e14a6ebb08970d5ddbe0b80314dd4e26c9f4527652432f0fa64128abcfca8cd4": { "displayName": "BucketReplicationTestStack Template", "source": { "path": "BucketReplicationTestStack.template.json", @@ -24,7 +24,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "21ae166c8774d80f1a7fecc0182cf6928f7d72aa27a13838e84368e14dd8323c.json", + "objectKey": "e14a6ebb08970d5ddbe0b80314dd4e26c9f4527652432f0fa64128abcfca8cd4.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.template.json index b05bd9447e27c..0d1fa7f4396f8 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/BucketReplicationTestStack.template.json @@ -304,25 +304,25 @@ } }, { - "Action": "kms:Decrypt", + "Action": [ + "kms:Encrypt", + "kms:GenerateDataKey*", + "kms:ReEncrypt*" + ], "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "SourceKmsKeyFE472F1C", + "DestinationKmsKey0D94AA3C", "Arn" ] } }, { - "Action": [ - "kms:Encrypt", - "kms:GenerateDataKey*", - "kms:ReEncrypt*" - ], + "Action": "kms:Decrypt", "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "DestinationKmsKey0D94AA3C", + "SourceKmsKeyFE472F1C", "Arn" ] } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.assets.json index 412a72ab879b6..838d65b3953da 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.assets.json @@ -1,20 +1,20 @@ { "version": "41.0.0", "files": { - "530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42": { + "97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895": { "source": { - "path": "asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle", + "path": "asset.97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.bundle", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.zip", + "objectKey": "97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "52a2ce9ca2706a7b9510cd84b16fc6115ad4aecf0b37be2d89b4bdcbad29cd17": { + "d889017d979c5f6b20f84d5e71066f915619f863e2c59f1e1b0b40decfed0d41": { "displayName": "ReplicationIntegDefaultTestDeployAssert2C07A074 Template", "source": { "path": "ReplicationIntegDefaultTestDeployAssert2C07A074.template.json", @@ -23,7 +23,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "52a2ce9ca2706a7b9510cd84b16fc6115ad4aecf0b37be2d89b4bdcbad29cd17.json", + "objectKey": "d889017d979c5f6b20f84d5e71066f915619f863e2c59f1e1b0b40decfed0d41.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.template.json index 5b2ff59b5a1e0..43b09f3731012 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/ReplicationIntegDefaultTestDeployAssert2C07A074.template.json @@ -32,7 +32,7 @@ "ContentType": "\"text/plain\"" }, "flattenResponse": "false", - "salt": "1743331723244" + "salt": "1744516675510" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -292,7 +292,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.zip" + "S3Key": "97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.zip" }, "Timeout": 120, "Handler": "index.handler", @@ -415,7 +415,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.zip" + "S3Key": "97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.zip" }, "Timeout": 120, "Handler": "index.isComplete", @@ -465,7 +465,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.zip" + "S3Key": "97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.zip" }, "Timeout": 120, "Handler": "index.onTimeout", @@ -509,7 +509,7 @@ "ContentType": "\"text/plain\"" }, "flattenResponse": "false", - "salt": "1743331723245" + "salt": "1744516675511" }, "DependsOn": [ "AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b", @@ -694,7 +694,7 @@ "Key": "\"test-object\"" }, "flattenResponse": "false", - "salt": "1743331723246" + "salt": "1744516675512" }, "DependsOn": [ "AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e", @@ -879,7 +879,7 @@ "Key": "\"prefix-test-object\"" }, "flattenResponse": "false", - "salt": "1743331723246" + "salt": "1744516675512" }, "DependsOn": [ "AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312", @@ -1064,7 +1064,7 @@ "Key": "\"prefix-test-object\"" }, "flattenResponse": "false", - "salt": "1743331723247" + "salt": "1744516675513" }, "DependsOn": [ "AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.bundle/index.js similarity index 99% rename from packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js rename to packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.bundle/index.js index 30d27c62635c3..efca1ce512334 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/asset.97484721f29e34bf38d7a459804dd2d2a8dea6f8c27d7531e215bf4274fbc895.bundle/index.js @@ -1,3 +1,4 @@ +"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; @@ -30174,6 +30175,7 @@ var CustomResourceHandler = class { constructor(event, context) { this.event = event; this.context = context; + this.timedOut = false; this.timeout = setTimeout(async () => { await this.respond({ status: "FAILED", @@ -30185,9 +30187,6 @@ var CustomResourceHandler = class { this.event = event; this.physicalResourceId = extractPhysicalResourceId(event); } - physicalResourceId; - timeout; - timedOut = false; /** * Handles executing the custom resource event. If `stateMachineArn` is present * in the props then trigger the waiter statemachine @@ -30321,7 +30320,6 @@ var AssertionHandler = class extends CustomResourceHandler { } }; var MatchCreator = class { - parsedObj; constructor(obj) { this.parsedObj = { matcher: obj diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/manifest.json index 1436e862b65cd..4c8726b52eb76 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21ae166c8774d80f1a7fecc0182cf6928f7d72aa27a13838e84368e14dd8323c.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/e14a6ebb08970d5ddbe0b80314dd4e26c9f4527652432f0fa64128abcfca8cd4.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -284,7 +284,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/52a2ce9ca2706a7b9510cd84b16fc6115ad4aecf0b37be2d89b4bdcbad29cd17.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d889017d979c5f6b20f84d5e71066f915619f863e2c59f1e1b0b40decfed0d41.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/tree.json index c7eec851fd5ac..461213a2b422e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.js.snapshot/tree.json @@ -1 +1 @@ -{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"BucketReplicationTestStack":{"id":"BucketReplicationTestStack","path":"BucketReplicationTestStack","children":{"DestinationBucket":{"id":"DestinationBucket","path":"BucketReplicationTestStack/DestinationBucket","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}],"versioningConfiguration":{"status":"Enabled"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Policy":{"id":"Policy","path":"BucketReplicationTestStack/DestinationBucket/Policy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationBucket/Policy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"DestinationBucket4BECDB47"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"BucketReplicationTestStack/DestinationBucket/AutoDeleteObjectsCustomResource","children":{"Default":{"id":"Default","path":"BucketReplicationTestStack/DestinationBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"BucketReplicationTestStack/LatestNodeRuntimeMap","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","children":{"Staging":{"id":"Staging","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DestinationKmsKey":{"id":"DestinationKmsKey","path":"BucketReplicationTestStack/DestinationKmsKey","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationKmsKey/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::KMS::Key","aws:cdk:cloudformation:props":{"keyPolicy":{"Statement":[{"Action":"kms:*","Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"SourceKmsKey":{"id":"SourceKmsKey","path":"BucketReplicationTestStack/SourceKmsKey","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceKmsKey/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::KMS::Key","aws:cdk:cloudformation:props":{"keyPolicy":{"Statement":[{"Action":"kms:*","Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"ReplicationRole":{"id":"ReplicationRole","path":"BucketReplicationTestStack/ReplicationRole","children":{"ImportReplicationRole":{"id":"ImportReplicationRole","path":"BucketReplicationTestStack/ReplicationRole/ImportReplicationRole","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"Resource":{"id":"Resource","path":"BucketReplicationTestStack/ReplicationRole/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"}}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"BucketReplicationTestStack/ReplicationRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/ReplicationRole/DefaultPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetReplicationConfiguration","s3:ListBucket"],"Effect":"Allow","Resource":{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]}},{"Action":["s3:GetObjectVersionAcl","s3:GetObjectVersionForReplication","s3:GetObjectVersionTagging"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}},{"Action":["s3:ObjectOwnerOverrideToBucketOwner","s3:ReplicateDelete","s3:ReplicateObject","s3:ReplicateTags"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"/*"]]}},{"Action":"kms:Decrypt","Effect":"Allow","Resource":{"Fn::GetAtt":["SourceKmsKeyFE472F1C","Arn"]}},{"Action":["kms:Encrypt","kms:GenerateDataKey*","kms:ReEncrypt*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["DestinationKmsKey0D94AA3C","Arn"]}}],"Version":"2012-10-17"},"policyName":"ReplicationRoleDefaultPolicy80AD15BB","roles":[{"Ref":"ReplicationRoleCE149CEC"}]}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*","*","*","*","*","*","*","*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*","*","*","*","*","*","*","*"]}},"SourceBucket":{"id":"SourceBucket","path":"BucketReplicationTestStack/SourceBucket","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"bucketEncryption":{"serverSideEncryptionConfiguration":[{"serverSideEncryptionByDefault":{"sseAlgorithm":"aws:kms","kmsMasterKeyId":{"Fn::GetAtt":["SourceKmsKeyFE472F1C","Arn"]}}}]},"replicationConfiguration":{"role":{"Fn::GetAtt":["ReplicationRoleCE149CEC","Arn"]},"rules":[{"priority":2,"status":"Enabled","destination":{"bucket":{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"encryptionConfiguration":{"replicaKmsKeyId":{"Fn::GetAtt":["DestinationKmsKey0D94AA3C","Arn"]}},"replicationTime":{"status":"Enabled","time":{"minutes":15}},"metrics":{"status":"Enabled","eventThreshold":{"minutes":15}}},"filter":{"prefix":""},"deleteMarkerReplication":{"status":"Disabled"},"sourceSelectionCriteria":{"sseKmsEncryptedObjects":{"status":"Enabled"}}}]},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}],"versioningConfiguration":{"status":"Enabled"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Policy":{"id":"Policy","path":"BucketReplicationTestStack/SourceBucket/Policy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceBucket/Policy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"SourceBucketDDD2130A"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"BucketReplicationTestStack/SourceBucket/AutoDeleteObjectsCustomResource","children":{"Default":{"id":"Default","path":"BucketReplicationTestStack/SourceBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"Exports":{"id":"Exports","path":"BucketReplicationTestStack/Exports","children":{"Output{\"Ref\":\"SourceBucketDDD2130A\"}":{"id":"Output{\"Ref\":\"SourceBucketDDD2130A\"}","path":"BucketReplicationTestStack/Exports/Output{\"Ref\":\"SourceBucketDDD2130A\"}","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Output{\"Ref\":\"DestinationBucket4BECDB47\"}":{"id":"Output{\"Ref\":\"DestinationBucket4BECDB47\"}","path":"BucketReplicationTestStack/Exports/Output{\"Ref\":\"DestinationBucket4BECDB47\"}","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"BucketReplicationTestStack/BootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"BucketReplicationTestStack/CheckBootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"ReplicationInteg":{"id":"ReplicationInteg","path":"ReplicationInteg","children":{"DefaultTest":{"id":"DefaultTest","path":"ReplicationInteg/DefaultTest","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ReplicationInteg/DefaultTest/DeployAssert","children":{"AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b":{"id":"AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"ReplicationInteg/DefaultTest/DeployAssert/LatestNodeRuntimeMap","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e":{"id":"AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312":{"id":"AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552":{"id":"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521":{"id":"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ReplicationInteg/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ReplicationInteg/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"BucketReplicationTestStack":{"id":"BucketReplicationTestStack","path":"BucketReplicationTestStack","children":{"DestinationBucket":{"id":"DestinationBucket","path":"BucketReplicationTestStack/DestinationBucket","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}],"versioningConfiguration":{"status":"Enabled"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Policy":{"id":"Policy","path":"BucketReplicationTestStack/DestinationBucket/Policy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationBucket/Policy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"DestinationBucket4BECDB47"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"BucketReplicationTestStack/DestinationBucket/AutoDeleteObjectsCustomResource","children":{"Default":{"id":"Default","path":"BucketReplicationTestStack/DestinationBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"BucketReplicationTestStack/LatestNodeRuntimeMap","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","children":{"Staging":{"id":"Staging","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"BucketReplicationTestStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DestinationKmsKey":{"id":"DestinationKmsKey","path":"BucketReplicationTestStack/DestinationKmsKey","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/DestinationKmsKey/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::KMS::Key","aws:cdk:cloudformation:props":{"keyPolicy":{"Statement":[{"Action":"kms:*","Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"SourceKmsKey":{"id":"SourceKmsKey","path":"BucketReplicationTestStack/SourceKmsKey","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceKmsKey/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::KMS::Key","aws:cdk:cloudformation:props":{"keyPolicy":{"Statement":[{"Action":"kms:*","Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"ReplicationRole":{"id":"ReplicationRole","path":"BucketReplicationTestStack/ReplicationRole","children":{"ImportReplicationRole":{"id":"ImportReplicationRole","path":"BucketReplicationTestStack/ReplicationRole/ImportReplicationRole","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"Resource":{"id":"Resource","path":"BucketReplicationTestStack/ReplicationRole/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"}}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"BucketReplicationTestStack/ReplicationRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/ReplicationRole/DefaultPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetReplicationConfiguration","s3:ListBucket"],"Effect":"Allow","Resource":{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]}},{"Action":["s3:GetObjectVersionAcl","s3:GetObjectVersionForReplication","s3:GetObjectVersionTagging"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}},{"Action":["s3:ObjectOwnerOverrideToBucketOwner","s3:ReplicateDelete","s3:ReplicateObject","s3:ReplicateTags"],"Effect":"Allow","Resource":{"Fn::Join":["",[{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"/*"]]}},{"Action":["kms:Encrypt","kms:GenerateDataKey*","kms:ReEncrypt*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["DestinationKmsKey0D94AA3C","Arn"]}},{"Action":"kms:Decrypt","Effect":"Allow","Resource":{"Fn::GetAtt":["SourceKmsKeyFE472F1C","Arn"]}}],"Version":"2012-10-17"},"policyName":"ReplicationRoleDefaultPolicy80AD15BB","roles":[{"Ref":"ReplicationRoleCE149CEC"}]}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*","*","*","*","*","*","*","*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*","*","*","*","*","*","*","*"]}},"SourceBucket":{"id":"SourceBucket","path":"BucketReplicationTestStack/SourceBucket","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"bucketEncryption":{"serverSideEncryptionConfiguration":[{"serverSideEncryptionByDefault":{"sseAlgorithm":"aws:kms","kmsMasterKeyId":{"Fn::GetAtt":["SourceKmsKeyFE472F1C","Arn"]}}}]},"replicationConfiguration":{"role":{"Fn::GetAtt":["ReplicationRoleCE149CEC","Arn"]},"rules":[{"priority":2,"status":"Enabled","destination":{"bucket":{"Fn::GetAtt":["DestinationBucket4BECDB47","Arn"]},"encryptionConfiguration":{"replicaKmsKeyId":{"Fn::GetAtt":["DestinationKmsKey0D94AA3C","Arn"]}},"replicationTime":{"status":"Enabled","time":{"minutes":15}},"metrics":{"status":"Enabled","eventThreshold":{"minutes":15}}},"filter":{"prefix":""},"deleteMarkerReplication":{"status":"Disabled"},"sourceSelectionCriteria":{"sseKmsEncryptedObjects":{"status":"Enabled"}}}]},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}],"versioningConfiguration":{"status":"Enabled"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Policy":{"id":"Policy","path":"BucketReplicationTestStack/SourceBucket/Policy","children":{"Resource":{"id":"Resource","path":"BucketReplicationTestStack/SourceBucket/Policy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"SourceBucketDDD2130A"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"BucketReplicationTestStack/SourceBucket/AutoDeleteObjectsCustomResource","children":{"Default":{"id":"Default","path":"BucketReplicationTestStack/SourceBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"Exports":{"id":"Exports","path":"BucketReplicationTestStack/Exports","children":{"Output{\"Ref\":\"SourceBucketDDD2130A\"}":{"id":"Output{\"Ref\":\"SourceBucketDDD2130A\"}","path":"BucketReplicationTestStack/Exports/Output{\"Ref\":\"SourceBucketDDD2130A\"}","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Output{\"Ref\":\"DestinationBucket4BECDB47\"}":{"id":"Output{\"Ref\":\"DestinationBucket4BECDB47\"}","path":"BucketReplicationTestStack/Exports/Output{\"Ref\":\"DestinationBucket4BECDB47\"}","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"BucketReplicationTestStack/BootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"BucketReplicationTestStack/CheckBootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"ReplicationInteg":{"id":"ReplicationInteg","path":"ReplicationInteg","children":{"DefaultTest":{"id":"DefaultTest","path":"ReplicationInteg/DefaultTest","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ReplicationInteg/DefaultTest/DeployAssert","children":{"AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b":{"id":"AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObject75573d90b014e8d9ac02510555b9974b/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"ReplicationInteg/DefaultTest/DeployAssert/LatestNodeRuntimeMap","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","children":{"Staging":{"id":"Staging","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Handler":{"id":"Handler","path":"ReplicationInteg/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e":{"id":"AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3putObjectc37eeaa244b355dd997924b65635b69e/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312":{"id":"AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObjectbee9a118ce8e3c48acff9db8ac213312/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552":{"id":"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae837552/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521":{"id":"AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521","children":{"SdkProvider":{"id":"SdkProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/SdkProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/Default","children":{"Default":{"id":"Default","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/Default/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2","metadata":["*"]}},"WaitFor":{"id":"WaitFor","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor","children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"TimeoutProvider":{"id":"TimeoutProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider","children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"}},"Role":{"id":"Role","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/Role","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Resource":{"id":"Resource","path":"ReplicationInteg/DefaultTest/DeployAssert/AwsApiCallS3getObject43ef9c9a50ae21e2f98a7c7cae8375521/WaitFor/Resource","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ReplicationInteg/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ReplicationInteg/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.ts index 9c6e259005e4e..64fdd10a537a4 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-s3/test/integ.bucket-replication-use-custom-role.ts @@ -47,23 +47,12 @@ class TestStack extends Stack { ], }); - this.replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:GetReplicationConfiguration', 's3:ListBucket'], - resources: [this.sourceBucket.bucketArn], - effect: iam.Effect.ALLOW, - })); - this.replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:GetObjectVersionForReplication', 's3:GetObjectVersionAcl', 's3:GetObjectVersionTagging'], - resources: [this.sourceBucket.arnForObjects('*')], - effect: iam.Effect.ALLOW, - })); - this.replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:ReplicateObject', 's3:ReplicateDelete', 's3:ReplicateTags', 's3:ObjectOwnerOverrideToBucketOwner'], - resources: [this.destinationBucket.arnForObjects('*')], - effect: iam.Effect.ALLOW, - })); - sourceKmsKey.grantDecrypt(this.replicationRole); - destinationKmsKey.grantEncrypt(this.replicationRole); + this.sourceBucket.grantReplicationPermission(this.replicationRole, { + sourceDecryptionKey: sourceKmsKey, + destinations: [ + { encryptionKey: destinationKmsKey, bucket: this.destinationBucket }, + ], + }); } } diff --git a/packages/aws-cdk-lib/aws-s3/README.md b/packages/aws-cdk-lib/aws-s3/README.md index eeb3191fbff9e..8f197f1b0b8f2 100644 --- a/packages/aws-cdk-lib/aws-s3/README.md +++ b/packages/aws-cdk-lib/aws-s3/README.md @@ -941,11 +941,14 @@ To replicate objects to a destination bucket, you can specify the `replicationRu declare const destinationBucket1: s3.IBucket; declare const destinationBucket2: s3.IBucket; declare const replicationRole: iam.IRole; -declare const kmsKey: kms.IKey; +declare const encryptionKey: kms.IKey; +declare const destinationEncryptionKey: kms.IKey; const sourceBucket = new s3.Bucket(this, 'SourceBucket', { // Versioning must be enabled on both the source and destination bucket versioned: true, + // Optional. Specify the KMS key to use for encrypts objects in the source bucket. + encryptionKey, // Optional. If not specified, a new role will be created. replicationRole, replicationRules: [ @@ -970,7 +973,7 @@ const sourceBucket = new s3.Bucket(this, 'SourceBucket', { // If set, metrics will be output to indicate whether replication by S3 RTC took longer than the configured time. metrics: s3.ReplicationTimeValue.FIFTEEN_MINUTES, // The kms key to use for the destination bucket. - kmsKey, + kmsKey: destinationEncryptionKey, // The storage class to use for the destination bucket. storageClass: s3.StorageClass.INFREQUENT_ACCESS, // Whether to replicate objects with SSE-KMS encryption. @@ -997,6 +1000,20 @@ const sourceBucket = new s3.Bucket(this, 'SourceBucket', { }, ], }); + +// Grant permissions to the replication role. +// This method is not required if you choose to use an auto-generated replication role or manually grant permissions. +sourceBucket.grantReplicationPermission(replicationRole, { + // Optional. Specify the KMS key to use for decrypting objects in the source bucket. + sourceDecryptionKey: encryptionKey, + destinations: [ + { bucket: destinationBucket1 }, + { bucket: destinationBucket2, encryptionKey: destinationEncryptionKey }, + ], + // The 'encryptionKey' property within the 'destinations' array is optional. + // If not specified for a destination bucket, this method assumes that + // given destination bucket is not encrypted. +}); ``` ### Cross Account Replication diff --git a/packages/aws-cdk-lib/aws-s3/lib/bucket.ts b/packages/aws-cdk-lib/aws-s3/lib/bucket.ts index 5169180ac5d5b..3f5cc314e1d01 100644 --- a/packages/aws-cdk-lib/aws-s3/lib/bucket.ts +++ b/packages/aws-cdk-lib/aws-s3/lib/bucket.ts @@ -265,6 +265,17 @@ export interface IBucket extends IResource { */ grantReadWrite(identity: iam.IGrantable, objectsKeyPattern?: any): iam.Grant; + /** + * Allows permissions for replication operation to bucket replication role. + * + * If an encryption key is used, permission to use the key for + * encrypt/decrypt will also be granted. + * + * @param identity The principal + * @param props The properties of the replication source and destination buckets. + */ + grantReplicationPermission(identity: iam.IGrantable, props: GrantReplicationPermissionProps): void; + /** * Allows unrestricted access to objects from this bucket. * @@ -496,6 +507,45 @@ export interface BucketAttributes { readonly notificationsHandlerRole?: iam.IRole; } +/** + * The properties for the destination bucket for granting replication permission. + */ +export interface GrantReplicationPermissionDestinationProps { + /** + * The destination bucket + */ + readonly bucket: IBucket; + + /** + * The KMS key to use for encryption if a destination bucket needs to be encrypted with a customer-managed KMS key. + * + * @default - no KMS key is used for replication. + */ + readonly encryptionKey?: kms.IKey; +} + +/** + * The properties for the destination bucket for granting replication permission. + */ +export interface GrantReplicationPermissionProps { + /** + * The KMS key used to decrypt objects in the source bucket for replication. + * **Required if** the source bucket is encrypted with a customer-managed KMS key. + * + * @default - it's assumed the source bucket is not encrypted with a customer-managed KMS key. + */ + readonly sourceDecryptionKey?: kms.IKey; + + /** + * The destination buckets for replication. + * Specify the KMS key to use for encryption if a destination bucket needs to be encrypted with a customer-managed KMS key. + * Required one or more destination buckets. + * + * @default - empty array + */ + readonly destinations: GrantReplicationPermissionDestinationProps[]; +} + /** * Represents an S3 Bucket. * @@ -845,6 +895,55 @@ export abstract class BucketBase extends Resource implements IBucket { this.arnForObjects(objectsKeyPattern)); } + /** + * Grant replication permission to a principal. + * This method allows the principal to perform replication operations on this bucket. + * + * Note that when calling this function for source or destination buckets that support KMS encryption, + * you need to specify the KMS key for encryption and the KMS key for decryption, respectively. + * + * @param identity The principal to grant replication permission to. + * @param props The properties of the replication source and destination buckets. + */ + public grantReplicationPermission(identity: iam.IGrantable, props: GrantReplicationPermissionProps): void { + if (props.destinations.length === 0) { + throw new ValidationError('destinations must be specified', this); + } + + // add permissions to the role + // @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html + iam.Grant.addToPrincipalOrResource({ + grantee: identity, + actions: ['s3:GetReplicationConfiguration', 's3:ListBucket'], + resourceArns: [Lazy.string({ produce: () => this.bucketArn })], + resource: this, + }); + + iam.Grant.addToPrincipalOrResource({ + grantee: identity, + actions: ['s3:GetObjectVersionForReplication', 's3:GetObjectVersionAcl', 's3:GetObjectVersionTagging'], + resourceArns: [Lazy.string({ produce: () => this.arnForObjects('*') })], + resource: this, + }); + + const destinationBuckets = props.destinations.map(destination => destination.bucket); + if (destinationBuckets.length > 0) { + iam.Grant.addToPrincipalOrResource({ + grantee: identity, + actions: ['s3:ReplicateObject', 's3:ReplicateDelete', 's3:ReplicateTags', 's3:ObjectOwnerOverrideToBucketOwner'], + resourceArns: destinationBuckets.map(bucket => Lazy.string({ produce: () => bucket.arnForObjects('*') })), + resource: this, + }); + } + + props.destinations.forEach(destination => { + destination.encryptionKey?.grantEncrypt(identity); + }); + + // If KMS key encryption is enabled on the source bucket, configure the decrypt permissions. + this.encryptionKey?.grantDecrypt(identity); + } + /** * Allows unrestricted access to objects from this bucket. * @@ -2811,9 +2910,6 @@ export class Bucket extends BucketBase { } }); - const destinationBuckets = props.replicationRules.map(rule => rule.destination); - const kmsKeys = props.replicationRules.map(rule => rule.kmsKey).filter(kmsKey => kmsKey !== undefined) as kms.IKey[]; - let replicationRole: iam.IRole; if (!props.replicationRole) { replicationRole = new iam.Role(this, 'ReplicationRole', { @@ -2821,32 +2917,13 @@ export class Bucket extends BucketBase { roleName: FeatureFlags.of(this).isEnabled(cxapi.SET_UNIQUE_REPLICATION_ROLE_NAME) ? PhysicalName.GENERATE_IF_NEEDED : 'CDKReplicationRole', }); - // add permissions to the role - // @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html - replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:GetReplicationConfiguration', 's3:ListBucket'], - resources: [Lazy.string({ produce: () => this.bucketArn })], - effect: iam.Effect.ALLOW, - })); - replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:GetObjectVersionForReplication', 's3:GetObjectVersionAcl', 's3:GetObjectVersionTagging'], - resources: [Lazy.string({ produce: () => this.arnForObjects('*') })], - effect: iam.Effect.ALLOW, - })); - if (destinationBuckets.length > 0) { - replicationRole.addToPrincipalPolicy(new iam.PolicyStatement({ - actions: ['s3:ReplicateObject', 's3:ReplicateDelete', 's3:ReplicateTags', 's3:ObjectOwnerOverrideToBucketOwner'], - resources: destinationBuckets.map(bucket => bucket.arnForObjects('*')), - effect: iam.Effect.ALLOW, - })); - } - - kmsKeys.forEach(kmsKey => { - kmsKey.grantEncrypt(replicationRole); + this.grantReplicationPermission(replicationRole, { + sourceDecryptionKey: props.encryptionKey, + destinations: props.replicationRules.map(rule => ({ + encryptionKey: rule.kmsKey, + bucket: rule.destination, + })), }); - - // If KMS key encryption is enabled on the source bucket, configure the decrypt permissions. - this.encryptionKey?.grantDecrypt(replicationRole); } else { replicationRole = props.replicationRole; } diff --git a/packages/aws-cdk-lib/aws-s3/test/bucket.test.ts b/packages/aws-cdk-lib/aws-s3/test/bucket.test.ts index e6319a2b97c1f..221c54b7723be 100644 --- a/packages/aws-cdk-lib/aws-s3/test/bucket.test.ts +++ b/packages/aws-cdk-lib/aws-s3/test/bucket.test.ts @@ -4175,6 +4175,198 @@ describe('bucket', () => { Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 1); }); + test('grant permissions to custom replication role', () => { + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'stack'); + const dstEncryptionKey = new kms.Key(stack, 'DstEncryptionKey'); + const srcEncryptionKey = new kms.Key(stack, 'SrcEncryptionKey'); + const dstBucket = new s3.Bucket(stack, 'DstBucket', { + encryptionKey: dstEncryptionKey, + }); + const dstBucketNoEncryption = new s3.Bucket(stack, 'DstBucketNoEncryption'); + const replicationRole = new iam.Role(stack, 'ReplicationRole', { + assumedBy: new iam.ServicePrincipal('s3.amazonaws.com'), + }); + + (srcEncryptionKey.node.defaultChild as kms.CfnKey).overrideLogicalId('SrcEncryptionKey'); + (dstEncryptionKey.node.defaultChild as kms.CfnKey).overrideLogicalId('DstEncryptionKey'); + (dstBucket.node.defaultChild as s3.CfnBucket).overrideLogicalId('DstBucket'); + (dstBucketNoEncryption.node.defaultChild as s3.CfnBucket).overrideLogicalId('DstBucketNoEncryption'); + (replicationRole.node.defaultChild as iam.CfnRole).overrideLogicalId('CustomReplicationRole'); + + const bucket = new s3.Bucket(stack, 'SrcBucket', { + versioned: true, + replicationRole, + encryptionKey: srcEncryptionKey, + replicationRules: [ + { destination: dstBucket, kmsKey: dstEncryptionKey, priority: 1 }, + { destination: dstBucketNoEncryption, priority: 2 }, + ], + }); + (bucket.node.defaultChild as s3.CfnBucket).overrideLogicalId('SrcBucket'); + bucket.grantReplicationPermission(replicationRole, { + sourceDecryptionKey: srcEncryptionKey, + destinations: [{ + bucket: dstBucket, + encryptionKey: dstEncryptionKey, + }], + }); + + Template.fromStack(stack).hasResourceProperties('AWS::S3::Bucket', { + VersioningConfiguration: { Status: 'Enabled' }, + ReplicationConfiguration: { + Role: { + 'Fn::GetAtt': ['CustomReplicationRole', 'Arn'], + }, + Rules: [ + { + Priority: 1, + Destination: { + Bucket: { + 'Fn::GetAtt': ['DstBucket', 'Arn'], + }, + }, + Status: 'Enabled', + Filter: { + Prefix: '', + }, + DeleteMarkerReplication: { + Status: 'Disabled', + }, + }, + { + Priority: 2, + Destination: { + Bucket: { + 'Fn::GetAtt': ['DstBucketNoEncryption', 'Arn'], + }, + }, + Status: 'Enabled', + Filter: { + Prefix: '', + }, + DeleteMarkerReplication: { + Status: 'Disabled', + }, + }, + ], + }, + }); + + // assert that the built-in replication role is not created + Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 1); + + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: { + Statement: [ + { + Action: ['s3:GetReplicationConfiguration', 's3:ListBucket'], + Effect: 'Allow', + Resource: { + 'Fn::GetAtt': ['SrcBucket', 'Arn'], + }, + }, + { + Action: [ + 's3:GetObjectVersionForReplication', + 's3:GetObjectVersionAcl', + 's3:GetObjectVersionTagging', + ], + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'SrcBucket', + 'Arn', + ], + }, + '/*', + ], + ], + }, + }, + { + Action: [ + 's3:ReplicateObject', + 's3:ReplicateDelete', + 's3:ReplicateTags', + 's3:ObjectOwnerOverrideToBucketOwner', + ], + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'DstBucket', + 'Arn', + ], + }, + '/*', + ], + ], + }, + }, + { + Action: [ + 'kms:Encrypt', + 'kms:ReEncrypt*', + 'kms:GenerateDataKey*', + ], + Effect: 'Allow', + Resource: { + 'Fn::GetAtt': [ + 'DstEncryptionKey', + 'Arn', + ], + }, + }, + { + Action: 'kms:Decrypt', + Effect: 'Allow', + Resource: { + 'Fn::GetAtt': ['SrcEncryptionKey', 'Arn'], + }, + }, + ], + 'Version': '2012-10-17', + }, + Roles: [ + { + 'Ref': 'CustomReplicationRole', + }, + ], + }); + }); + + test('throw error when attempting to grant permissions with no destinations', () => { + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'stack'); + const dstBucket = new s3.Bucket(stack, 'DstBucket'); + const dstBucketNoEncryption = new s3.Bucket(stack, 'DstBucketNoEncryption'); + const replicationRole = new iam.Role(stack, 'ReplicationRole', { + assumedBy: new iam.ServicePrincipal('s3.amazonaws.com'), + }); + + const bucket = new s3.Bucket(stack, 'SrcBucket', { + versioned: true, + replicationRole, + replicationRules: [ + { destination: dstBucket, priority: 1 }, + ], + }); + + expect(() => { + bucket.grantReplicationPermission(replicationRole, { + destinations: [], + }); + }).toThrow('destinations must be specified'); + }); + test('cross account', () => { const app = new cdk.App(); const stack = new cdk.Stack(app, 'stack', {