前回はLambdaを用いてAPIを作成してみました。ホントに型だけでしたけどね。
今回はAPIといえばNoSQL、NoSQLと言えばDynamoDBでしょう!ということでDynamoDBで遊んでみたいと思います。
NoSQLもNode.jsも初めてで、私が大好きな参考書もないので苦戦必至の予感がぷんぷんしますがまぁゆったりやっていきましょう。
今回目指す構成
前回と比較してもDynamoDBが追加されているぐらいですね。
事前知識
NoSQLってなんだっけ?
一般的には「Not Only SQL」の略称のようでSQL以外にもデータ操作手段をもつRDBMS以外を指す言葉のようで、現在のところ明確には定まっていないようです。
特に、RDBMSを比較した場合の特徴は以下の通りでしょうか。
・データが列と行からならテーブル構造をとらない
・SQL以外で手続きを行う
・一般的には結合
・結果整合性である(一定時間経過後のデータ整合性を保証する)
・主にデータの挿入と参照を行う(特に参照に強みがある)
・大量のデータを高速にさばく場合に向いている
詳細は私も参考にさせていただいた以下とかが分かりやすかったです。
NoSQLについて勉強する。 - Qiita
【超入門】RDBとNoSQLの違いに着目!NoSQLに求めるものとは? - RAKUS Developers Blog | ラクス エンジニアブログ
Amazon DynamoDB
Amazon DynamoDB は、規模に関係なく数ミリ秒台のパフォーマンスを実現する、key-value およびドキュメントデータベースです。完全マネージド型マルチリージョン、マルチマスターで耐久性があるデータベースで、セキュリティ、バックアップおよび復元と、インターネット規模のアプリケーション用のメモリ内キャッシュが組み込まれています。
DynamoDBはkey-value型とドキュメント指向型に対応しているようですね。
無料枠について、本サービスは無期限利用枠の対象です。
無料枠は以下通りですが、ご自分でも要確認です。
無料枠
・25 GB のストレージ
・25 個のプロビジョニングされた書き込みキャパシティーユニット (WCU)
・25 個のプロビジョニングされた読み込みキャパシティーユニット (RCU)
・1 か月あたり最大 2 億リクエストの処理が十分に可能。
キャパシティーユニットについては現時点ではよくわかっていないので注意な気がしますが、やってくうちに理解していくとしましょう。
DynamoDBを使ってみよう
テーブル作成
まずはテーブルの作成から。
サービスからDynamoDBを開きましょう。とにもかくにもテーブル作成
テーブルの設定を行います。
テーブル名は任意
プライマリーキーは必須で、ソートキーを設定してみました。
おおもう作成できるんですね。これは早い。
無料枠で話にあった「キャパシティーユニット」っていうのはこれですかね。
デフォルトで5になっているので、読込み書込みそれぞれ25までならデフォルト設定で5テーブルまでは無料で使えるってことでしょうか??
次にテーブルの項目を追加してみます。RDBMSでいうカラムを追加する感じになるのでしょうか。
項目タブから項目の追加を行います。
既にある項目の次に追加する場合はappendを行います。
とりあえずStringでDateとfreeって項目を追加してみました。freeってなんかナンセンスな気がする。
他にも追加してこんな感じになりました。
RDBMSの感覚からするとこんなの大丈夫なのかって感じはしますね。
Lambdaで関数を作成する
関数の作成
基本は以前お試しAPIを作成したときと同じとします。
以前と違うところはロールの権限です。
AWSポリシーテンプレートから新しいロールを作成を選択し、DynamoDBのアクセス権限を追加しました。
Node.js 10.x 関数
Node.js関数についてはまぁ苦戦したので詳しくは別の記事に抜き出します。
DynamoDBの特定テーブルから、プライマリーキーに該当するレコードを取得し、Bodyにのせてかえします。
var aws = require('aws-sdk'); var docClient = new aws.DynamoDB.DocumentClient({region: 'ap-northeast-1'}); exports.handler = async (event) => { var params = { // テーブル名 TableName : 'demotable', KeyConditionExpression: "#hash = :str", ExpressionAttributeNames:{ "#hash": "id" }, ExpressionAttributeValues: { ":str": "wantan" } }; var resultJSON = await docClient.query(params, function(err, data) { console.log(data); if (err) { console.log(err, err.stack); } }).promise(); var items = "miss"; if(resultJSON != null){ items = resultJSON.Items; } const response = { // ヘッダを設定 headers: { 'Content-type': 'application/json;charset=UTF-8' }, statusCode: 200, body: JSON.stringify(items), }; return response; };
API Gatewayの設定と確認
ブラウザから叩いて、ブラウザに表示する場合はこちらも基本的には過去記事と同様の設定で大丈夫です。
動作確認はブラウザから行います。
うむ、配列が取得できるようだ。
サーバレスはまだ感覚的にまだなんか使いにくいなぁ。