Creating an Alexa Skill in C# – Step 3

Now that you’ve defined your Alexa Skill in Step 1, and you’ve configured the security and downloaded the sample in Step 2, we’re ready to take a look at the sample and see how to wire it up to the skill definition.

Open your copy of the sample solution in Visual Studio 2017.  I left my copy in this folder:

C:\_GitHub\Alexa\MyAlexaSkill\sampleFactCsharp.sln

At this point, I had a decision to make:  Do I start a new project and copy the stuff from the sample project, or do I just mess with the sample project?  I think I’ll actually create a new project, and leave the sample in pristine condition for comparison.

Creating the Alexa Skill Project from the Sample

First, create a new project in the solution, choosing AWS Lambda Project with Tests as the template:

snip_20180511111204

We want an Empty Function:

snip_20180511111641

Now that we have our own project, let’s check out the dependencies:

snip_20180511111536

As of this writing, the NuGet package for Amazon.Lambda.Serialization.Json needs updating.  So I did that.  Also, the sample is for .NetCore 1.0.  My project has defaulted to using .NetCore 2.0.  I don’t expect this to be a problem.

Next, I might as well copy the code (both classes) and the AlexaAPI folder from the sample to my project.  This will at least give me a starting point.

Coding for the Alexa Intents

Now that the project is set up, we can start coding for the Intents in the Alexa Skill we created in Step 1.   To start off, we will crack open the Function class in our new project and locate the ProcessIntentRequest() function.  There’s a switch statement there that will handle our simplest Intent Request, which was GetTodaysDateIntent, like so:

switch (intentRequest.Intent.Name)
{
    case "GetTodaysDateIntent":
        innerResponse = new SsmlOutputSpeech();
        (innerResponse as SsmlOutputSpeech).Ssml = $"Today's date is {DateTime.Today.ToString()}";
        break;
 
    case "GetNewFactIntent":
        innerResponse = new SsmlOutputSpeech();
        (innerResponse as SsmlOutputSpeech).Ssml = GetNewFact(factdata, true);
        break;
   ...

At this point, you’ll probably want to do a build and deployment to AWS.  First, make sure your project builds.

Creating an AWS Profile

Next, you need to set up a Publish Profile in AWS.  This is done by viewing the AWS Explorer on the left side of your VS screen and clicking the New Account Profile icon.

snip_20180514110823

That will bring up the New Account Profile dialog.

snip_20180514110903

Click the link near the bottom of the dialog to go to the documentation on how to add a user.  Then click on one of the links that open the Console to IAM.  Or just click on the link here.

Next, select the Users category on the left.  Then create a Deployment User that has programmatic access and is in the Developers group we created in Step 2.

snip_20180514115025

When you click Create User, you will see the Success screen.  Be sure to click the Download .csv button (middle-left) to get the credentials file.  You can never get this file again, you will have to create a new Access Key and get a new credentials file.

snip_20180514115244

Now, back in Visual Studio, click the Import from csv file button:

snip_20180514110903

Give your profile a name, I called mine Deployment.  Account Number is optional and can be left blank.  Then click OK.  You will see the AWS Explorer switch to the Deployment profile.  You should then pick the default profile and delete it.

snip_20180514115955

Publishing Your AWS Lambda Project

You are now ready to publish your AWS Lambda project.  Right-click on the project and select Publish to AWS Lambda….

snip_20180514110347

If you don’t see this menu option, make sure you’re in the Lambda project, not the Test project.  Then, make sure you have installed the AWS Toolkit as described in Step 2.

When you see the publish dialog, give your function a name:

snip_20180514120525

Then click next and pick the Role we defined in Step 2.

snip_20180514121222

Then click Upload.  After a few moments, your Lambda function will be uploaded.

Uh-Oh.  Duplicate Compile Items

If you get the Duplicate Compile items error:

Duplicate Compile items were included. The .NET SDK includes Compile items from your project directory by default. You can either remove these items from your project file, or set the ‘EnableDefaultCompileItems’ property to ‘false’ if you want to explicitly include them in your project file.

The recommendation is to remove the Compile items from your project (*.csproj) file.  Right-click the project and choose to Edit your .csproj file:

snip_20180514124040

Then delete all the *.cs files from the Compile section:

snip_20180514124202
I also deleted the ItemGroups above that because they had Compile items in them too.  Now my project builds and deploys properly, and my .csproj file is much cleaner:

snip_20180514124350

Now publish the fixed project to AWS.

Back on Track:  Wiring up the Skill and the Lambda function.

Alright, we have a Skill defined.  We have a Lambda function uploaded.  Now we need to tell them each about the other.  First, we’ll tell the Skill about the Lambda function.

Go to the Lambda functions list in the Lambda Management Console.  Click on your new Lambda function, which I named MyAlexaSkillsLambdaFunction.  In the top right corner of the screen you will see the ARN:

snip_20180515111333

Copy the ARN to the clipboard and paste it into Notepad.  Now, switch over to the Alexa Skill Console.  Select your skill.  Click on the Build tab.  Click on the big “4. Endpoint >” button in the checklist on the right.

snip_20180515111539

Paste the ARN from the Lambda Function into the Default Region box on the right.

snip_20180515112156

Then, copy the Skill ID above it to the clipboard and paste that into Notepad too.

Switch back to the Lambda Management Console.  Under the Add Triggers list on the left, find the Alexa Skills Kit and drag it over to the Triggers area of your Lambda function:

snip_20180515112342

Then scroll down to configure the trigger and paste in the Skill ID you copied from the Skill and click the Add button:

snip_20180515112653

Lastly, in the top right corner of the Lambda screen, click the Save button:

snip_20180515112823

And that’s that.  The Alexa Skill is defined, the Lambda function is defined.  The two know about each other.  You are ready to test your skill.

Testing the Alexa Skill

To test your Alexa Skill and make sure everything is wired up properly, click on the Test tab in the Alexa Console.   Then enable testing for this skill.

snip_20180515113053

In the Alexa Simulator panel, in the text entry box, run your Skill:

snip_20180515113732

Alexa should respond with the Launch Message from your skill (which we will modify in a later Step in this series):

snip_20180515113938

Now, test your Skill’s Intent:

snip_20180515114036

Alexa should tell you the date:

snip_20180515114114

Tada!  That’s it for Step 3.

Check out Step 3a to see how to Unit Test your Alexa Skill Intent without publishing anything to AWS.

In Step 4, we will look at setting up a Web Service project to feed data from an Azure SQL database to our Alexa Skill.

 

2 thoughts on “Creating an Alexa Skill in C# – Step 3

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: