How to write Alexa skill data to DynamoDB with AWS Lambda

In this demo, We’ll go over how to write Alexa skill data to DynamoDB with AWS Lambda.

The skill, we’re going to build is an expense tracking assistant called “My expenses”. The user can ask to add an expense record and state the amount and the category of the expense. The record will be then stored in AWS DynamoDB and associated it with an userId.

The following video gives a quick demo of what the finished product will be:

DynamoDB is a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability. It requires no schema and can be used as a key-value or document-based store.

Skill will also require either an AWS Lambda ARN or a publicly available HTTP endpoint as a backend to process the logic behind the skill. We’ll be going with Lambda ARN, So we don’t need to run a server, and connect the skill via HTTP.

Creating a skill on the Amazon Developer Portal

  1. Go to Alexa developer console https://developer.amazon.com/alexa/ and add a new skill named “My expenses”.
  2. In the next screen “Choose a model to add to your skill” and pick the “Custom” option.
  3. Create the Interaction model. The quickest way to configure the interaction model is through the “JSON editor” in developer console. Copy and paste the code below in the editor and save the model. This will gives you:
     — invocation name: my expenses
     — Intent AddExpense
     — Sample utterances. 
     — Slots - Amount, Category

If you’re new to Alexa, please read more about Intents, Utterances, and Slots. So You’ll be able to understand the basics of Alexa.

Create Lambda function

We can write lambda function in any of these programing languages — (as of this writing ) Node.js, Python, Java (Java 8 compatible), and C# (.NET Core) and Go are supported. You can deploy the function either using AWS CLI or from AWS management console and configure Alexa to invoke the lambda.

You can also use a tool like “Serverless” — write your code, configure events to trigger your functions, and then deploy & run those functions to your cloud provider via the CLI provided by Serverless. Getting started with Serverless microservices with AWS Lambda.

For the purpose of this demo, I’ll be creating a serverless project with nodejs:

$ serverless create --template aws-nodejs
Serverless: Generating boilerplate...`

Open handler.js and update the code

serverless.yml

Deploy the lambda function with serverless deploy command and find its ARN. Go back to your Alexa developer console -> build -> Endpoint and update the AWS Lambda ARN.

Also don’t forget to update the alexa.appId = “amzn1.ask.skill.XXXX” value in your lambda function. (line 10, handler.js)

This will also create your Dynamodb table with the required permissions. You can learn more about serverless dyanamodb templating here. Behind the scene serveless.yml will be transformed in to a single Cloudformation stack, you can see them from AWS console -> Cloudformation.

AWS CLI credentials are stored in INI format in ~/.aws/credentials on a separate aws profile named serverless and serverless will pick the profile credentials during the deployment.

serverless.yml
profile: ${self:custom.profiles.${self:provider.stage}}
...
custom:
defaultStage: dev
profiles:
dev: serverless
prod: serverless
$cat ~/.aws/credentials
[serverless]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX

Testing on your Echo

Now your code is ready and deployed, go try your skill out!

You can say “Alexa, open My Expenses” or just type in the words to fire your skill from Alexa developer console -> Test.

I hope you found this tutorial helpful. Please feel free to contact me, If you get stuck on anything. You can find the code at github.

Happy coding with Alexa ❤