1. 程式人生 > >Serverless Backend using AWS Lambda: Hands

Serverless Backend using AWS Lambda: Hands

Storing Data in DynamoDB

Before we can start storing data in our DynamoDB, we need to set some permissions for the Lambda function to have write access.

Inside the serverless.yml file, remove the contents of the functions section completely and create a new function called createHero as shown below:

functions:  createHero:    handler: create.run      events:        - http:            path: heroes            method: post

But the Lambda function does not have the permissions to interact with our DynamoDB table by default. So we need to give these permissions to our Lambda function. This can be done with the help of iamRole.

The serverless framework already uses iamRole under the hood. We need to use iamRoleStatements to extend the permissions for the specific iamRole

.

In your DynamoDB console, click on the table to open its overview. In the Table Details section, you should find the Amazon Resourse Name (ARN). Enter its content as Resource inside the iamRoleStatements in the serverless.yml file as shown below:

provider:  name: aws  runtime: nodejs8.10  iamRoleStatements:    - Effect: Allow      Action:        - dynamodb:PutItem      Resource: "<enter your Amazon Resource Name here>"

We also have to create the function that will actually send the data to our DynamoDB table. So create a new file named create.js.

$ touch create.js

Inside this file, add a function that will return a response.

module.exports.run = async (event) => {  const data = JSON.parse(event.body);  return {    statusCode: 200,    body: JSON.stringify(data)  };};

To let this function interact with DynamoDB, we need to import the aws-sdk and instantiate a documentClient() inside the serverless.yml file:

const AWS = require("aws-sdk");const client = new AWS.DynamoDB.documentClient();

Along with this, create a new const named params as shown below:

module.exports.run = async (event) => {  const data = JSON.parse(event.body);  const params = {    TableName: "heroes",    Item: {      id: "hero1",      name: data.name,      checked: false    }  };  await client.put(params).promise();  return {    statusCode: 200,    body: JSON.stringify(data)  };};

There is one issue in this code, every new item that we add to our table will have the same id. To solve this, we can add the uuid package to our code. This package will generate a new id for every new request.

Create a new file named package.json:

$ touch package.json

Inside this file, write the following code:

{  "name": "less-app",  "private": true}

Then install the uuid package using NPM/Yarn:

$ npm install --save uuid

Finally, import this package into the create.js file:

const uuid = require("uuid/v4");

Also re-write the id property inside the Item object using the uuid package as shown here:

Item: {  id: uuid(),  name: data.name,  checked: false}

With that, we have set up everything and can redeploy this using serverless.

$ sls deploy

Once deployed we can use curl to create an entry into the DynamoDB table as shown below:

$ curl -X "<POST URL>" --data '{"text": "batman"}'

Check in the AWS console to see if this submission was recorded.