Uso do AWS Lambda com o Amazon Lex
É possível usar o Amazon Lex para integrar um bot de conversação ao seu aplicativo. O bot do Amazon Lex fornece uma interface de conversação com os usuários. O Amazon Lex fornece integração pré-criada com o Lambda, que permite usar uma função do Lambda com o bot do Amazon Lex.
Ao configurar um bot do Amazon Lex, é possível especificar uma função do Lambda para executar validação, atendimento ou ambos. Para validação, o Amazon Lex invoca a função do Lambda após cada resposta do usuário. A função do Lambda pode validar a resposta e fornecer feedback corretivo para o usuário, se necessário. Para atendimento, o Amazon Lex invoca a função do Lambda para atender à solicitação do usuário depois que o bot coleta com êxito todas as informações necessárias e recebe a confirmação do usuário.
É possível gerenciar a simultaneidade da função do Lambda para controlar o número máximo de conversas simultâneas do bot atendidas. A API do Amazon Lex retornará um código de status HTTP 429 — Too Many Requests (Excesso de solicitações) se a função estiver na simultaneidade máxima.
A API retornará um código de status HTTP 424 — Dependency Failed Exception (Exceção com falha de dependência) se a função do Lambda lançar uma exceção.
O bot do Amazon Lex invoca a função do Lambda de forma síncrona. O parâmetro de evento contém informações sobre o bot e o valor de cada slot na caixa
de diálogo. O parâmetro invocationSource
indica se a função do Lambda deve validar as entradas (DialogCodeHook) ou atender
à intenção (FulfillmentCodeHook).
exemplo Evento de mensagem do Amazon Lex
{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "ABCD1234", "sessionAttributes": { "key1": "value1", "key2": "value2", }, "bot": { "name": "OrderFlowers", "alias": "prod", "version": "1" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "FlowerType": "lilies", "PickupDate": "2030-11-08", "PickupTime": "10:00" }, "confirmationStatus": "Confirmed" } }
O Amazon Lex espera uma resposta de uma função do Lambda no formato a seguir. O campo
dialogAction
é obrigatório. Os campos sessionAttributes
e recentIntentSummaryView
são opcionais.
exemplo Evento de mensagem do Amazon Lex
{ "sessionAttributes": { "key1": "value1", "key2": "value2" ... }, "recentIntentSummaryView": [ { "intentName": "Name", "checkpointLabel": "Label", "slots": { "slot name": "value", "slot name": "value" }, "confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)", "dialogActionType": "ElicitIntent, ElicitSlot, ConfirmIntent, Delegate, or Close", "fulfillmentState": "Fulfilled or Failed", "slotToElicit": "Next slot to elicit } ], "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, your pizza has been ordered." }, "responseCard": { "version": integer-value, "contentType": "application/vnd.amazonaws.card.generic", "genericAttachments": [ { "title":"card-title", "subTitle":"card-sub-title", "imageUrl":"URL of the image to be shown", "attachmentLinkUrl":"URL of the attachment to be associated with the card", "buttons":[ { "text":"button-text", "value":"Value sent to server on button click" } ] } ] } } }
Os campos adicionais necessários para dialogAction
variam com base no valor do campo type
. Para obter mais informações sobre os campos de evento e resposta, consulte Formato de evento e resposta do Lambda no Guia do desenvolvedor do Amazon Lex. Para obter um exemplo de tutorial que mostra como usar o Lambda com o Amazon Lex,
consulte Exercício 1: criar um bot do Amazon Lex usando um esquema no Guia do desenvolvedor do Amazon Lex.
Funções e permissões
É necessário configurar uma função vinculada ao serviço como função de execução da função. O Amazon Lex define a função vinculada ao serviço com permissões predefinidas.
Ao criar um bot do Amazon Lex usando o console, a função vinculada ao serviço é criada
automaticamente. Para criar uma função vinculada ao serviço com a CLI da AWS, use
o comando create-service-linked-role
.
aws iam create-service-linked-role --aws-service-name lex.amazonaws.com
Esse comando cria a função a seguir.
{ "Role": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lex.amazonaws.com" } } ] }, "RoleName": "AWSServiceRoleForLexBots", "Path": "/aws-service-role/lex.amazonaws.com/", "Arn": "arn:aws:iam::account-id:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots" }
Se a função do Lambda usar outros serviços da AWS, será necessário adicionar as permissões correspondentes à função vinculada ao serviço.
Use uma política de permissões baseada em recursos para permitir que a intenção do
Amazon Lex invoque a função do Lambda. Se você usar o console do Amazon Lex, a política
de permissões será criada automaticamente. Na CLI da AWS, use o comando add-permission
do Lambda para definir a permissão. O exemplo a seguir define permissão para a intenção
OrderFlowers
.
aws lambda add-permission \ --function-name OrderFlowersCodeHook \ --statement-id LexGettingStarted-OrderFlowersBot \ --action lambda:InvokeFunction \ --principal lex.amazonaws.com \ --source-arn "arn:aws:lex:us-east-1:123456789012 ID:intent:OrderFlowers:*"