本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon S3 ARN 而不是传递大型有效负载
可以终止在状态间传递大量数据负载的执行。如果您在各州之间传递的数据可能会增长到超过 262,144 字节,请使用亚马逊Simple Storage Service (Amazon S3) 来存储数据,并在存储段中解析存储桶的亚马逊资源名称 (ARN)Payload
参数以获取存储桶名称和密钥值。或者,您也可以调整实现,以便在执行中传递较少的负载。
在以下示例中,状态机将输入传递给Amazon Lambda函数,处理Amazon S3 存储桶中的一个文件。运行此状态机后,Lambda 函数读取 JSON 文件的内容,并将文件内容作为输出返回。
创建 Lambda 函数
以下 Lambda 函数名为
读取存储在特定 Amazon S3 存储桶中的一个文件。pass-large-payload
创建此 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
"
}