Devolver medios binarios desde una integración de proxy de Lambda - Amazon API Gateway

Devolver medios binarios desde una integración de proxy de Lambda

Para devolver medios binarios desde una integración de proxy de AWS Lambda, base64 codifica la respuesta de su función de Lambda. También debe configurar los tipos de medios binarios de su API. El límite de tamaño de carga es 10 MB.

nota

Para utilizar un navegador web para invocar una API con esta integración de ejemplo, establezca los tipos de medios binarios de la API en */*. API Gateway utiliza el primer encabezado Accept de los clientes para determinar si una respuesta debe devolver medios binarios. Para devolver medios binarios cuando no puede controlar el orden de los valores de encabezado Accept, como las solicitudes de un navegador, establezca los tipos de medios binarios de la API en */* (para todos los tipos de contenido).

En el siguiente ejemplo, la función de Lambda puede devolver una imagen binaria a partir de Amazon S3 o texto a los clientes. La respuesta de la función incluye un encabezado Content-Type para indicar al cliente el tipo de datos que devuelve. La función establece condicionalmente la propiedad isBase64Encoded en su respuesta, dependiendo del tipo de datos que devuelve.

Node.js
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3" const client = new S3Client({region: 'us-east-2'}); export const handler = async (event) => { var randomint = function(max) { return Math.floor(Math.random() * max); } var number = randomint(2); if (number == 1){ const input = { "Bucket" : "bucket-name", "Key" : "image.png" } try { const command = new GetObjectCommand(input) const response = await client.send(command); var str = await response.Body.transformToByteArray(); } catch (err) { console.error(err); } const base64body = Buffer.from(str).toString('base64'); return { 'headers': { "Content-Type": "image/png" }, 'statusCode': 200, 'body': base64body, 'isBase64Encoded': true } } else { return { 'headers': { "Content-Type": "text/html" }, 'statusCode': 200, 'body': "<h1>This is text</h1>", } } }
Python
import base64 import boto3 import json import random s3 = boto3.client('s3') def lambda_handler(event, context): number = random.randint(0,1) if number == 1: response = s3.get_object( Bucket='bucket-name', Key='image.png', ) image = response['Body'].read() return { 'headers': { "Content-Type": "image/png" }, 'statusCode': 200, 'body': base64.b64encode(image).decode('utf-8'), 'isBase64Encoded': True } else: return { 'headers': { "Content-type": "text/html" }, 'statusCode': 200, 'body': "<h1>This is text</h1>", }

Para obtener más información sobre los tipos de medios binarios, consulte Trabajar con tipos de medios binarios para API REST.