今回は、この3点をやってみます。
・管理画面からDynamoDBにアイテムを追加する
・LambdaからDynamoDBにアクセスする(node.js)
・DynamoDBのアイテムを更新する
Lambdaでnode.jsを使って色々できるとなったら、Lambdaが動いているサーバー上に
記録を残したいときがあります。
memocached や ファイル書き出し等はできないようです。
そこで、永続的にデータを保存できるAWSサービスのRDBとDynamoDBを考えました。
今回は、後々データが増えたときに扱いやすそうなDynamoDBを触ってみます。
DynamoDB の基礎知識とまとめ:
http://qiita.com/hshimo/items/e5ad98b21786d796f1da
AWSの管理画面から、サービス > データベース > DynamoDB を選択します。

はじめてDynamoDBを触ったときの画面になります。
Create table
を選びます。

テーブルの設定画面になります。
・テーブル名 : Test
・プライマリキー : key1(文字列)
・デフォルト設定の使用 : オフ
・セカンダリインデックス : なし
・プロビジョニングされたキャパシティ 読み込み/書き込み容量ユニット : 1
にして"作成"を押します。

テーブルができました!

それでは項目(アイテム)を追加してみましょう。
画面右の"項目"メニュー > 項目の作成 を選びます。

項目の作成画面に移るので、プライマリキーに"aaa"を入力します。

要素を追加するので、"+"ボタン > Append > String を選びます。

key2 として、値に vvv を入力します。
その後、画面右下の"保存"を押します。

テーブルに項目が追加されました。

AWS LambdaからDynamoDBにアクセスするために、ロールの設定の変更が必要になります。
ここで、作成したテーブルの"Amazonリソースネーム(ARN)"をコピーして覚えておきます。

サービス > IAM の画面に移り、ロールの画面を開きます。
前回のhelloWorldで使ったロール(Cognito_AllZeroPuzzleUnauth_Role)を開きます。

インラインポリシー > ロールポリシーの作成 を選びます。

"選択"を押します。

アクセス許可の編集画面になりますので、
・AWSサービス : Amazon DynamoDB
・アクション : Scan, UpdateItem
・ARN : 先ほどコピーしたARN
を設定して、"ステートメントを追加"を押します。


ステートメントの内容を確認(Scan, UpdateItemがある)して、"次のステップ"を押します。

ポリシーの確認画面では特になにもせず"ポリシーの適用"を選びます。

ポリシー一覧の画面に戻ると、先ほど作ったポリシーが追加されています。

サービス > AWS Lambda の画面に移り、以前作成した helloWorld を選びます。

以前のプログラムを、DynamoDB用に書き換えます。
node.jsによるLambda操作のサンプル
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.03.html
var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context) {
var param = {
TableName : "Test",
FilterExpression : "key1 = :val",
ExpressionAttributeValues : {":val" : "aaa"}
};
dynamo.scan(param, function(err, data) {
if (err) {
console.log("エラー = " + err);
context.fail(err); // エラー時
} else {
console.log("成功 = " + data);
context.succeed(data); // 正常時
}
});
};

管理画面で実行してみると、DynamoDBの項目の中身を取得できました。

では、key2 の "vvv" を "moji" に置き換えてみましょう。
Lambdaのプログラムを変更します。
var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context) {
var params = {
TableName: 'Test',
Key: {
"key1": "aaa" // Hashキー
},
AttributeUpdates: {
"key2": {
'Action': 'PUT', // 置き換え
'Value': "moji" // 文字列
}
}
};
dynamo.update(params, function (err, data) {
if (err) {
console.log("失敗" + err);
} else {
console.log("成功");
}
});
};

実行すると、"成功"と出たので、置き換えがうまくいったようです。

サービス > DynamoDB の画面に移り、先ほど作成した Testテーブルの中身を確認すると、
ちゃんと更新されていました。

これで、これからアプリに追加する機能に必要なことは揃いました。
よかったよかった。