使用 Amazon S3 ARN 而不是傳遞大型有效載荷 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon S3 ARN 而不是傳遞大型有效載荷

在狀態之間傳遞大型資料承載的執行作業可能會被終止。如果您在各個狀態之間傳遞的資料可能會增長到超過 256 KB,請使用 Simple Storage Service (Amazon S3) 存放資料,然後剖析Payload參數中儲存貯體的 Amazon 資源名稱 (ARN) 以取得儲存貯體名稱和金鑰值。或者,調整您的實作,以便在您的執行作業中傳遞較小的承載。

在下列範例中,狀態機器會將輸入傳遞至AWS Lambda函數,該函數會處理 Amazon S3 儲存貯體中的 JSON 檔案。執行此狀態機器之後,Lambda 函數會讀取 JSON 檔案的內容,並傳回檔案內容做為輸出。

建立 Lambda 函數

下列名為的 Lambda 函數pass-large-payload會讀取儲存在特定 Amazon S3 儲存貯體中的 JSON 檔案的內容。

注意

建立此 Lambda 函數之後,請務必提供其 IAM 角色的適當權限,以便從 Amazon S3 儲存貯體讀取。例如,將亞馬遜 S3 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 直接存取資料。以下是狀態機器執行的範例輸入,其中資料存放data.json在名為的 Amazon S3 儲存貯體中large-payload-json

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