Utilizar los ARN de Amazon S3 en lugar de pasar cargas de gran tamaño - AWS Step Functions

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Utilizar los ARN de Amazon S3 en lugar de pasar cargas de gran tamaño

Las ejecuciones que pasan cargas de gran tamaño entre los estados pueden terminarse. Si los datos que va a transferir entre estados pueden superar los 256 KB, utilice Amazon Simple Storage Service (Amazon S3) para almacenar los datos y analice el Nombre de recurso de Amazon (ARN) del bucket en el parámetro Payload para obtener el nombre del bucket y el valor de clave. También puede ajustar la implementación para que se pasen cargas más pequeñas en las ejecuciones.

En el siguiente ejemplo, una máquina de estados pasa la entrada a una función AWS Lambda, que procesa un archivo JSON en un bucket de Amazon S3. Tras ejecutar esta máquina de estados, la función de Lambda lee el contenido del archivo JSON y devuelve el contenido del archivo como salida.

Crear la función de Lambda

La siguiente función de Lambda denominada pass-large-payload lee el contenido de un archivo JSON almacenado en un bucket de Amazon S3 específico.

nota

Tras crear esta función de Lambda, no olvide proporcionar a su rol de IAM el permiso adecuado para leer desde un bucket de Amazon S3. Por ejemplo, asocie el permiso Amazons3ReadOnlyAccess al rol de la función de 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
Crear la máquina de estado

La siguiente máquina de estados invoca la función de Lambda que creó anteriormente.

{ "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 } } }

En lugar de pasar una cantidad de datos grande en la entrada, podría guardar esos datos en un bucket de Amazon S3 y pasar el Nombre de recurso de Amazon (ARN) y del bucket en el parámetro Payload para obtener el nombre del bucket y el valor de clave. Entonces, la función de Lambda puede usar ese ARN para obtener acceso a los datos directamente. A continuación se muestra una entrada de ejemplo para la ejecución de la máquina de estado, donde los datos se almacenan en data.json en un bucket de Amazon S3 llamado large-payload-json.

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