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

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

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

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

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

创建 Lambda 函数

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

注意

创建此 Lambda 函数后,请确保向其 IAM 角色提供从 Amazon S3 存储桶进行读取的相应权限。例如,附上亚马逊 S3ReadOnlyAccessLambda 函数角色的权限。

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参数以获取存储桶名称和密钥值。然后,您的 Lambda 函数可以使用该 ARN 直接访问数据。以下是状态机执行的示例输入,其中数据存储在data.json在名为的 Amazon S3 存储桶中large-payload-json.

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