https://d226lax1qjow5r.cloudfront.net/blog/blogposts/deploying-an-aws-lambda-function-for-nexmo-voice-callbacks-with-php-dr/E_Vonage-Voice-Callbacks_1200x600.png

Implementación de una función Lambda de AWS para las retrollamadas de voz de Vonage con PHP

Publicado el May 18, 2021

Tiempo de lectura: 16 minutos

La implementación de una aplicación completa y accesible desde la web en AWS Lambda presenta un conjunto único de requisitos y obstáculos. Entre ellos se encuentran la ejecución y la configuración de permisos. En esta publicación, me basaré en algunas publicaciones anteriores para reunirlas en un ejemplo práctico.

Este post utiliza una aplicación de devolución de llamada de ejemplo de "AWS Transcribe con Nexmo Voice usando PHP". También aprovecha "AWS Lambda with PHP Using Bref and Serverless Framework" (AWS Lambda con PHP utilizando Bref y el marco sin servidor).. También aplico el modelo de permisos que se muestra en "Cómo funcionan los permisos en AWS Lambda" para AWS S3 y Amazon Transcribe. Juntas, estas piezas le permiten crear su propio función AWS Lambda para crear un microservicio de transcripción que podrá utilizar en sus aplicaciones.

Nota: Usted no tendrá que ir a través de los tres puestos mencionados anteriormente para seguir a lo largo de este. Cubro a fondo todo lo que necesita saber a continuación.

Requisitos previos

En este ejemplo se necesita lo siguiente:

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Configuración de AWS

Necesitará una Account de AWS, así como credenciales IAM asociadas a un usuario que tenga suficientes privilegios. Ese permiso garantiza que Serverless pueda crear la función Lambda y asignar permisos según sea necesario.

Crear un Bucket S3

Crea un bucket de S3 para almacenar los archivos MP3 de grabación de voz recuperados de Vonage. Amazon Transcribe podrá acceder fácilmente a los archivos para transcribirlos más tarde.

Después de crearlo, asegúrate de marcar la casilla junto al nombre del cubo. Se abrirá un panel a la derecha para que puedas hacer clic en el botón "Copiar ARN de cubo" y guardarlo para su uso posterior.

Creación de un usuario IAM

Seleccione la consola de gestión de IAM en el panel Servicios:

Select IAM Management ConsoleSelect IAM Management Console

En la consola de gestión de IAM, añada un nuevo usuario de IAM haciendo clic en el botón azul Añadir usuario:

AWS new IAM userAdd a new IAM user

A continuación se muestra un fragmento JSON para asignar los permisos necesarios para el nuevo usuario.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

Framework sin servidor

En Bref aprovecha el Serverless Framework que es una "solución completa para construir y operar aplicaciones sin servidor", por lo que nuestro primer paso es instalar este framework en el sistema de desarrollo que estés utilizando. Recomiendo instalarlo globalmente, para permitir el uso desde cualquier lugar a través de CLI.

npm install -g serverless

Credenciales de AWS

Con Serverless instalado, asegúrate de que también has configurado las credenciales de AWS anteriores como administrador, para que Serverless interactúe con los distintos servicios de AWS. Puedes leer más sobre esto en serverless.com y bref.sh por lo que no entraremos en detalles aquí.

Preparación de las Applications

A continuación, preparamos la aplicación utilizando Composer para recuperar las dependencias. Se requiere una pequeña edición en el código para que funcione correctamente con las URL de Lambda.

Compositor

Preparar la aplicación requiere un par de pasos antes de realizar la instalación de Composer. Necesitamos requerir Bref para realizar las funcionalidades Serverless. Escribe lo siguiente en tu terminal después de navegar al directorio del proyecto que contiene el código.

composer install composer require bref/bref

El primer comando instala las dependencias de la aplicación. A continuación, el segundo comando añade Bref junto con las dependencias necesarias para ello. También puede editar el archivo composer.json para que requiera Bref y ejecutar únicamente el comando install comando.

Bref Init

Normalmente, para una nueva aplicación, se le ordenaría a Bref que inity crear serverless.yml y index.php. Sin embargo, en este caso, simplemente debería crear un archivo llamado serverless.yml en el directorio raíz, como se indica a continuación:

service: app

provider:
    name: aws
    region: us-east-1
    runtime: provided
    iamRoleStatements:
        - Effect: Allow
          Action:
              - s3:PutObject
              - s3:GetObject
              - s3:DeleteObject
          Resource: 'arn:aws:s3:::{{bucket-name}}/*'
        - Effect: Allow
          Action: transcribe:*
          Resource: '*'

plugins:
    - ./vendor/bref/bref

functions:
    api:
        handler: index.php
        description: ''
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        layers:
            - ${bref:layer.php-73-fpm}
        events:
            -   http: 'ANY /'
            -   http: 'ANY /{proxy+}'

# Exclude files from deployment
package:
    exclude:
        - 'node_modules/**'
        - 'tests/**'

Nota: Debe actualizar la región de AWS y sustituir {{bucket-name}} para que se ajuste a sus necesidades.

Además, observe que iamRoleStatements está configurando los permisos para que Lambda utilice AWS S3 así como Amazon Transcribe. Ver el post "Cómo funcionan los permisos en AWS Lambda", mencionado anteriormente, para obtener más detalles.

Variables de entorno

Como parte de la preparación, cambie el nombre del archivo .env.default para que pase a ser .envy actualízalo según sea necesario para adaptarlo a la información de tu cuenta de AWS y Vonage. Aunque puedes ignorar con seguridad AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEYporque Lambda los añade automáticamente al entorno.

Tampoco podrá rellenar los campos VONAGE_APPLICATION_PRIVATE_KEY_PATH y VONAGE_APPLICATION_ID hasta DESPUÉS de la implementación en Lambda, por lo que será necesario realizar la implementación en Lambda dos veces. La primera vez para proporcionarte las URL necesarias para crear la aplicación de Vonage. Luego, la segunda implementación contiene un archivo .env con los valores de Vonage. Todo esto lo veremos más adelante.

URL de eventos

Debido a la diferencia en la forma en que Lambda maneja el URI, también tendrá que editar el archivo index.php de la aplicación. Específicamente, tendrás que alterar el eventUrl en las líneas 33 y 47. El resultado final será como el siguiente, respectivamente:

// Line 33
'https://'.$uri->getHost().'/dev/webhooks/fetch'
// Line 47
'https://'.$uri->getHost().'/dev/webhooks/transcribe'

La actualización se debe a que $request no se muestra con httpsy Lambda también incluye el entorno en las URL de API Gateway.

Despliegue de

Una vez completados todos los pasos anteriores, ya estás listo para desplegar la aplicación en Lambda utilizando Serverless. En tu terminal, ejecuta el siguiente comando:

serverless deploy

Tras la implantación, recibirá la URL necesaria para acceder a la aplicación a través del API Gateway. Anote la URL para el siguiente paso.

IMPORTANTE: La aplicación de ejemplo, tal cual, no lleva ningún tipo de autenticación o verificación. Cualquiera con acceso a la URL proporcionada tras la implementación puede acceder a ella. Hacerlo podría causar cargos inesperados en sus cuentas. Por lo tanto, asegure la aplicación si tiene intención de dejarla activa.

Configuración de Vonage

Lamentablemente, en el caso de la implementación de Aplicaciones de AWS Lambda, no conociste la URL hasta después de la implementación. Sin embargo, sigue siendo necesario crear la Aplicación en Vonage para obtener la URL VONAGE_APPLICATION_PRIVATE_KEY_PATH y VONAGE_APPLICATION_ID para que la aplicación funcione.

Con la CLI de Vonage, instalada como requisito previo, introduce el siguiente comando:

vonage app:create /webhooks/answer /webhooks/event

