【AWS】サーバーレスオフラインでDynamoDBにデータを保存する
AWS

【AWS】サーバーレスオフラインでDynamoDBにデータを保存する

作成日:2021年12月28日
更新日:2021年12月28日

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

aws-serverless-template-dynamodb

【AWS】サーバーレスのテンプレートとDynamoDBを接続する

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

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

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

js
const AWS = require("aws-sdk");

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

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

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

js
const dynamodb = new AWS.DynamoDB.DocumentClient();

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

js
const tableName = process.env.NOTES_TABLE;

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

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

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

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

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

js
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 に設定するようにします。

js
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をインポートします。

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

note_iduuidを設定します。

js
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 タイムスタンプにします。

js
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を指定します。

js
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();

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

js
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を設定します。

yaml
plugins:
- serverless-offline

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

Effectは、Allowを指定します。

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

Resourceは、arnを設定します。

yaml
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を設定します。

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

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

yaml
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 に保存したデータを取得します。

aws-serverless-dynamodb-get

【AWS】サーバーレスオフラインでDynamoDBに保存したデータを取得する

© 2024あずきぱんウェブスタジオ