Retornar mídia binária de uma integração de proxy do Lambda - Amazon API Gateway

Retornar mídia binária de uma integração de proxy do Lambda

Para retornar mídia binária de uma integração de proxy do AWS Lambda, codifique com base64 a resposta da sua função do Lambda. Também é necessário configurar os tipos de mídia binária da API. O tamanho máximo da carga é 10 MB.

nota

Para usar um navegador da Web para invocar uma API com este exemplo de integração, defina os tipos de mídia binária da API como */*. O API Gateway usa o primeiro cabeçalho Accept dos clientes para determinar se uma resposta deve retornar mídia binária. Para retornar mídia binária quando não for possível controlar a ordem dos valores de cabeçalho Accept, como solicitações de um navegador, defina os tipos de mídia binária da API como */* (para todos os tipos de conteúdo).

O exemplo a seguir da função do Lambda pode retornar uma imagem binária do Amazon S3 ou texto para clientes. A resposta da função inclui um cabeçalho Content-Type para indicar ao cliente o tipo de dados que ele retorna. A função define de modo condicional a propriedade isBase64Encoded em sua resposta, dependendo do tipo de dados que ela retorna.

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 saber mais sobre tipos de mídia binária, consulte Tipos de mídia binários para APIs REST no API Gateway.