Criar funções do Lambda para uso com mensagens SMS do Amazon Pinpoint - Amazon Pinpoint

Criar funções do Lambda para uso com mensagens SMS do Amazon Pinpoint

Esta seção mostra como criar e configurar duas funções do Lambda para uso com o sistema de mensagens SMS do Amazon Pinpoint. Depois, você configurará o API Gateway e o Amazon Pinpoint para invocar essas funções quando determinados eventos ocorrerem. Ambas as funções criam e atualizam endpoints no projeto do Amazon Pinpoint que você especifica. A primeira função também usa o recurso de validação do número de telefone.

A primeira função usa detalhes do seu formulário de registro, que recebe do Amazon API Gateway. Ela usa essas informações para obter informações sobre o número de telefone do cliente usando o atributo de validação do número de telefone do Amazon Pinpoint. Depois, a função usa os dados validados para criar um endpoint no projeto do Amazon Pinpoint que você especificar. Por padrão, o endpoint que a função cria é cancelado em suas futuras comunicações, mas esse status pode ser alterado pela segunda função. Por fim, essa função envia ao cliente uma mensagem solicitando que ele verifique se deseja receber suas comunicações por SMS.

Como criar a função do Lambda
  1. Abra o console do AWS Lambda em https://console.aws.amazon.com/lambda/.

  2. Escolha Create function.

  3. Em Criar uma função, escolha Usar um esquema.

  4. No campo de pesquisa, digite hello e pressione Enter. Na lista de resultados, escolha a função do Node.js hello-world, como mostra a imagem a seguir.

    A página Criar função mostrando Usar um esquema selecionado.
  5. Em Basic information (Informações básicas), faça o seguinte:

    • Em Name (Nome), insira um nome para a função, como RegistrationForm.

    • Em Role (Função), selecione Choose an existing role (Escolher uma função existente).

    • Em Perfil existente, escolha o perfil SMSRegistrationForm que você criou em Criar um perfil do IAM.

    Ao concluir, selecione Create function (Criar função).

  6. Em Origem do código exclua a função de exemplo no editor de código e cole o código a seguir:

    import { PinpointClient, PhoneNumberValidateCommand, UpdateEndpointCommand, SendMessagesCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import const pinClient = new PinpointClient({region: process.env.region}); // Make sure the SMS channel is enabled for the projectId that you specify. // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-setup.html var projectId = process.env.projectId; // You need a dedicated long code in order to use two-way SMS. // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-voice-manage.html#channels-voice-manage-request-phone-numbers var originationNumber = process.env.originationNumber; // This message is spread across multiple lines for improved readability. var message = "ExampleCorp: Reply YES to confirm your subscription. 2 msgs per " + "month. No purchase req'd. Msg&data rates may apply. Terms: " + "example.com/terms-sms"; var messageType = "TRANSACTIONAL"; export const handler = async (event, context) => { console.log('Received event:', event); await validateNumber(event); }; async function validateNumber (event) { var destinationNumber = event.destinationNumber; if (destinationNumber.length == 10) { destinationNumber = "+1" + destinationNumber; } var params = { NumberValidateRequest: { IsoCountryCode: 'US', PhoneNumber: destinationNumber } }; try{ const PhoneNumberValidateresponse = await pinClient.send( new PhoneNumberValidateCommand(params)); console.log(PhoneNumberValidateresponse); if (PhoneNumberValidateresponse['NumberValidateResponse']['PhoneTypeCode'] == 0) { await createEndpoint(PhoneNumberValidateresponse, event.firstName, event.lastName, event.source); } else { console.log("Received a phone number that isn't capable of receiving " +"SMS messages. No endpoint created."); } }catch(err){ console.log(err); } } async function createEndpoint(data, firstName, lastName, source) { var destinationNumber = data['NumberValidateResponse']['CleansedPhoneNumberE164']; var endpointId = data['NumberValidateResponse']['CleansedPhoneNumberE164'].substring(1); var params = { ApplicationId: projectId, // The Endpoint ID is equal to the cleansed phone number minus the leading // plus sign. This makes it easier to easily update the endpoint later. EndpointId: endpointId, EndpointRequest: { ChannelType: 'SMS', Address: destinationNumber, // OptOut is set to ALL (that is, endpoint is opted out of all messages) // because the recipient hasn't confirmed their subscription at this // point. When they confirm, a different Lambda function changes this // value to NONE (not opted out). OptOut: 'ALL', Location: { PostalCode:data['NumberValidateResponse']['ZipCode'], City:data['NumberValidateResponse']['City'], Country:data['NumberValidateResponse']['CountryCodeIso2'], }, Demographic: { Timezone:data['NumberValidateResponse']['Timezone'] }, Attributes: { Source: [ source ] }, User: { UserAttributes: { FirstName: [ firstName ], LastName: [ lastName ] } } } }; try{ const UpdateEndpointresponse = await pinClient.send(new UpdateEndpointCommand(params)); console.log(UpdateEndpointresponse); await sendConfirmation(destinationNumber); }catch(err){ console.log(err); } } async function sendConfirmation(destinationNumber) { var params = { ApplicationId: projectId, MessageRequest: { Addresses: { [destinationNumber]: { ChannelType: 'SMS' } }, MessageConfiguration: { SMSMessage: { Body: message, MessageType: messageType, OriginationNumber: originationNumber } } } }; try{ const SendMessagesCommandresponse = await pinClient.send(new SendMessagesCommand(params)); console.log("Message sent! " + SendMessagesCommandresponse['MessageResponse']['Result'][destinationNumber]['StatusMessage']); }catch(err){ console.log(err); } }
  7. Na guia Configuração das Variáveis de ambiente, escolha Editar, depois Adicionar variável de ambiente, faça o seguinte:

    • Na primeira linha, crie uma variável com uma chave de originationNumber. Em seguida, defina o valor para o número de telefone do código longo dedicado que você recebeu na Etapa 1.2.

      nota

      Não deixe de incluir o sinal de mais (+) e o código do país para o número de telefone. Não inclua outros caracteres especiais, como traços (-), pontos (.) ou parênteses.

    • Na segunda linha, crie uma variável com uma chave de projectId. Em seguida, defina o valor para o ID exclusivo do projeto que você criou na Etapa 1.1.

    • Na terceira linha, crie uma variável com uma chave de region. Em seguida, defina o valor para a região em que você usa o Amazon Pinpoint, como us-east-1 ou us-west-2.

    Quando você terminar, a seção Environment Variables (Variáveis de ambiente) deve ser semelhante ao exemplo mostrado na imagem a seguir.

    As Variáveis de ambiente para originationNumber, projectId e region.
  8. Na parte superior da página, escolha Save (Salvar).

Testar a função

Depois de criar a função, você deve testá-la para verificar se está configurada corretamente. Além disso, verifique se o perfil do IAM que você criou tem as permissões apropriadas.

Para testar a função
  1. Selecione a guia Testar.

  2. Escolha Criar novo evento e faça o seguinte:

    • Em Event name (Nome do evento), insira um nome para o evento de teste, como MyPhoneNumber.

    • Apague o código de exemplo no editor de código. Cole o seguinte código:

      { "destinationNumber": "+12065550142", "firstName": "Carlos", "lastName": "Salazar", "source": "Registration form test" }
    • No exemplo de código anterior, substitua os valores dos atributos destinationNumber, firstName e lastName pelos valores que você deseja usar para teste, como seus detalhes de contato pessoais. Ao testar essa função, ele envia uma mensagem SMS para o número de telefone especificado por você no atributo destinationNumber. Certifique-se de que o número de telefone especificado possa receber mensagens SMS.

    • Escolha Criar.

  3. Escolha Testar.

  4. Em Execution result: succeeded (Resultado de execução: bem-sucedido), selecione Details (Detalhes). Na seção Log output (Resultado de saída do log), analise a saída da função. Certifique-se de que a função foi executada sem erros.

    Verifique o dispositivo associado ao destinationNumber que você especificou para garantir que recebeu a mensagem de teste.

  5. Faça login no console do Amazon Pinpoint em https://console.aws.amazon.com/pinpoint/.

  6. Na página Todos os projetos, escolha o projeto que você criou em Criar um projeto Amazon Pinpoint.

  7. No painel de navegação, selecione Segmentos. Na página Segmentos, selecione Criar um segmento.

  8. Em Segment group 1 (Grupo de segmentos 1), em Add filters to refine your segment (Adicionar filtros para refinar seu segmento), escolha Filter by user (Filtrar por usuário).

  9. Para Choose a user attribute (Escolher um atributo do usuário), escolha FirstName. Depois, para Choose values (Escolha valores), escolha o nome que você especificou no evento de teste.

    A seção Segment estimate (Estimativa de segmento) deve mostrar que há zero endpoints elegíveis e um endpoint total, conforme mostrado na imagem a seguir. Tal resultado é esperado. Quando a função cria um endpoint, o endpoint é cancelado. Os segmentos no Amazon Pinpoint excluem automaticamente os endpoints excluídos.

    O grupo de segmentos mostrando zero endpoints.

A segunda função é executada somente quando um cliente responde à mensagem enviada pela primeira função. Se a resposta do cliente inclui a palavra-chave especificada em Habilitar SMS bidirecional, a função atualiza os registros de endpoint para habilitá-lo a futuras comunicações. O Amazon Pinpoint também responde automaticamente com a mensagem que você especificou em Habilitar SMS bidirecional.

Se o cliente não responder ou responder com algo diferente da palavra-chave designada, nada acontecerá. O endpoint do cliente permanece no Amazon Pinpoint, mas não pode ser direcionado por segmentos.

Como criar a função do Lambda
  1. Abra o console do AWS Lambda em https://console.aws.amazon.com/lambda/.

  2. Escolha Create function.

  3. Em Create function (Criar função), escolha Blueprints (Esquemas).

  4. No campo de pesquisa, digite hello e pressione Enter. Na lista de resultados, escolha a função do Node.js hello-world, como mostra a imagem a seguir. Selecione Configurar.

  5. Em Basic information (Informações básicas), faça o seguinte:

    • Em Name (Nome), insira um nome para a função, como RegistrationForm_OptIn.

    • Em Role (Função), selecione Choose an existing role (Escolher uma função existente).

    • Em Perfil existente, escolha o perfil SMSRegistrationForm que você criou em Criar um perfil do IAM.

    Ao concluir, selecione Create function (Criar função).

  6. Exclua a função de exemplo no editor de código e cole o código a seguir:

    import { PinpointClient, UpdateEndpointCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import // Create a new Pinpoint client instance with the region specified in the environment variables const pinClient = new PinpointClient({ region: process.env.region }); // Get the Pinpoint project ID and the confirm keyword from environment variables const projectId = process.env.projectId; const confirmKeyword = process.env.confirmKeyword.toLowerCase(); // This is the main handler function that is invoked when the Lambda function is triggered export const handler = async (event, context) => { console.log('Received event:', event); try { // Extract the timestamp, message, and origination number from the SNS event const timestamp = event.Records[0].Sns.Timestamp; const message = JSON.parse(event.Records[0].Sns.Message); const originationNumber = message.originationNumber; const response = message.messageBody.toLowerCase(); // Check if the response message contains the confirm keyword if (response.includes(confirmKeyword)) { // If the confirm keyword is found, update the endpoint's opt-in status await updateEndpointOptIn(originationNumber, timestamp); } }catch (error) { console.error('An error occurred:', error); throw error; // Rethrow the error to handle it upstream } }; // This function updates the opt-in status of a Pinpoint endpoint async function updateEndpointOptIn(originationNumber, timestamp) { // Extract the endpoint ID from the origination number const endpointId = originationNumber.substring(1); // Prepare the parameters for the UpdateEndpointCommand const params = { ApplicationId: projectId, EndpointId: endpointId, EndpointRequest: { Address: originationNumber, ChannelType: 'SMS', OptOut: 'NONE', Attributes: { OptInTimestamp: [timestamp] }, } }; try { // Send the UpdateEndpointCommand to update the endpoint's opt-in status const updateEndpointResponse = await pinClient.send(new UpdateEndpointCommand(params)); console.log(updateEndpointResponse); console.log(`Successfully changed the opt status of endpoint ID ${endpointId}`); } catch (error) { console.error('An error occurred while updating endpoint:', error); throw error; // Rethrow the error to handle it upstream } }
  7. Em Environment variables (Variáveis de ambiente), faça o seguinte:

    • Na primeira linha, crie uma variável com uma chave de projectId. Em seguida, defina o valor como o ID exclusivo do projeto que você criou em Criar um projeto Amazon Pinpoint.

    • Na segunda linha, crie uma variável com uma chave de region. Em seguida, defina o valor para a região em que você usa o Amazon Pinpoint, como us-east-1 ou us-west-2.

    • Na terceira linha, crie uma variável com uma chave de confirmKeyword. Em seguida, defina o valor para a palavra-chave de confirmação que você criou em Habilitar SMS bidirecional.

      nota

      A palavra-chave não diferencia maiúsculas e minúsculas. Essa função converte a mensagem recebida em letras minúsculas.

    Quando você terminar, a seção Environment Variables (Variáveis de ambiente) deve ser semelhante ao exemplo mostrado na imagem a seguir.

    As Variáveis de ambiente para projectId, region e confirmKeyword.
  8. Na parte superior da página, escolha Save (Salvar).

Testar a função

Depois de criar a função, você deve testá-la para verificar se está configurada corretamente. Além disso, verifique se o perfil do IAM que você criou tem as permissões apropriadas.

Para testar a função
  1. Escolha Testar.

  2. Na janela Configure test event (Configurar evento de teste), faça o seguinte:

    1. Selecione Criar evento de teste.

    2. Em Event name (Nome do evento), insira um nome para o evento de teste, como MyResponse.

    3. Apague o código de exemplo no editor de código. Cole o seguinte código:

      { "Records":[ { "Sns":{ "Message":"{\"originationNumber\":\"+12065550142\",\"messageBody\":\"Yes\"}", "Timestamp":"2019-02-20T17:47:44.147Z" } } ] }

      No exemplo de código anterior, substitua os valores do atributo originationNumber pelo número de telefone que você usou quando você testou a função do Lambda anterior. Substitua o valor de messageBody pela palavra-chave SMS bidirecional especificada em Habilitar SMS bidirecional. Como opção, você pode substituir o valor de Timestamp pela data e hora atuais.

    4. Escolha Criar.

  3. Escolha Test (Testar) novamente.

  4. Em Execution result: succeeded (Resultado de execução: bem-sucedido), selecione Details (Detalhes). Na seção Log output (Resultado de saída do log), analise a saída da função. Certifique-se de que a função foi executada sem erros.

  5. Faça login no console do Amazon Pinpoint em https://console.aws.amazon.com/pinpoint/.

  6. Na página Todos os projetos, escolha o projeto que você criou em Criar um projeto Amazon Pinpoint.

  7. No painel de navegação, selecione Segmentos. Na página Segmentos, selecione Criar um segmento.

  8. Em Segment group 1 (Grupo de segmentos 1), em Add filters to refine your segment (Adicionar filtros para refinar seu segmento), escolha Filter by user (Filtrar por usuário).

  9. Para Choose a user attribute (Escolher um atributo do usuário), escolha FirstName. Depois, para Choose values (Escolha valores), escolha o nome que você especificou no evento de teste.

    A seção Segment estimate (Estimativa de segmento) deve mostrar que há um endpoint elegível e um endpoint total.

Próximo: configurar o Amazon API Gateway