DynamoDBを使ったデータの挿入、取り出し

DynamoDBを使ってテーブルを作り, AWS SDK for PHPを使ってデータの挿入、取り出しを行ってみました.  
# AWS SDK for PHPのインストール  
AWS SDKのインストールにはcomposerを用いました. まずはcomposer.jsonを作成します.  

```composer.json
{
  "require": {
    "aws/aws-sdk-php": "*"
  }
}
```

composer.jsonを書いた後, ```php composer.phar install```を実行します.  


# 認証情報ファイルの設定  
次にAWSのアクセスキー, シークレットキー, リージョンの情報を書いたファイルを作成します.  
```include/```に```cofig.php```ファイルを作成します.

```include/config.php
<?php
  return array(
      'includes' => array('_aws'),
      'services' => array(
          'default_settings' => array(
              'params' => array(
                  'key' => 'YOURアクセスキー',
                  'secret' => 'YOURシークレットキー',
                  'region' => 'ap-northeast-1'
                )
            )
        )
      );
```

以上で基本的な設定は終わりです. 次にDynamoDBにテーブルを作成していきます.

# DynamoDBデーブルの作成
DynamoDBのAWS Consoleから作成していきます.
「create table」をクリックすると, 以下のような画面が出てきます.

![スクリーンショット 2015-02-20 18.40.03.png](https://qiita-image-store.s3.amazonaws.com/0/56634/3275b086-d8a6-fdda-7d9c-6fb1a0fc5217.png)


ここで「Table Name」に```Team```と入力します.
次に「Primary Key Type」を指定します. これは「Hash and Range」か「Hash」のどちらかが選べます. 今回は「Hash and Range」を指定し, 上図のように値を入れます. 「Hash and Range」を指定した場合, この2つの値を合わせて一意のキーとなります.


この後の画面ではindexやthroughput capacityの設定が続きますが, 今回はこのまま「Continue」をします.

次にいよいよデータの挿入・取り出しを行っていきます. 


# Putを用いたデータの挿入  
Dynamoでは各テーブルのレコードをItemといいます. Itemにはテーブル作成で指定したhash-key, range-keyの他にattributesという値を挿入することができます.
ファイルは以下のように作成します.

```dynamo_put.php
<?php

// Composer Vender
require_once('vendor/autoload.php');

use Aws\Common\Aws;
use Aws\DynamoDbException\DynamoDbException;

// AWSクレデンシャル
$aws = Aws::factory('./include/config.php');

try {
  $client = $aws->get('dynamodb');

  $result = $client->putItem(array(
      'TableName' => 'Team',
      'Item' => $client->formatAttributes(array(
          'id' => 101,
          'memberid' => 1,
          'name' => 'Yuya',
          'language' => 'Japanese',
          'age' => 22,
        )),
    ));
} catch (DynamoDbException $e) {
  echo 'Not Success';
}
```

そして, 実行します.

```
php dynamo_put.php
```

attributeですが, 各アイテムごとに異なっても大丈夫です. 例として, 以下のようなものも大丈夫です. 

```dynamo_put2.php
<?php

// Composer Vender
require_once('vendor/autoload.php');

use Aws\Common\Aws;
use Aws\DynamoDbException\DynamoDbException;

// AWSクレデンシャル
$aws = Aws::factory('./include/config.php');

try {
  $client = $aws->get('dynamodb');

  $result = $client->putItem(array(
      'TableName' => 'Team',
      'Item' => $client->formatAttributes(array(
          'id' => 101,
          'memberid' => 2,
          'name' => 'Sam',
          'language' => 'English',
          'gender' => 'Male',
        )),
    ));
} catch (DynamoDbException $e) {
  echo 'Not Success';
}
```



次に値を取得していきます. 値の取得にはキーを指定するGetとテーブルの前アイテムを取得するScanとがあります.

# データの取得
## Get
Getでは, 以下のようにアイテムのhash-keyとrange-keyを指定して値を取得します.

```dynamo_get.php
<?php

require_once('vendor/autoload.php');

use Aws\Common\Aws;
use Aws\DynamoDbException\DynamoDbException;

$aws = Aws::factory('./include/config.php');

try {
  $client = $aws->get('dynamodb');

  $result = $client->getItem(array(
      'ConsistentRead' => true,
      'TableName' => 'Team',

      'Key' => array(
          'id' => array('N' => 101),
          'memberid' => array('N' => 1)
        ),
      ));

  var_dump($result);
} catch (DynamoDbException $e) {
  echo 'Not Success';
}
```

ここで, 'N'が出てきますが, これはidやmemberidの型Numberによるものです. 型の対応は以下のようになります. 

| キー名 | データの型 | 
|:------|------------:|
| N     |       Number| 
| S     |       String| 
| B     |       Binary|
| SS    | A set of Strings| 
| NS    | A set of Numbers| 
| BS    | A set of Binary |

実行します.

```
php dynamo_get.php
```

配列の形でデータが取れていることがわかります.

## Scan
コードは以下になります.

```dynamo_scan.php
<?php

require_once('vendor/autoload.php');

use Aws\Common\Aws;
use Aws\DynamoDbException\DynamoDbException;

$aws = Aws::factory('./include/config.php');

try {
  $client = $aws->get('dynamodb');

  $result = $client->scan(array(
    'TableName' => 'Team',
  ));

  var_dump($result);

} catch (DynamoDbException $e) {
  echo 'Not Success';
}
```

実行します.

```
php dynamo_scan.php
```

これもアイテムすべてが配列の形で取得できます.

# まとめ
以上のような感じでDynamoDBを使ってデータの挿入・取得をやってみました. 
他にも「query」や「batchwriteitem」などの機能があるみたいです.

# 参考にしたサイト
今回以下のようなサイトを参考にしました.

- DynamoDb 入門編 
(http://blog.serverworks.co.jp/tech/2013/09/25/dynamodb-01/)  
- AWS SDK for PHP2を使ってAmazon DynamoDBのデータを読み書きするサンプル(http://www.lancork.net/2014/08/amazon-dynamodb-aws-sdk-for-php2/)