From 7044eef9cabfdb096b911d9286aeeec777dc0c61 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Tue, 28 Oct 2025 22:11:12 +0000 Subject: [PATCH] feat(stepfunctions): expectedBucketOwner parameter for cross-account s3 access --- ...efaultTestDeployAssertFD6CBCC4.assets.json | 14 ++++---- ...aultTestDeployAssertFD6CBCC4.template.json | 14 ++++---- .../index.js | 33 +++++++++++++------ .../aws-stepfunctions-map-integ.assets.json | 6 ++-- .../aws-stepfunctions-map-integ.template.json | 6 +++- .../manifest.json | 15 +++++++-- .../tree.json | 2 +- .../test/integ.distributed-map.ts | 1 + .../aws-cdk-lib/aws-stepfunctions/README.md | 14 ++++++++ .../lib/states/distributed-map/item-reader.ts | 25 ++++++++++++++ .../test/distributed-map.test.ts | 10 ++++++ 11 files changed, 109 insertions(+), 31 deletions(-) rename packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/{asset.4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.bundle => asset.c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.bundle}/index.js (99%) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.assets.json index 7bd7c4dc7eac3..248b17cb07a57 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.assets.json @@ -1,29 +1,29 @@ { "version": "48.0.0", "files": { - "4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276": { + "c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564": { "source": { - "path": "asset.4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.bundle", + "path": "asset.c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.bundle", "packaging": "zip" }, "destinations": { - "current_account-current_region-26dc760b": { + "current_account-current_region-ddc2bfd5": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.zip", + "objectKey": "c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "54ebc1430aa55003e5efac5bff0b8195f6ddf01060fccef64348d96eb4671712": { + "572603bef242573e8e8ba938ec801bbe111b182a8c53fdbb122ffe96029f4e61": { "displayName": "DistributedMapDefaultTestDeployAssertFD6CBCC4 Template", "source": { "path": "DistributedMapDefaultTestDeployAssertFD6CBCC4.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region-18734f36": { + "current_account-current_region-6873e88d": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "54ebc1430aa55003e5efac5bff0b8195f6ddf01060fccef64348d96eb4671712.json", + "objectKey": "572603bef242573e8e8ba938ec801bbe111b182a8c53fdbb122ffe96029f4e61.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-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.template.json index 484605ed884a1..04157900cd9e2 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/DistributedMapDefaultTestDeployAssertFD6CBCC4.template.json @@ -30,7 +30,7 @@ } }, "flattenResponse": "false", - "salt": "1759420779973" + "salt": "1761674079278" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -246,7 +246,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.zip" + "S3Key": "c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.zip" }, "Timeout": 120, "Handler": "index.handler", @@ -316,7 +316,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.zip" + "S3Key": "c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.zip" }, "Timeout": 120, "Handler": "index.isComplete", @@ -358,7 +358,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.zip" + "S3Key": "c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.zip" }, "Timeout": 120, "Handler": "index.onTimeout", @@ -398,7 +398,7 @@ "Body": "\"a,b,c\\n1,2,3\\n4,5,6\"" }, "flattenResponse": "false", - "salt": "1759420779976" + "salt": "1761674079281" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -432,7 +432,7 @@ "outputPaths": [ "executionArn" ], - "salt": "1759420779976" + "salt": "1761674079281" }, "DependsOn": [ "AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee" @@ -473,7 +473,7 @@ } }, "flattenResponse": "false", - "salt": "1759420779977" + "salt": "1761674079282" }, "DependsOn": [ "AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.bundle/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.bundle/index.js similarity index 99% rename from packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.bundle/index.js rename to packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.bundle/index.js index f9b2ff374dee1..9c552c003f4e8 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.4e818c462cf84c112f84262d376efd099d66da03f7a2aabae64c50c0511de276.bundle/index.js +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/asset.c11608a15785084ea1afe65826e575ee316add10c8b1bb373e93297e26aec564.bundle/index.js @@ -1,3 +1,4 @@ +"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; @@ -63,14 +64,18 @@ var init_matcher = __esm({ } }; MatchResult = class { + /** + * The target for which this result was generated. + */ + target; + failuresHere = /* @__PURE__ */ new Map(); + captures = /* @__PURE__ */ new Map(); + finalized = false; + innerMatchFailures = /* @__PURE__ */ new Map(); + _hasFailed = false; + _failCount = 0; + _cost = 0; constructor(target) { - this.failuresHere = /* @__PURE__ */ new Map(); - this.captures = /* @__PURE__ */ new Map(); - this.finalized = false; - this.innerMatchFailures = /* @__PURE__ */ new Map(); - this._hasFailed = false; - this._failCount = 0; - this._cost = 0; this.target = target; } /** @@ -403,9 +408,7 @@ var init_sparse_matrix = __esm({ "../../aws-cdk-lib/assertions/lib/private/sparse-matrix.ts"() { "use strict"; SparseMatrix = class { - constructor() { - this.matrix = /* @__PURE__ */ new Map(); - } + matrix = /* @__PURE__ */ new Map(); get(row, col) { return this.matrix.get(row)?.get(col); } @@ -532,6 +535,7 @@ var init_match = __esm({ throw new AssertionError("LiteralMatch cannot directly contain another matcher. Remove the top-level matcher or nest it more deeply."); } } + partialObjects; test(actual) { if (Array.isArray(this.pattern)) { return new ArrayMatch(this.name, this.pattern, { subsequence: false, partialObjects: this.partialObjects }).test(actual); @@ -566,6 +570,8 @@ var init_match = __esm({ this.subsequence = options.subsequence ?? true; this.partialObjects = options.partialObjects ?? false; } + subsequence; + partialObjects; test(actual) { if (!Array.isArray(actual)) { return new MatchResult(actual).recordFailure({ @@ -666,6 +672,7 @@ var init_match = __esm({ this.pattern = pattern; this.partial = options.partial ?? true; } + partial; test(actual) { if (typeof actual !== "object" || Array.isArray(actual)) { return new MatchResult(actual).recordFailure({ @@ -30149,6 +30156,12 @@ var init_api_call = __esm({ init_find_client_constructor(); init_sdk_info(); ApiCall = class { + service; + action; + v3PackageName; + v3Package; + // For testing purposes + client; // For testing purposes constructor(service, action) { this.service = normalizeServiceName(service); diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.assets.json index d89ea445cbf72..b3b4c0e51ddb7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.assets.json @@ -15,16 +15,16 @@ } } }, - "8d768be56bcd120c52ac55553dff8f57a83958b156b14d98cd3a01189e498be1": { + "d8fe8fb1c7f6ef1a66d70227493d6ef22ac55eded327cdce43c74432029202a1": { "displayName": "aws-stepfunctions-map-integ Template", "source": { "path": "aws-stepfunctions-map-integ.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region-48d39f6f": { + "current_account-current_region-ca470a33": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "8d768be56bcd120c52ac55553dff8f57a83958b156b14d98cd3a01189e498be1.json", + "objectKey": "d8fe8fb1c7f6ef1a66d70227493d6ef22ac55eded327cdce43c74432029202a1.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-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.template.json index 200adc9711758..baf4b945d6e62 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/aws-stepfunctions-map-integ.template.json @@ -210,7 +210,11 @@ { "Ref": "Bucket83908E77" }, - "\",\"Key\":\"my-key.csv\"}}}}}" + "\",\"Key\":\"my-key.csv\",\"ExpectedBucketOwner\":\"", + { + "Ref": "AWS::AccountId" + }, + "\"}}}}}" ] ] }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/manifest.json index 8e13470c0f932..a978e8ea5425d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.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}/8d768be56bcd120c52ac55553dff8f57a83958b156b14d98cd3a01189e498be1.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d8fe8fb1c7f6ef1a66d70227493d6ef22ac55eded327cdce43c74432029202a1.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -310,7 +310,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}/54ebc1430aa55003e5efac5bff0b8195f6ddf01060fccef64348d96eb4671712.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/572603bef242573e8e8ba938ec801bbe111b182a8c53fdbb122ffe96029f4e61.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -990,6 +990,17 @@ "userValue": true, "recommendedValue": true, "explanation": "When enabled, CDK creates and manages loggroup for the lambda function" + }, + "@aws-cdk/aws-stepfunctions-tasks:httpInvokeDynamicJsonPathEndpoint": { + "recommendedValue": true, + "explanation": "When enabled, allows using a dynamic apiEndpoint with JSONPath format in HttpInvoke tasks.", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-ecs-patterns:uniqueTargetGroupId": { + "recommendedValue": true, + "explanation": "When enabled, ECS patterns will generate unique target group IDs to prevent conflicts during load balancer replacement" } } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/tree.json index c92ef357f0b8c..bedddd3c9f7f6 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.js.snapshot/tree.json @@ -1 +1 @@ -{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-stepfunctions-map-integ":{"id":"aws-stepfunctions-map-integ","path":"aws-stepfunctions-map-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Bucket":{"id":"Bucket","path":"aws-stepfunctions-map-integ/Bucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"autoDeleteObjects":true,"removalPolicy":"destroy"}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/Bucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"aws-stepfunctions-map-integ/Bucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/Bucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"Bucket83908E77"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"aws-stepfunctions-map-integ/Bucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-stepfunctions-map-integ/Bucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"DistributedMap":{"id":"DistributedMap","path":"aws-stepfunctions-map-integ/DistributedMap","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.DistributedMap","version":"0.0.0"}},"Pass":{"id":"Pass","path":"aws-stepfunctions-map-integ/Pass","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Pass","version":"0.0.0"}},"StateMachine":{"id":"StateMachine","path":"aws-stepfunctions-map-integ/StateMachine","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.StateMachine","version":"0.0.0","metadata":[{"definition":"*"},{"addToRolePolicy":[{}]}]},"children":{"Role":{"id":"Role","path":"aws-stepfunctions-map-integ/StateMachine/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-stepfunctions-map-integ/StateMachine/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"states.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-stepfunctions-map-integ/StateMachine/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"s3:GetObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"Bucket83908E77"},"/*"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineRoleDefaultPolicyDF1E6607","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.CfnStateMachine","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::StepFunctions::StateMachine","aws:cdk:cloudformation:props":{"definitionString":{"Fn::Join":["",["{\"StartAt\":\"DistributedMap\",\"States\":{\"DistributedMap\":{\"Type\":\"Map\",\"End\":true,\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"DISTRIBUTED\",\"ExecutionType\":\"STANDARD\"},\"StartAt\":\"Pass\",\"States\":{\"Pass\":{\"Type\":\"Pass\",\"End\":true}}},\"ItemReader\":{\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::s3:getObject\",\"ReaderConfig\":{\"InputType\":\"CSV\",\"CSVHeaderLocation\":\"FIRST_ROW\"},\"Parameters\":{\"Bucket\":\"",{"Ref":"Bucket83908E77"},"\",\"Key\":\"my-key.csv\"}}}}}"]]},"roleArn":{"Fn::GetAtt":["StateMachineRoleB840431D","Arn"]}}}},"DistributedMapPolicy":{"id":"DistributedMapPolicy","path":"aws-stepfunctions-map-integ/StateMachine/DistributedMapPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/DistributedMapPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"states:StartExecution","Effect":"Allow","Resource":{"Ref":"StateMachine2E01A3A5"}},{"Action":["states:DescribeExecution","states:StopExecution"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":states:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":execution:",{"Fn::Select":[6,{"Fn::Split":[":",{"Ref":"StateMachine2E01A3A5"}]}]},":*"]]}},{"Action":"states:RedriveExecution","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":states:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":execution:",{"Fn::Select":[6,{"Fn::Split":[":",{"Ref":"StateMachine2E01A3A5"}]}]},"/*:*"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineDistributedMapPolicy57C9D8C2","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Exports":{"id":"Exports","path":"aws-stepfunctions-map-integ/Exports","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Output{\"Ref\":\"StateMachine2E01A3A5\"}":{"id":"Output{\"Ref\":\"StateMachine2E01A3A5\"}","path":"aws-stepfunctions-map-integ/Exports/Output{\"Ref\":\"StateMachine2E01A3A5\"}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"Output{\"Ref\":\"Bucket83908E77\"}":{"id":"Output{\"Ref\":\"Bucket83908E77\"}","path":"aws-stepfunctions-map-integ/Exports/Output{\"Ref\":\"Bucket83908E77\"}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-stepfunctions-map-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-stepfunctions-map-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"DistributedMap":{"id":"DistributedMap","path":"DistributedMap","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"DistributedMap/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DistributedMap/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa":{"id":"AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee":{"id":"AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa":{"id":"AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868":{"id":"AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"DistributedMap/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"DistributedMap/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-stepfunctions-map-integ":{"id":"aws-stepfunctions-map-integ","path":"aws-stepfunctions-map-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Bucket":{"id":"Bucket","path":"aws-stepfunctions-map-integ/Bucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"autoDeleteObjects":true,"removalPolicy":"destroy"}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/Bucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"aws-stepfunctions-map-integ/Bucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/Bucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"Bucket83908E77"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"aws-stepfunctions-map-integ/Bucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-stepfunctions-map-integ/Bucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-stepfunctions-map-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"DistributedMap":{"id":"DistributedMap","path":"aws-stepfunctions-map-integ/DistributedMap","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.DistributedMap","version":"0.0.0"}},"Pass":{"id":"Pass","path":"aws-stepfunctions-map-integ/Pass","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Pass","version":"0.0.0"}},"StateMachine":{"id":"StateMachine","path":"aws-stepfunctions-map-integ/StateMachine","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.StateMachine","version":"0.0.0","metadata":[{"definition":"*"},{"addToRolePolicy":[{}]}]},"children":{"Role":{"id":"Role","path":"aws-stepfunctions-map-integ/StateMachine/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-stepfunctions-map-integ/StateMachine/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"states.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-stepfunctions-map-integ/StateMachine/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"s3:GetObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"Bucket83908E77"},"/*"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineRoleDefaultPolicyDF1E6607","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.CfnStateMachine","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::StepFunctions::StateMachine","aws:cdk:cloudformation:props":{"definitionString":{"Fn::Join":["",["{\"StartAt\":\"DistributedMap\",\"States\":{\"DistributedMap\":{\"Type\":\"Map\",\"End\":true,\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"DISTRIBUTED\",\"ExecutionType\":\"STANDARD\"},\"StartAt\":\"Pass\",\"States\":{\"Pass\":{\"Type\":\"Pass\",\"End\":true}}},\"ItemReader\":{\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::s3:getObject\",\"ReaderConfig\":{\"InputType\":\"CSV\",\"CSVHeaderLocation\":\"FIRST_ROW\"},\"Parameters\":{\"Bucket\":\"",{"Ref":"Bucket83908E77"},"\",\"Key\":\"my-key.csv\",\"ExpectedBucketOwner\":\"",{"Ref":"AWS::AccountId"},"\"}}}}}"]]},"roleArn":{"Fn::GetAtt":["StateMachineRoleB840431D","Arn"]}}}},"DistributedMapPolicy":{"id":"DistributedMapPolicy","path":"aws-stepfunctions-map-integ/StateMachine/DistributedMapPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-stepfunctions-map-integ/StateMachine/DistributedMapPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"states:StartExecution","Effect":"Allow","Resource":{"Ref":"StateMachine2E01A3A5"}},{"Action":["states:DescribeExecution","states:StopExecution"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":states:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":execution:",{"Fn::Select":[6,{"Fn::Split":[":",{"Ref":"StateMachine2E01A3A5"}]}]},":*"]]}},{"Action":"states:RedriveExecution","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":states:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":execution:",{"Fn::Select":[6,{"Fn::Split":[":",{"Ref":"StateMachine2E01A3A5"}]}]},"/*:*"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineDistributedMapPolicy57C9D8C2","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Exports":{"id":"Exports","path":"aws-stepfunctions-map-integ/Exports","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Output{\"Ref\":\"StateMachine2E01A3A5\"}":{"id":"Output{\"Ref\":\"StateMachine2E01A3A5\"}","path":"aws-stepfunctions-map-integ/Exports/Output{\"Ref\":\"StateMachine2E01A3A5\"}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"Output{\"Ref\":\"Bucket83908E77\"}":{"id":"Output{\"Ref\":\"Bucket83908E77\"}","path":"aws-stepfunctions-map-integ/Exports/Output{\"Ref\":\"Bucket83908E77\"}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-stepfunctions-map-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-stepfunctions-map-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"DistributedMap":{"id":"DistributedMap","path":"DistributedMap","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"DistributedMap/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DistributedMap/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa":{"id":"AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeStateMachinec5cc0786542148808c24d8ebf111c7aa/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"DistributedMap/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee":{"id":"AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallS3putObject9f7ed865afc47100b3c2a9fea2cf51ee/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa":{"id":"AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsstartExecutionc5cc0786542148808c24d8ebf111c7aa/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868":{"id":"AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"DistributedMap/DefaultTest/DeployAssert/AwsApiCallStepFunctionsdescribeExecution7e7cfa5e3c60aef760b5fbff9448d868/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"DistributedMap/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"DistributedMap/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","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-stepfunctions/test/integ.distributed-map.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.ts index 7f7a33da53d8d..bbc084962c9e7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions/test/integ.distributed-map.ts @@ -22,6 +22,7 @@ class DistributedMapStack extends cdk.Stack { bucket: this.bucket, key: CSV_KEY, csvHeaders: sfn.CsvHeaders.useFirstRow(), + expectedBucketOwner: this.account, }), resultWriter: new sfn.ResultWriter({ bucket: this.bucket, diff --git a/packages/aws-cdk-lib/aws-stepfunctions/README.md b/packages/aws-cdk-lib/aws-stepfunctions/README.md index 55451f70f2bbd..1359acb7b23ea 100644 --- a/packages/aws-cdk-lib/aws-stepfunctions/README.md +++ b/packages/aws-cdk-lib/aws-stepfunctions/README.md @@ -1033,6 +1033,20 @@ distributedMap.itemProcessor(new sfn.Pass(this, 'Pass State')); ``` * CSV file stored in S3 * S3 inventory manifest stored in S3 +* When your Step Functions state machine needs to read S3 objects from a bucket in a different AWS account, specify the bucket owner's [account ID](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindAccountId) using the `expectedBucketOwner` parameter: + + ```ts + import * as s3 from 'aws-cdk-lib/aws-s3'; + + const distributedMap = new sfn.DistributedMap(this, 'DistributedMap', { + itemReader: new sfn.S3JsonItemReader({ + bucket: s3.Bucket.fromBucketName(this, 'CrossAccountBucket', 'bucket-in-account-a'), + key: 'input.json', + expectedBucketOwner: '123456789012', , // Account ID that owns the bucket + }), + }); + distributedMap.itemProcessor(new sfn.Pass(this, 'Pass')); + ``` Map states in Distributed mode also support writing results of the iterator to an S3 bucket and optional prefix. Use a `ResultWriterV2` object provided via the optional `resultWriter` property to configure which S3 location iterator results will be written. The default behavior id `resultWriter` is omitted is to use the state output payload. However, if the iterator results are larger than the 256 kb limit for Step Functions payloads then the State Machine will fail. diff --git a/packages/aws-cdk-lib/aws-stepfunctions/lib/states/distributed-map/item-reader.ts b/packages/aws-cdk-lib/aws-stepfunctions/lib/states/distributed-map/item-reader.ts index d03a70926a4ba..37d158bea290f 100644 --- a/packages/aws-cdk-lib/aws-stepfunctions/lib/states/distributed-map/item-reader.ts +++ b/packages/aws-cdk-lib/aws-stepfunctions/lib/states/distributed-map/item-reader.ts @@ -70,6 +70,13 @@ export interface ItemReaderProps { * @default - Distributed Map state will iterate over all items provided by the ItemReader */ readonly maxItems?: number; + + /** + * The account ID of the expected bucket owner for cross-account access + * + * @default - No expected bucket owner validation + */ + readonly expectedBucketOwner?: string; } /** @@ -125,11 +132,19 @@ export class S3ObjectsItemReader implements IItemReader { */ readonly maxItems?: number; + /** + * The account ID of the expected bucket owner for cross-account access + * + * @default - No expected bucket owner validation + */ + readonly expectedBucketOwner?: string; + constructor(props: S3ObjectsItemReaderProps) { this._bucket = props.bucket; this.bucketNamePath = props.bucketNamePath; this.prefix = props.prefix; this.maxItems = props.maxItems; + this.expectedBucketOwner = props.expectedBucketOwner; this.resource = Arn.format({ region: '', account: '', @@ -150,6 +165,7 @@ export class S3ObjectsItemReader implements IItemReader { ...(this._bucket && { Bucket: this._bucket.bucketName }), ...(this.bucketNamePath && { Bucket: this.bucketNamePath }), ...(this.prefix && { Prefix: this.prefix }), + ...(this.expectedBucketOwner && { ExpectedBucketOwner: this.expectedBucketOwner }), }; return FieldUtils.renderObject({ Resource: this.resource, @@ -239,6 +255,13 @@ abstract class S3FileItemReader implements IItemReader { */ readonly maxItems?: number; + /** + * The account ID of the expected bucket owner for cross-account access + * + * @default - No expected bucket owner validation + */ + readonly expectedBucketOwner?: string; + protected abstract readonly inputType: string; constructor(props: S3FileItemReaderProps) { @@ -246,6 +269,7 @@ abstract class S3FileItemReader implements IItemReader { this.bucketNamePath = props.bucketNamePath; this.key = props.key; this.maxItems = props.maxItems; + this.expectedBucketOwner = props.expectedBucketOwner; this.resource = Arn.format({ region: '', account: '', @@ -266,6 +290,7 @@ abstract class S3FileItemReader implements IItemReader { ...(this._bucket && { Bucket: this._bucket.bucketName }), ...(this.bucketNamePath && { Bucket: this.bucketNamePath }), Key: this.key, + ...(this.expectedBucketOwner && { ExpectedBucketOwner: this.expectedBucketOwner }), }; return FieldUtils.renderObject({ diff --git a/packages/aws-cdk-lib/aws-stepfunctions/test/distributed-map.test.ts b/packages/aws-cdk-lib/aws-stepfunctions/test/distributed-map.test.ts index 53ca6c2c55903..ef610a221c1f8 100644 --- a/packages/aws-cdk-lib/aws-stepfunctions/test/distributed-map.test.ts +++ b/packages/aws-cdk-lib/aws-stepfunctions/test/distributed-map.test.ts @@ -219,6 +219,7 @@ describe('Distributed Map State', () => { bucket: readerBucket, prefix: 'test', maxItems: 10, + expectedBucketOwner: '1234567890', }), itemSelector: { foo: 'foo', @@ -270,6 +271,7 @@ describe('Distributed Map State', () => { Ref: stack.getLogicalId(readerBucket.node.defaultChild as s3.CfnBucket), }, Prefix: 'test', + ExpectedBucketOwner: '1234567890', }, }, MaxConcurrency: 1, @@ -289,6 +291,7 @@ describe('Distributed Map State', () => { itemReader: new jsonOrJsonlItemReader({ bucket: readerBucket, key: 'test.json', + expectedBucketOwner: '1234567890', }), itemSelector: { foo: 'foo', @@ -340,6 +343,7 @@ describe('Distributed Map State', () => { Ref: stack.getLogicalId(readerBucket.node.defaultChild as s3.CfnBucket), }, Key: 'test.json', + ExpectedBucketOwner: '1234567890', }, }, MaxConcurrency: 1, @@ -360,6 +364,7 @@ describe('Distributed Map State', () => { bucket: readerBucket, key: 'test.csv', csvHeaders: CsvHeaders.useFirstRow(), + expectedBucketOwner: '1234567890', }), itemSelector: { foo: 'foo', @@ -412,6 +417,7 @@ describe('Distributed Map State', () => { Ref: stack.getLogicalId(readerBucket.node.defaultChild as s3.CfnBucket), }, Key: 'test.csv', + ExpectedBucketOwner: '1234567890', }, }, MaxConcurrency: 1, @@ -432,6 +438,7 @@ describe('Distributed Map State', () => { bucket: readerBucket, key: 'test.json', csvHeaders: CsvHeaders.use(['header1', 'header2']), + expectedBucketOwner: '1234567890', }), itemSelector: { foo: 'foo', @@ -485,6 +492,7 @@ describe('Distributed Map State', () => { Ref: stack.getLogicalId(readerBucket.node.defaultChild as s3.CfnBucket), }, Key: 'test.json', + ExpectedBucketOwner: '1234567890', }, }, MaxConcurrency: 1, @@ -707,6 +715,7 @@ describe('Distributed Map State', () => { itemReader: new stepfunctions.S3ObjectsItemReader({ bucket: writerBucket, prefix: 'my-prefix', + expectedBucketOwner: '1234567890', }), }); map.itemProcessor(new stepfunctions.Pass(stack, 'Pass State')); @@ -737,6 +746,7 @@ describe('Distributed Map State', () => { Ref: 'TestBucket560B80BC', }, Prefix: 'my-prefix', + ExpectedBucketOwner: '1234567890', }, Resource: { 'Fn::Join': [