Por exemplo, se eu quiser retornar um erro 400 específico para parâmetros inválidos ou talvez 201 quando a chamada da função lambda resultou em uma criação.
Eu gostaria de ter códigos de status http diferentes, mas parece que o gateway da API sempre retorna um código de status 200, mesmo se a função lambda estiver retornando um erro.
amazon-web-services
aws-lambda
aws-api-gateway
MonkeyBonkey
fonte
fonte
Respostas:
Atualização por 20-9-2016
A Amazon finalmente tornou isso fácil usando a integração do Lambda Proxy . Isso permite que sua função Lambda retorne códigos e cabeçalhos HTTP adequados:
Diga adeus ao mapeamento de solicitação / resposta no API Gateway!
opção 2
Integre um aplicativo Express existente com Lambda / API Gateway usando aws-serverless-express .
fonte
callback
estilo. Apenas façacallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Esta é a maneira mais rápida de retornar códigos de status HTTP personalizados e um personalizado
errorMessage
:No painel do API Gateway, faça o seguinte:
Adicione uma resposta de integração para cada um dos códigos de status HTTP que você criou anteriormente. Certifique-se de que a passagem de entrada esteja marcada. Use lambda error regex para identificar qual código de status deve ser usado quando você retornar uma mensagem de erro de sua função lambda. Por exemplo:
Sua rota de gateway de API deve retornar este:
Não vejo como copiar essas configurações e reutilizá-las para métodos diferentes, por isso temos muitas entradas manuais redundantes e irritantes para fazer!
Minhas respostas de integração são assim:
fonte
return context.fail(new Error('bad one'))
Para ser capaz de retornar um objeto de erro personalizado como JSON, você precisa passar por alguns obstáculos.
Primeiro, você deve reprovar o Lambda e passar um objeto JSON stringificado:
Em seguida, você configura o mapeamento de regex para cada um dos códigos de status que deseja retornar. Usando o objeto que defini acima, você configuraria esta regex para 400:
. * "status": 400. *
Finalmente, você configura um modelo de mapeamento para extrair a resposta JSON da propriedade errorMessage retornada pelo Lambda. O modelo de mapeamento tem a seguinte aparência:
$ input.path ('$. errorMessage')
Escrevi um artigo sobre isso que entra em mais detalhes e explica o fluxo de resposta do Lambda para o API Gateway aqui: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -and-status-code-from-api-gateway-with-lambda /
fonte
1) Configure seu recurso API Gateway para usar Integração Lambda Proxy marcando a caixa de seleção "Usar integração Lambda Proxy" na tela "Solicitação de Integração" da definição de recurso API Gateway. (Ou defina-o em sua configuração cloudformation / terraform / serverless / etc)
2) Altere seu código lambda de 2 maneiras
event
(primeiro argumento da função) de forma adequada. Não é mais apenas a carga útil, mas representa toda a solicitação HTTP, incluindo cabeçalhos, string de consulta e corpo. Amostra abaixo. O ponto principal é que os corpos JSON serão strings que exigemJSON.parse(event.body)
chamada (não se esqueçatry/catch
disso). O exemplo está abaixo.statusCode
,body
eheaders
.body
deve ser uma string, então façaJSON.stringify(payload)
conforme necessáriostatusCode
pode ser um númeroheaders
é um objeto de nomes de cabeçalho para valoresExemplo de argumento de evento Lambda para integração de proxy
Amostra de forma de resposta de retorno
Notas - Eu acredito que os métodos em
context
comocontext.succeed()
estão obsoletos. Eles não são mais documentados, embora ainda pareçam funcionar. Acho que a codificação para a API de retorno de chamada é a coisa certa a seguir.fonte
Eu queria que um erro do Lambda fosse o próprio erro 500, depois de fazer muita pesquisa, descobri o seguinte, que funciona:
Em LAMBDA
Para uma boa resposta, estou retornando como abaixo:
Para uma resposta ruim, retornando como abaixo
Em API Gateway
Para um GET METHOD, diga GET of / res1 / service1:
Então,
Agora, publique / res1 / serviço1, acesse o URL publicado, que está conectado ao lambda acima
Utilizado o plugin do cliente REST avançado (ou Postman) do cromo, você verá os códigos http adequados, como erro do servidor (500) ou 400, em vez do código de resposta 200 http para todas as solicitações fornecidas em "httpStatusCode".
No 'Dashboard' da API, no API Gateway, podemos ver os códigos de status http como abaixo:
fonte
A maneira mais fácil de fazer isso é usar a integração LAMBDA_PROXY . Usando este método, você não precisa de nenhuma transformação especial a ser definida no pipeline do API Gateway.
Seu objeto de retorno deve ser semelhante ao snippet abaixo:
Ele tem algumas desvantagens: como ter que ser especialmente cuidadoso com o tratamento de erros e acoplar sua função lambda ao terminal do API Gateway; Dito isso, se você realmente não for usá-lo em nenhum outro lugar, não será um grande problema.
fonte
Para aqueles que tentaram de tudo, colocaram esta questão e não conseguiram fazer isso funcionar (como eu), confira o comentário doedevkit neste post (salvou meu dia):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Reproduzindo-o inteiramente abaixo:
fonte
É assim que é recomendado em um blog de computação da AWS se estiver usando o API Gateway. Verificar se a integração funciona com a invocação direta do Lambda.
Para invocações Lambda diretas, esta parece ser a melhor solução de análise no lado do cliente.
fonte
Estou usando 0,5 sem servidor. É assim que funciona, para o meu caso
s-function.json:
handler.js:
fonte
Se você não quiser usar um proxy, pode usar este modelo:
fonte