LambdaからDynamoDBの読み書きを行う

####はじめに
先日、アマゾンで開催された**「初めてのサーバーレス」ハンズオン**の内容から LambdaからDynamoDB読み書きする部分をまとめておきます。Alexaスキルを作る上でも、DynamoDBの扱いを覚えたいと前々から思っていたので、有り難かったです。

#LambdaからDynamoDBに書き込む
####DynamoDBにテーブルを作成する
・　まずDynamoDBに予めテーブルを作成しておきます。
・　DynamoDB管理画面にアクセスします。
・　適当な名前でテーブルを作成します。（名前は仮に[hogehoge_dynamodb_table]とします）
・　プライマリーキーにTrackと入力し、データ種類は文字列を選択します。
・　ソートキーの追加をチェックします。
・　Timestampと入力し、データ種類は数値を選択します。
・　右下の作成をクリックします。

####Lambdaで書き込み専用の関数を作る
・　Lambda管理画面にアクセスします。
・　関数の作成から設計図を選択し、[simple-mobile-backend]を選択します。
・　適当な関数名を入力します。
・　新しいロールを作ります。（名前は例えば[lambda_dynamo]とします）
・　ポリシーテンプレートは[シンプルなマイクロサービスのアクセス権限]を選択します。
・　右下の関数の作成をクリックします。
・　index.jsの中身を以下に置き換えて保存します。
**注意：**データ項目に、DynamoDBでテーブル作成時に定義したTrack、Timestamp以外に、Comment、Nameが加わっています。

```javascript
console.log('Loading function');
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  // TODO: テーブル名を確認してください
  var tableName = "hogehoge_dynamodb_table";
  var item = {
    Track: event.track,
    Comment: event.comment,
    Name: event.name,
    Timestamp: Number(Math.floor(Date.now() / 1000))
  };
  var params = {
    TableName: tableName,
    Item: item
    };
  dynamo.putItem(params, context.done);
};
```

####書き込みテストを行う
・　テストイベントの設定ページに移ります。
・　[新しいテストイベントの作成]を選び、イベントテンプレート[Mobile Backend]を選択し、適当なイベント名を記入します。
・　イベント名の下の枠に書き込むデータを記入します。ここには自動で値の決まるTimestamp以外の全項目のデータが含まれてることが必要です。

```json
{
  "track": "Test",
  "comment": "Hello AWS Lambda",
  "name": "xxxx"
}
```

・　右下の作成ボタンを押し、Lambda関数のページに戻り、右上のテストをクリックします。
・　Execution Resultsで、Status：Succeededと表示されれば成功です。
・　DynamoDBに移り、作成したTable[hogehoge_dynamodb_table]、項目を選び、データが格納されていることを確認します。

#LambdaからDynamoDBを読みに行く
####ロールに読み込み権限を追加する
・　Lambdaで書き込み関数を作った際に設定したロール[lambda_dynamo]に読み込み権限を追加します。
・　IAM管理画面でロール[lambda_dynamo]選択します。
・　MicroserviceExecutionRoleを含むポリシーを選択します。
・　JSONタブを選択してActionに”dynamodb:Query”を追加します。
・　ポリシーの確認を押します。
・　変更の保存を押します。

```json
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:999999999999:table/*"
        }
```

####Lambdaで読み込み専用の関数を作る
・　Lambda管理画面にアクセスします。
・　関数の作成から設計図を選択し、書込み関数作成時と同じ[simple-mobile-backend]を選択します。
・　適当な関数名を入力します。
・　既存ロール[serice-role/lambda_dynamo]を選択します。
・　右下の関数の作成をクリックします。
・index.jsの中身を以下に置き換えて保存します。

```javascript
console.log('Loading function');
var doc = require('dynamodb-doc');
var docClient = new doc.DynamoDB();
exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  var params = {};
  // TODO: テーブル名を確認してください
  params.TableName = "hogehoge_dynamodb_table";
  params.KeyConditions = [docClient.Condition("Track", "EQ", event.track),
  docClient.Condition("Timestamp", "GT", 2000)];
  params.Limit = 40;
  params.ScanIndexForward = false;
  console.log(params);
  docClient.query(params, context.done);
};
```
####読み込みテストを行う
・　テストイベントの設定ページに移ります。
・　[新しいテストイベントの作成]を選び、イベントテンプレート[Mobile Backend]を選択し、適当なイベント名を記入します。
・　イベント名の下の枠に読み込みたいデータの条件を記入します。 
**注意：**条件にプライマリーキー”track”を含めることは必須です。

```json
{
  "track": "Test",
  "comment": "Hello AWS Lambda",
  "name": "xxxx"
}
```

・　右下の作成ボタンを押し、Lambda関数のページに戻り、右上のテストをクリックします。
・　Execution Resultsで、Status：Succeededと表示され、下枠に抽出結果が表示されれば成功です。

####あとがき
ハンズオンではAPI Gateway接続もやったので、自分で再現できたら記事にする予定です。