使用 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解析存储桶的亚马逊资源名称 (ARN) 以获取存储桶名称和密钥值。或者,您也可以调整实现,以便在执行中传递较少的负载。

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

创建 Lambda 函数

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

注意

创建此 Lambda 函数后,请务必为其 IAM 角色提供相应的权限,使其能够从 Amazon S3 存储桶中读取。例如,将 AmazonS3 ReadOnlyAccess 权限附加到 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 直接访问数据。以下是状态机执行的示例输入,其中数据存储在名为的 Amazon S3 存储桶data.jsonlarge-payload-json

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