使用 Amazon S3 ARN 而不是传递大量有效负载 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon S3 ARN 而不是传递大量有效负载

可以终止在状态间传递大量数据负载的执行。如果您在各状态之间传递的数据可能增长到 256 KB 以上,请使用 Amazon Simple Storage Service (Amazon S3) 存储数据,并在 Payload 参数中解析存储桶的 Amazon 资源名称 (ARN),获取存储桶名称和密钥值。或者,您也可以调整实现,以便在执行中传递较少的负载。

在以下示例中,状态机将输入传递给一个 Amazon Lambda 函数,该函数处理 Amazon S3 存储桶中的 JSON 文件。运行此状态机后,Lambda 函数读取 JSON 文件的内容,并将文件内容作为输出返回。

创建 Lambda 函数

以下名为 pass-large-payload 的 Lambda 函数读取存储在特定 Amazon S3 存储桶中的 JSON 文件的内容。

注意

创建此 Lambda 函数后,请务必为其 IAM 角色提供相应的权限,使其能够从 Amazon S3 存储桶中读取。例如,将 AmazonS3ReadOnlyAccess 权限附加到 Lambda 函数的角色上。

import json import boto3 import io import os s3 = boto3.client('s3') def lambda_handler(event, context): event = event['Input'] final_json = str() s3 = boto3.resource('s3') bucket = event['bucket'].split(':')[-1] filename = event['key'] directory = "/tmp/{}".format(filename) s3.Bucket(bucket).download_file(filename, directory) with open(directory, "r") as jsonfile: final_json = json.load(jsonfile) os.popen("rm -rf /tmp") return final_json
创建状态机

以下状态机调用您之前创建的 Lambda 函数。

{ "StartAt":"Invoke Lambda function", "States":{ "Invoke Lambda function":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-2:123456789012:function:pass-large-payload", "Payload":{ "Input.$":"$" } }, "OutputPath": "$.Payload", "End":true } } }

无需传递输入中的大量数据,您可以将数据存储到一个 Amazon S3 存储桶,然后在 Payload 参数中传递该存储桶的 Amazon 资源名称 (ARN),获取存储桶的名称和密钥值。之后,您的 Lambda 函数就可以使用该 ARN 直接访问数据。以下是状态机执行的输入示例,其中数据以 large-payload-json 形式存储在名为 data.json 的 Amazon S3 存储桶中。

{ "key": "data.json", "bucket": "arn:aws:s3:::large-payload-json" }