前回は、サーバーレスのテンプレートに DynamoDB を接続しました。

今回は、サーバーレスオフラインを使って、DynamoDB にデータを保存します。

まずは、api フォルダを作成し、create-note.js を作成します。

aws-sdkをインポートします。

const AWS = require("aws-sdk")

リージョンを設定します。

AWS.config.update({ region: "us-west-2" })

DynamoDB を設定するために、DocumentClientを初期化します。

const dynamodb = new AWS.DynamoDB.DocumentClient()

YAML で設定したテーブル名を指定しましょう。

const tableName = process.env.NOTES_TABLE

lambda ハンドラーを設定します。

exports.handler = async event => {
  try {
  } catch (err) {}
}

POST が成功した場合、statusCode:200を返すようにします。

また、ヘッダーには、Access-Control-Allow-Originをワールドカードに設定します。

body に、item を返すようにします。

exports.handler = async event => {
  try {
    return {
      statudCode: 200,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify(item),
    }
  } catch (err) {}
}

post は、Post という JSON データを作成します。

user_id と、user_name は、headers に設定するようにします。

exports.handler = async event => {
  try {
    let item = JSON.parse(event.body).Item
    item.user_id = event.headers.user_id
    item.user_name = event.headers.user_name

    return {
      statudCode: 200,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify(post),
    }
  } catch (err) {}
}

note.id は、ランダムにするため、uuidを使います。

ターミナルでプロジェクトのディレクトリに移動し、npm install --save uuid を実行します。

uuidをインポートします。

const { v4: uuidv4 } = require("uuid")

note_iduuidを設定します。

exports.handler = async (event) => {
  try {
    let item = JSON.parse(event.body).Item;
    item.user_id = event.headers.user_id;
    item.user_name = event.headers.user_name;
    item.note_id = uuidv4();

timestampには、momentを使います。

ターミナルで、npm install --save moment を実行します。

timestampmomentを設定します。

momentは UNIX タイムスタンプにします。

exports.handler = async (event) => {
  try {
    let item = JSON.parse(event.body).Item;
    item.user_id = event.headers.user_id;
    item.user_name = event.headers.user_name;
    item.note_id = uuidv4();
    item.timestamp = moment().unix();

dynamDB に設定する場合、putを使います。

putには、TableNamePostを指定します。

exports.handler = async (event) => {
  try {
    let item = JSON.parse(event.body).Item;
    item.user_id = event.headers.user_id;
    item.user_name = event.headers.user_name;
    item.note_id = uuidv4();
    item.timestamp = moment().unix();

    await dynamodb
      .put({
        TableName: tableName,
        Item: item,
      })
      .promise();

エラーの場合は、エラーコードを返すようにします。

exports.handler = async event => {
  try {
    let item = JSON.parse(event.body).Item
    item.user_id = event.headers.user_id
    item.user_name = event.headers.user_name
    item.note_id = uuidv4()
    item.timestamp = moment().unix()

    await dynamodb
      .put({
        TableName: tableName,
        Item: item,
      })
      .promise()

    return {
      statudCode: 200,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify(item),
    }
  } catch (err) {
    console.log("Error:", err)
    return {
      statusCode: err.statusCode ? err.statusCode : 500,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify({
        error: err.name ? err.name : "Exception",
        message: err.message ? err.message : "Unknown error",
      }),
    }
  }
}

ハンドラーを作成したので、YAML でハンドラーを定義します。

まずは、serverless-offlineのプラグインを設定します。

ターミナルで、npm install serverless-offline --save-dev を実行します。

インストール完了後、serverless.yml を開きます。

serverless-offlineを設定します。

plugins:
  - serverless-offline

providerに、iamRoleStatementsを設定し、DynamoDB へアクセスする権限とテーブルを設定します。

Effectは、Allowを指定します。

Actionは、dynamodb のPutItemを指定します。

Resourceは、arnを設定します。

provider:
  name: aws
  runtime: nodejs14.x
  region: us-west-2
  stage: dev
  memorySize: 128
  timeout: 5
  endpointType: regional
  lambdaHashingVersion: 20201221
  environment:
    NOTES_TABLE: ${self:service}-${opt:stage, self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:PutItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.NOTES_TABLE}"

functionshandlerを削除して、create-noteを作成します。

handler は、api フォルダの create-note.js を指定します。

今回は、データを送信するので、POSTを設定します。

functions:
  create-note:
    handler: api/create-note.handler
    description: POST /note
    events:
      - http:
          path: note
          method: post
          cors:
            origin: "*"
            headers: ${self:custom.allowedHeaders}

次に header に関するカスタムプロパティを設定します。

custom:
  allowedHeaders:
    - Accept
    - Content-Type
    - Conten-Length
    - X-Amz-Date
    - X-Api-Key
    - X-Amz-Security-Token
    - X-Amz-User-Agent
    - user_id
    - user_name

では、ターミナルで、serverless offline を実行します。

image2

ローカルサーバーが立ち上がりました。

ポストマンで、実際にデータを送信してみましょう。

URL を http://localhost:3000/dev/note とします。

Headers に、Content-Type: application/json と、user_id、user_name を指定します。

image3

Body にtitledescriptionを設定します。

image4

『Send』ボタンをクリックすると、

image5

データが送信されたようです。

DynamoDB で確認します。

DynamoDB に移動して、該当するテーブル名をクリックします。

image6

データが作成されていました。

データの user_id をクリックすると、

image7

先程送信したデータが保存されていました。

次回は、DynamoDB に保存したデータを取得します。

ブログ一覧