In this module you'll use AWS Lambda and Amazon DynamoDB to build a backend process for handling requests from your web application. The browser application that you deployed in the first module allows users to request that a unicorn be sent to a location of their choice. In order to fulfill those requests, the JavaScript running in the browser will need to invoke a service running in the cloud.
You'll implement a Lambda function that will be invoked each time a user requests a unicorn. The function will select a unicorn from the fleet, record the request in a DynamoDB table and then respond to the front-end application with details about the unicorn being dispatched.
The function is invoked from the browser using Amazon API Gateway. You'll implement that connection in the next module. For this module you'll just test your function in isolation.
Each of the following sections provide an implementation overview and detailed, step-by-step instructions. The overview should provide enough context for you to complete the implementation if you're already familiar with the AWS Management Console or you want to explore the services yourself without following a walkthrough.
If you're using the latest version of the Chrome, Firefox, or Safari web browsers the step-by-step instructions won't be visible until you expand the section.
Use the Amazon DynamoDB console to create a new DynamoDB table. Call your table Rides
and give it a partition key called RideId
with type String. The table name and partition key are case sensitive. Make sure you use the exact IDs provided. Use the defaults for all other settings.
After you've created the table, note the ARN for use in the next step.
Step-by-step instructions (expand for details)
-
From the AWS Management Console, choose Services then select DynamoDB under Databases.
-
Choose Create table.
-
Enter
Rides
for the Table name. This field is case sensitive. -
Enter
RideId
for the Partition key and select String for the key type. This field is case sensitive. -
Check the Use default settings box and choose Create.
-
Scroll to the bottom of the Overview section of your new table and note the ARN. You will use this in the next section.
Every Lambda function has an IAM role associated with it. This role defines what other AWS services the function is allowed to interact with. For the purposes of this workshop, you'll need to create an IAM role that grants your Lambda function permission to write logs to Amazon CloudWatch Logs and access to write items to your DynamoDB table.
Use the IAM console to create a new role. Name it WildRydesLambda
and select AWS Lambda for the role type. You'll need to attach policies that grant your function permissions to write to Amazon CloudWatch Logs and put items to your DynamoDB table.
Attach the managed policy called AWSLambdaBasicExecutionRole
to this role to grant the necessary CloudWatch Logs permissions. Also, create a custom inline policy for your role that allows the ddb:PutItem
action for the table you created in the previous section.
Step-by-step instructions (expand for details)
-
From the AWS Management Console, click on Services and then select IAM in the Security, Identity & Compliance section.
-
Select Roles in the left navigation bar and then choose Create new role.
-
Select AWS Lambda for the role type.
Note: Selecting a role type automatically creates a trust policy for your role that allows AWS services to assume this role on your behalf. If you were creating this role using the CLI, AWS CloudFormation or another mechanism, you would specify a trust policy directly.
-
Begin typing
AWSLambdaBasicExecutionRole
in the Filter text box and check the box next to that role. -
Choose Next Step.
-
Enter
WildRydesLambda
for the Role name. -
Choose Create role.
-
Type
WildRydesLambda
into the filter box on the Roles page and choose the role you just created. -
On the Permissions tab, expand the Inline Policies section and choose the click here link to create a new inline policy.
-
Ensure Policy Generator is selected and choose Select.
-
Select Amazon DynamoDB from the AWS Service dropdown.
-
Select PutItem from the Actions list.
-
Paste the ARN of the table you created in the previous section in the Amazon Resource Name (ARN) field.
-
Choose Add Statement.
-
Choose Next Step then Apply Policy.
AWS Lambda will run your code in response to events such as an HTTP request. In this step you'll build the core function that will process API requests from the web application to dispatch a unicorn. In the next module you'll use Amazon API Gateway to create a RESTful API that will expose an HTTP endpoint that can be invoked from your users' browsers. You'll then connect the Lambda function you create in this step to that API in order to create a fully functional backend for your web application.
Use the AWS Lambda console to create a new Lambda function called RequestUnicorn
that will process the API requests. Use the provided requestUnicorn.js example implementation for your function code. Just copy and paste from that file into the AWS Lambda console's editor.
Make sure to configure your function to use the WildRydesLambda
IAM role you created in the previous section.
Step-by-step instructions (expand for details)
-
Choose on Services then select Lambda in the Compute section.
-
Choose Create a Lambda function.
-
Choose the Blank Function blueprint card.
-
Don't add any triggers at this time. Choose Next to proceed to defining your function.
-
Enter
RequestUnicorn
in the Name field. -
Optionally enter a description.
-
Select Node.js 6.10 for the Runtime.
-
Copy and paste the code from requestUnicorn.js into the code entry area.
-
Leave the default of
index.handler
for the Handler field. -
Select
WildRydesLambda
from the Existing Role dropdown. -
Choose Next and then choose Create function on the Review page.
For this module you will test the function that you built using the AWS Lambda console. In the next module you will add a REST API with API Gateway so you can invoke your function from the browser-based application that you deployed in the first module.
-
From the main edit screen for your function, select Actions then Configure test event.
-
Copy and paste the following test event into the editor:
{ "path": "/ride", "httpMethod": "POST", "headers": { "Accept": "*/*", "Authorization": "eyJraWQiOiJLTzRVMWZs", "content-type": "application/json; charset=UTF-8" }, "queryStringParameters": null, "pathParameters": null, "requestContext": { "authorizer": { "claims": { "cognito:username": "the_username" } } }, "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}" }
-
Choose Save and test.
-
Verify that the execution succeeded and that the function result looks like the following:
{
"statusCode": 201,
"body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
"headers": {
"Access-Control-Allow-Origin": "*"
}
}
After you have successfully tested your new function using the Lambda console, you can move on to the next module, RESTful APIs.