A modo de ejemplo, el comando podría tener el siguiente aspecto:

vonage app:create MyTranscripeApp https://asdrferwef.execute-api.us-east-1.amazonaws.com/dev/webhooks/answer https://asdrferwef.execute-api.us-east-1.amazonaws.com/dev/webhooks/event

La respuesta del comando proporciona el Application ID y el Private Keyque se utilizarán en los pasos siguientes.

Actualizar clave privada

Cambie el nombre del archivo private.key.default a private.key y guarde el Private Key en el archivo.

Actualizar .env

Actualice el .env con los valores de VONAGE_APPLICATION_PRIVATE_KEY_PATH y VONAGE_APPLICATION_ID. Tendrá un aspecto similar al siguiente:

VONAGE_APPLICATION_PRIVATE_KEY_PATH=./private.key VONAGE_APPLICATION_ID=2735sd6ed1asd-29cf4-4858f-bd90sd-7135a8cf122bas

Asociación de Numbers

El último paso para preparar Vonage es asociar el número alquilado de Vonage con la aplicación recién creada. Para ello, utiliza el siguiente comando:

vonage link:app

Asegúrate de actualizar las variables anteriores con tu número de Vonage y el app_id proporcionado al crear la aplicación. Asegúrate de anteponer el código de país para evitar errores. Aquí tienes un ejemplo:

vonage link:app 2735sd6ed1asd-29cf4-4858f-bd90sd-7135a8cf122bas --number=+15558675309

Más detalles

Al crear la aplicación de Vonage y asociar el número, le indicas a Vonage que realice devoluciones de llamadas cuando se produzcan eventos, y quieres que esas devoluciones de llamadas apunten a la aplicación recién creada.

La URL de evento es para cuando un evento cambia el estado de una llamada, mientras que la URL de respuesta se solicita para cualquier llamada entrante para recuperar un objeto NCCO (Objeto de Control de Llamada Nexmo).

Ahora hemos terminado con la configuración de Vonage. Es hora de volver a implementar en Lambda con el siguiente comando:

serverless deploy

Tras un par de minutos, la aplicación actualizada se volverá a desplegar en Lambda. Aunque el contenido de la aplicación habrá cambiado, la URL permanece constante.

Pruebas

Ahora es el momento de realizar una llamada de prueba a tu número de Vonage. Después de llamar, la voz automatizada debería decir: "Por favor, deje un mensaje después del tono, luego presione #". a menos que hayas cambiado ese mensaje en index.php. Luego, después de dejar un breve mensaje de voz y presionar #, la voz automatizada debería decir: "Gracias por tu mensaje. Adiós".

Para confirmar que todo ha funcionado como se esperaba, debería poder ver el archivo MP3 en el bucket de S3 que especificó. También debería haber un trabajo de transcripción ejecutándose en Amazon Transcribe. Todo ello es accesible a través de la consola de AWS.

¡Enhorabuena! ¡Has construido tu primer Lambda!

Próximos pasos

Hay muchos pasos posibles, dependiendo de sus necesidades. Una posible solución puede ser crear un evento de AWS Cloudwatch para recibir una alerta cuando un trabajo de Transcribe esté "Completo". El evento podría llamar a otra función Lambda para enviar por correo electrónico la transcripción, o añadir la transcripción a una base de datos. En pocas palabras, ahora tienes una versión de texto del mensaje de voz dejado por una persona que llama. Si tiene alguna pregunta, o se encuentra con problemas, puede ponerse en contacto con @VonageDev en Twitter o preguntar en la Comunidad de desarrolladores de Vonage equipo de Slack.

Compartir:

https://a.storyblok.com/f/270183/384x384/b3c7ffaf85/adamculp.png
Adam CulpAntiguos alumnos de Vonage

Adam es un desarrollador y consultor al que le gusta correr a toda velocidad, bloguear y ayudar a otros a domar la tecnología para conseguir cosas increíbles, con un deseo insaciable de servir de mentor y ayudar.