ResultWriter - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ResultWriter

ResultWriter 字段是一个 JSON 对象,用于指定 Step Functions 将分布式 Map 状态 启动的子工作流执行结果写入 Amazon S3 的位置。默认情况下,Step Functions 不会导出这些结果。

重要

确保您用于导出 Map Run 结果的 Amazon S3 存储桶与状态机位于同一个 Amazon Web Services 账户和 Amazon Web Services 区域下。否则,您的状态机执行将因 States.ResultWriterFailed 错误而失败。

如果您的输出有效负载大小超过 256 KB,将结果导出到 Amazon S3 存储桶会很有帮助。Step Functions 整合了所有子工作流执行数据,例如执行输入和输出、ARN 和执行状态。然后,它将状态相同的执行导出到指定 Amazon S3 位置的相应文件中。以下示例显示了导出子工作流执行结果时 ResultWriter 字段的语法。在此示例中,您将结果存储在名为 myOutputBucket 存储桶种,该存储桶位于名为 csvProcessJobs 的前缀中。

{ "ResultWriter": { "Resource": "arn:aws:states:::s3:putObject", "Parameters": { "Bucket": "myOutputBucket", "Prefix": "csvProcessJobs" } } }
提示

在 Workflow Studio 中,您可以通过选择将 Map 状态结果导出到 Amazon S3 来导出子工作流执行结果。然后,提供您要将结果导出到其中的 Amazon S3 存储桶的名称和前缀。

Step Functions 需要适当的权限才能访问要导出结果的存储桶和文件夹。有关所需 IAM 策略的信息,请参阅 用于 ResultWriter 的 IAM 策略

如果要导出子工作流执行结果,分布式 Map 状态执行将按以下格式返回 Map Run ARN 以及有关 Amazon S3 导出位置的数据:

{ "MapRunArn": "arn:aws:states:us-east-2:123456789012:mapRun:csvProcess/Map:ad9b5f27-090b-3ac6-9beb-243cd77144a7", "ResultWriterDetails": { "Bucket": "myOutputBucket", "Key": "csvProcessJobs/ad9b5f27-090b-3ac6-9beb-243cd77144a7/manifest.json" } }

Step Functions 将具有相同状态的执行结果导出到各自的文件中。例如,如果您的子工作流执行结果为 500 个成功和 200 个失败,则 Step Functions 将在指定的 Amazon S3 位置为成功和失败结果创建两个文件。在此示例中,成功结果文件包含 500 个成功结果,而失败结果文件包含 200 个失败结果。

对于给定的执行尝试,Step Functions 会根据您的执行输出在指定的 Amazon S3 位置创建以下文件:

  • manifest.json – 包含 Map Run 元数据,例如导出位置、Map Run ARN 以及有关结果文件的信息。

    如果您redriven了 Map Run,manifest.json 文件会包含 Map Run 的所有尝试中所有成功子工作流执行的引用。但是,此文件包含对特定redrive的失败和待执行的引用。

  • SUCCEEDED_n.json – 包含所有成功执行子工作流的合并数据。n 表示文件的索引号。索引号从 0 开始。例如,SUCCEEDED_1.json

  • FAILED_n.json – 包含所有失败、超时和中止的子工作流执行的合并数据。使用此文件从失败的执行中恢复。n 表示文件的索引。索引号从 0 开始。例如,FAILED_1.json

  • PENDING_n.json – 包含由于 Map Run 失败或中止而未启动的所有子工作流执行的合并数据。n 表示文件的索引。索引号从 0 开始。例如,PENDING_1.json

Step Functions 支持最大为 5 GB 的单个结果文件。如果文件大小超过 5 GB,Step Functions 会创建另一个文件来写入超出部分的执行结果,并在文件名后面附加一个索引号。例如,如果 Succeeded_0.json 文件的大小超过 5 GB,Step Functions 会创建一个 Succeeded_1.json 文件来记录超出部分结果。

如果您未指定导出子工作流执行结果,则状态机执行将返回子工作流执行结果数组,如以下示例所示:

注意

如果返回的输出大小超过 256 KB,则状态机执行失败并返回一个 States.DataLimitExceeded 错误。

[ { "statusCode": 200, "inputReceived": { "show_id": "s1", "release_year": "2020", "rating": "PG-13", "type": "Movie" } }, { "statusCode": 200, "inputReceived": { "show_id": "s2", "release_year": "2021", "rating": "TV-MA", "type": "TV Show" } }, ... ]

用于 ResultWriter 的 IAM 策略

当您使用 Step Functions 控制台创建工作流时,Step Functions 可以根据工作流定义中的资源自动生成 IAM 策略。这些策略包括允许状态机角色调用分布式 Map 状态StartExecution API 操作所需的最低权限。这些策略还包括 Step Functions 访问 Amazon 资源(例如 Amazon S3 存储桶和对象以及 Lambda 函数)所需的最低权限。我们建议在您的 IAM 策略中仅包含这些必需的权限。例如,如果您的工作流包含分布式模式下的 Map 状态,则将策略范围缩小到包含您的数据集的特定 Amazon S3 存储桶和文件夹。

重要

如果您在分布式 Map 状态 输入中指定了 Amazon S3 存储桶和对象或前缀,并将参考路径指向现有键值对,请务必更新工作流程的 IAM 策略。将策略范围缩小到运行时该路径解析到的存储桶和对象名称。

下面的 IAM 策略示例授予使用 PutObject API 操作将子工作流执行结果写入 Amazon S3 存储桶中名为 csvJobs 的文件夹所需的最低权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": [ "arn:aws:s3:::resultBucket/csvJobs/*" ] } ] }

如果要将子工作流执行结果写入的 Amazon S3 存储桶使用 Amazon Key Management Service (Amazon KMS) 密钥加密,则必须在 IAM 策略中包含必要的 Amazon KMS 权限。有关更多信息,请参阅Amazon KMS key 加密的 Amazon S3 存储桶的 IAM 权限