Cómo configurar un entorno de pruebas local para las Skills de Alexa | 1 de 2

Juan González
Diseñando para la Voz
9 min readJul 23, 2018

--

Gran parte del tiempo que invertimos en el desarrollo de aplicaciones, independientemente del tipo o de la plataforma a la cual van dirigidas, es empleado en encontrar y corregir errores.

Los entornos de desarrollo y pruebas varían dependiendo de una gran cantidad de factores. Usualmente contamos con un editor de código — desde un simple editor de textos hasta un IDE de última generación — y algún tipo de servidor local que nos permita interactuar con un servicio o ejecutar peticiones a una base de datos.

Crear un entorno de desarrollo local en nuestro ordenador, lo más cercano al entorno real de producción, ha sido durante muchos años la fórmula predilecta para experimentar, probar nuevas ideas, romper cosas y aprender conceptos antes de ponerlos en manos del usuario final.

Hace 10+ años, cualquier estación de trabajo Linux en la que estuviese desarrollando una aplicación web tendría una instalación de tipo LAMP (Linux, Apache, MySQL y PHP). En una máquina con Windows la solución más simple para replicar este mismo entorno era la instalación de una aplicación tipo WAMP. Cuando finalmente cambié al entorno Apple, el equivalente “todo en uno” de fácil instalación y configuración era el grandioso MAMP. El proceso no es particularmente distinto para el caso de desarrollo de aplicaciones móviles iOS y/o Android en la actualidad.

Hoy en día los entornos de desarrollo, pruebas y despliegue están cambiando de forma acelerada. El desarrollo de Skills para Alexa y sus funciones Lambda, basadas en arquitectura serverless, traen consigo un cambio interesante en cuanto a la estrategia utilizada para el desarrollo y las pruebas de estas Skills. Sobre todo a la hora de mejorar, corregir o modificar el comportamiento de una Skill que se encuentre en revisión — en este caso por parte de Amazon — o que ya ha sido publicada y se encuentra siendo utilizada por el usuario final.

Siguiendo los ejemplos y tutoriales creados por Amazon para dar los primeros pasos con la creación de Skills de Alexa, y aprovechando el inminente lanzamiento de Alexa para el mercado Español, he diseñado y desarrollado mi primera custom Skill. Un test de práctica para todos los extranjeros que se preparan — o mejor dicho nos preparamos — para presentar el examen de la Nacionalidad Española.

El proceso de creación y despliegue de la Skill lo describo en detalle en otro post. El problema que me he encontrado luego de finalizar el desarrollo, y la razón principal para la publicación de este artículo, es ese momento de realización en plan “¿Y ahora que hago?” al que me enfrenté una vez fueron necesarias correcciones al Skill mientras estaba en espera para su revisión y aprobación.

Antes de entrar al detalle de la configuración del entorno de pruebas es importante mencionar que:

  • El entorno de pruebas propuesto se corresponde a la depuración del código fuente (debugging) de la función Lambda AWS (backend) con Node.js de la Skill. Trabajar con Node.js no es en lo absoluto obligatorio. El SDK de AWS se encuentra igualmente disponible para Python, Java, .NET, PHP, Ruby, Go, C++ y mucho más!
  • El proceso aquí descrito se puede seguir y reproducir fácilmente si ya se cuenta con una Skill desarrollada. Si este no es tu caso, puedes ir a la web oficial de desarrollo, seguir algún tutorial y continuar la lectura de este post una vez hayas culminado los pasos previos.
  • Al finalizar el tutorial serás capaz de invocar desde tu entorno local las funciones Lambda AWS como si fuese una petición del servicio de Alexa. De esta forma podrás depurar todo el código de la Skill desde tu entorno de desarrollo local.

Requisitos Básicos del Entorno

1- Node.js

Existen diversas formas de instalar y gestionar Node.js en tu ordenador. En internet se pueden conseguir defensores de cada una de estas estrategias pero hoy en día no conozco una forma más simple que descargando el instalador desde la web oficial.

Web oficial para la descarga de Node.js — macOS (x64).

Para mi entorno personal he descargado la versión más reciente disponible al momento de escribir este artículo: Node.js 10.7.0 para Mac OS X High Sierra 10.13.6. El entorno de ejecución de mi función Lambda en los servidores de Amazon cuenta con la versión Node.js 8.10.

Versión de Node.js en los servidores AWS de Amazon.

La instalación es rápida y la diferencia de versiones no debe representar ningún problema para proyectos nuevos. De igual forma Amazon va gradualmente actualizando las versiones del entorno de ejecución.

2- IDE

La selección del IDE, al igual que el resto de los elementos de tu entorno de desarrollo para Skills de Alexa es amplio y flexible. Algunos de los favoritos son Atom y Sublime Text. Por otro lado, distintos documentos de referencia y vídeo-tutoriales en YouTube se decantan por Microsoft Visual Studio.

No tengo una idea clara de cual es la relación entre ambos mundos, pero en pro de la aventura de verano que representa mi introducción al desarrollo de Skills de Alexa, me he decido a instalar por primera vez en mis 15 años como desarrollador el IDE de Microsoft.

Microsoft Visual Studio para Mac OS X.

Durante un tiempo exploré la idea de utilizar el IDE web de Amazon Cloud9. Me interesa la experiencia completamente inmersa de una plataforma cuando es posible. De la misma forma me gustaba la idea de ahorrar algún paso de configuración inicial (Cloud9 está directamente integrado con AWS CLI por ejemplo) y posibles configuraciones futuras con servicios de Amazon.

La verdad es que luego de ver algunas demos en línea, no enterarme del todo bien del tema “Precios”, y saber que no voy a sacar ningún provecho a la colaboración en tiempo real, decidí no darle más largas al tema y continuar con Visual Studio.

3- Interfaz de Línea de Comandos (CLI) de AWS

La instalación de la CLI de AWS en mi caso llevó algunos pasos adicionales. Para desarrolladores actuales del ecosistema Amazon, o profesionales del mundo AWS, es posible que este paso sea innecesario pero en mi caso tuve que seguir la guía oficial, incluidas la instalación del gestor de paquetes de Python pip y sus dependencias.

Instalación de AWS CLI en Mac OS X con python pip.

Es importante luego añadir el archivo ejecutable de la CLI AWS al path de tu línea de comandos. Este procedimiento varía según el sistema operativo y el tipo de SHELL utilizado. El proceso completo para Linux, Unix y MacOS X se encuentra descrito al final de la guía.

Configuración Local del Proyecto

Para mi Skill de pruebas — el Test de Nacionalidad Española — he utilizado como punto de partida el proyecto Alexa Trivia Skill, disponible tanto en GitHub como en el repositorio de proyectos serverless de Amazon AWS.

Repositorio de funciones Lambda — Aplicaciones Serverless.

Es importante destacar una vez más que al momento de empezar la búsqueda de una solución para mi entorno de desarrollo y pruebas locales, la v1.0 de mi Skill se encontraba terminada y en proceso de revisión/certificación por parte de Amazon.

Los siguientes pasos asumen que existe algún proyecto con el cual hacer las pruebas locales. Para primeros pasos en el desarrollo de Skills de Alexa me han resultado increíblemente útiles:

Para comenzar el proceso de configuración del entorno simplemente tenemos que:

1- Configurar el proyecto en Visual Studio

Es tan simple como abrir la carpeta desde su ubicación original en tu ordenador y permitir que Visual Studio indexe el árbol de archivos. Adicionalmente se puede guardar el proyecto como un Workspace permanente dentro del IDE.

Estructura del proyecto en Microsoft Visual Studio.

2- Instalar el módulo ask-sdk-core

Como podemos observar en la línea #6 de la imagen anterior, nuestra función requiere el módulo ask-sdk-core para funcionar correctamente. Este es un requerimiento básico que podemos satisfacer con una simple instalación utilizando el gestor de paquetes npm.

Desde el terminal integrado en Visual Studio (menú View > Integrated Terminal) podemos realizar la instalación fácilmente:

Instalación local del SDK requerido con el gestor npm.

En el caso de proyectos existentes, algunos paquetes adicionales serán depositados en el directorio llamado “node_modules” y en el caso de proyectos nuevos el directorio se creará automáticamente.

3- Añadir los archivos con el código de pruebas

Para realizar las distintas pruebas y tareas de depuración de nuestro código es necesario crear algunos archivos adicionales. Estos archivos podemos colocarlos en una nueva carpeta “test”. Para poder realizar una prueba básica, como mínimo necesitaremos tres archivos que llamaremos:

  • main.js
  • input.json
  • context.json
Estructura básica de archivos de prueba.

El código fuente de cada archivo es variado y está íntimamente ligado a la funcionalidad particular de cada Skill. Para tener una idea de la estructura y contenido básicos es posible descargar estos archivos ejemplo del servidor de Amazon. A partir de ellos podemos crear nuestras propias pruebas.

El siguiente paso consiste en instalar el módulo aws-sdk en el directorio “test” que recién hemos creado . Si abrimos el archivo “main.js” podemos observar que en la línea #21 se indica este requerimiento.

Requerimiento local del SDK de AWS para las pruebas.

La instalación la llevamos a cabo de la misma manera que la hemos hecho en el caso anterior. Desde el terminar interno del IDE invocamos el comando de instalación del gestor de paquetes npm:

Instalación local del SDK requerido con el gestor npm desde la carpeta de pruebas.

4- Configurar los permisos para AWS Lambda

El siguiente paso implica la configuración de nuestro entorno local para asumir el rol que nuestra Skill utiliza en el servicio Alexa.

En un proceso de invocación regular:

  1. El usuario habla directamente con el dispositivo físico.
  2. La solicitud vocal se envía al servicio Alexa y esta a su vez es dirigida al Intent correspondiente dentro de la función Lambda.
  3. La función Lambda retorna el texto de la respuesta en formato JSON.
  4. El servicio Alexa dirige la respuesta al dispositivo que se encarga de presentarla en formato hablado al usuario.
Flujo de interacción de las Skill de Alexa. Fuente: Blog Netcetera

En esta sección nos encargaremos de gestionar los permisos necesarios para que nuestro entorno de pruebas local pueda realizar las solicitudes necesarias al servicio Alexa.

Es importante destacar que al momento de crear una función Lambda en AWS se define un rol de ejecución para dicha función. Un rol en este contexto no es más que el rol que nuestra función heredará cuando sea invocada. El proceso necesario para replicar este rol desde nuestro Node.js local es el siguiente:

  1. Crear un grupo y usuario en AWS IAM dedicados exclusivamente al entorno local.
  2. Agregar una política al usuario IAM que permita heredar el rol con permisos suficientes en tiempo de ejecución.
  3. Hacer que el usuario local que invoque los scripts de prueba asuma el rol definido para la función Lambda.

¿Cómo utilizar el rol de ejecución existente para la función Lambda?

Si aún no has creado un rol para tu Skill o no haz creado una función Lambda que utilice dicho rol, puedes examinar alguno de los tutoriales que he mencionado anteriormente. En todos ellos existen ejemplos de como hacerlo con guías (en inglés) paso a paso.

Para el caso particular de mi Skill, yo he creado un rol con permisos básicos de ejecución llamado lambda_basic_execution. Ya que este es el rol que mi función Lambda va a heredar al ser invocada, las políticas de ejecución básica garantizarán que la función pueda escribir logs y realizar las peticiones que necesita para funcionar correctamente.

Configuración del rol de ejecución básica en AWS.

Ya estamos aproximadamente a mitad de camino! El próximo paso es la creación de un grupo y usuario de pruebas. Todo el detalle en la segunda parte de este tutorial.

Diseñando para la Voz es una iniciativa personal de Juan González Ponce que trae contenido relacionado al mundo del desarrollo de Alexa Skills para el servicio de Amazon, en Castellano, con la finalidad de compartir ideas y lecciones aprendidas en el camino.

--

--