DynamoDB 入門編

記事タイトルとURLをコピーする
こんにちは。開発部の坂本です。 AWSのデータベースサービスで1番有名なのはRDBMSのデータベースサービスであるRDSかと思います。わたし個人としてもデータベースはRDBMSしか利用したことがなく、NoSQLに触れたことがありませんでした。そのため、今回はAWSのNoSQLデータベースサービスである「DynamoDB」に少し触ってみました。 その際の手順を簡単ではありますが、入門編としてまとめたいと思います。 目次
  1. DynamoDBとは
  2. DynamoDBの特徴
  3. 開始手順
  4. AWS SDK for PHP 2
  5. Put
  6. Get
  7. Scan
  8. まとめ
  1. DynamoDBとはDynamoDB」はAWSのフルマネージドNoSQLデータベースサービスです。 2006年に「Dynamo」という論文が書かれ、その論文を元にして作成されたサービスが「DynamoDB」です。   2. DynamoDBの特徴 以下のリストに簡単に「DynamoDB」の特徴をまとめました。 「DynamoDB」はAWSのサービスですので、運用をAWSにおまかせできる点(フルマネージド)が「Cassandra」や「MongoDB」などの他のNoSQLのプロダクトと違うところです。 「データはすべてSSDに格納」し、高速にアクセスできるようにしながらも、「3箇所のアベイラビリティ・ゾーンにデータを保存」することで、高い信頼性も保っています。
  1. 高い拡張性
    ・スケーラビリティに制限がない分散データベース
  2. 管理コストゼロ
    ・運用はAWSまかせ
  3. IOPSをいつでも変更できる
    ・1レコード1KBとした場合の数値
    ・ただし、IOPSを高くするほど料金は上がる
  4. 高い可用性、信頼性
    ・3箇所のアベリラビリティ・ゾーンにデータを保存
    ・最低2箇所への保存が完了した時点でレスポンスして、書き込み完了とする
  5. データへの高速アクセス
    ・すべてのデータをSSDに格納
    ・レスポンスは1桁ミリ秒
  3. 開始手順 では、早速使ってみたいと思います。始めにテーブルの作成をおこないます。テーブルの作成はマネジメント・コンソールから可能です。 テーブルの作成は、以下の手順でマネジメント・コンソールで1~2分で簡単に作成できます。 まずは、「Create Table」をクリックして先に進みます。


次の画面で「Table Name」にテーブル名を入力します。今回は学生の名簿利用を想定して、「Class」テーブルを作成します。 次に、「Primary Key Type」を選択します。「Primary Key Type」は、「Hash and Range」か「Hash」が選択でき、「Hash and Range」にした場合は、2つのカラムを合わせて一意のキーとなります。「Hash」の場合は1つのカラムで一意のキーとなります。 今回は、「Hash and Range」を選択して、ハッシュキーとレンジキーで一意のキーとなるようにしたいと思います。ハッシュキーはクラスの「id」とし、レンジキーは「studentid」とします。


次はインデックスの指定ですが、今回は何も入力せず進みます。


次はIOPSの指定です。こちらも今回はそのまま進みます。ここで1レコード1KBとした場合の秒間あたりの読み書きの回数を指定できます。 ※回数を上げると料金がかかります。


次は、CloudWatchのアラームの指定です。こちらも今回はそのままでアラームを飛ばすメールアドレスの設定だけして、先に進みます。


確認画面が表示されるので、「Create」をクリックして、テーブルを作成します。


最後に「Class」テーブルが作成されたことを確認します。


  4. AWS SDK for PHP 2DynamoDB」ですべての操作を行うには、「API」や「SDK」を利用する必要があります。 今回はPHP用のSDK、「AWS SDK for PHP 2」を利用して設定したいと思います。 インストール方法は以前に「別の記事」で紹介していますので、そちらを参考にしてください。   5. Put それでは、「SDK」を使ってデータを操作したいと思います。まずはデータの挿入です。レコードは、「DynamoDB」では「Item」と呼ばれます。プライマリキーであるハッシュキーとレンジキーの他に「Attribute」と呼ばれる値を挿入します。 /home/ec2-user/dynamo_put.php
require 'AWSSDKforPHP/aws.phar';

use AwsCommonAws;
use AwsDynamoDbExceptionDynamoDbException;

$aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php');

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

    $result = $client->putItem(array(
        'TableName' => 'Class',
        'Item' => $client->formatAttributes(array(
            'id'        => 101,
            'studentid' => 1,
            'name'      => 'Tomoko',
            'gender'    => 'Female',
            'age'       => 26,
        )),
    ));

} catch (DynamoDbException $e) {
    echo 'NG';
}
実行します。
php /home/ec2-user/php dynamo_put.php
「Attribute」は配列で値を入れられますが、何を入れるかは「Item」毎で自由です。必ずしも項目などを以前に挿入したものと同じにする必要はなく、以下のように年齢を除いたりすることもできます。
require 'AWSSDKforPHP/aws.phar';

use AwsCommonAws;
//use AwsAutoScalingExceptionAutoScalingException;
use AwsDynamoDbExceptionDynamoDbException;

$aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php');

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

    $result = $client->putItem(array(
        'TableName' => 'Class',
        'Item' => $client->formatAttributes(array(
            'id'        => 101,
            'studentid' => 2,
            'name'      => 'Taro',
            'gender'    => 'Male',
        )),
    ));

} catch (DynamoDbException $e) {
    echo 'NG';
}
  6. Get 次は値の取得です。以下のようにハッシュキーとレンジキーを指定して取得できます。 /home/ec2-user/dynamo_get.php
require 'AWSSDKforPHP/aws.phar';

use AwsCommonAws;
use AwsDynamoDbExceptionDynamoDbException;

$aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php');

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

    $result = $client->getItem(array(

        'ConsistentRead' => true,
        'TableName'      => 'Class',

        'Key' => array(
            'HashKeyElement'  => array('N' => '101'),
            'RangeKeyElement' => array('N' => '1')
        ),
    ));

var_dump($result);

} catch (DynamoDbException $e) {
    echo 'NG';
}
実行します。
php /home/ec2-user/php dynamo_get.php

実行結果

省略
  ["data":protected]=>
  array(2) {
    ["ConsumedCapacityUnits"]=>
    float(1)
    ["Item"]=>
    array(5) {
      ["id"]=>
      array(1) {
        ["N"]=>
        string(3) "101"
      }
      ["studentid"]=>
      array(1) {
        ["N"]=>
        string(1) "1"
      }
      ["gender"]=>
      array(1) {
        ["S"]=>
        string(6) "Female"
      }
      ["name"]=>
      array(1) {
        ["S"]=>
        string(6) "Tomoko"
      }
      ["age"]=>
      array(1) {
        ["N"]=>
        string(2) "26"
      }
    }
  }
}
  7. Scan 最後はスキャンです。テーブルを総ナメすることができます。 /home/ec2-user/dynamo_scan.php
require 'AWSSDKforPHP/aws.phar';

use AwsCommonAws;
use AwsDynamoDbExceptionDynamoDbException;

$aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php');

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

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

    var_dump($result);

} catch (DynamoDbException $e) {
    echo 'NG';
}
実行します。
php /home/ec2-user/dynamo_scan.php

実行結果

省略
  ["data":protected]=>
  array(4) {
    ["ConsumedCapacityUnits"]=>
    float(0.5)
    ["Count"]=>
    int(2)
    ["Items"]=>
    array(2) {
      [0]=>
      array(5) {
        ["id"]=>
        array(1) {
          ["N"]=>
          string(3) "101"
        }
        ["studentid"]=>
        array(1) {
          ["N"]=>
          string(1) "1"
        }
        ["gender"]=>
        array(1) {
          ["S"]=>
          string(6) "Female"
        }
        ["name"]=>
        array(1) {
          ["S"]=>
          string(6) "Tomoko"
        }
        ["age"]=>
        array(1) {
          ["N"]=>
          string(2) "26"
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        array(1) {
          ["N"]=>
          string(3) "101"
        }
        ["name"]=>
        array(1) {
          ["S"]=>
          string(4) "Taro"
        }
        ["gender"]=>
        array(1) {
          ["S"]=>
          string(4) "Male"
        }
        ["studentid"]=>
        array(1) {
          ["N"]=>
          string(1) "2"
        }
      }
    }
    ["ScannedCount"]=>
    int(2)
  }
}
  8. まとめ まずは、「DynamoDB」に簡単に触れてみました。 「DynamoDB」は「NoSQL」の中でも「キー・バリュー型」ということで、キーと値というシンプルな構造にはなりますが、値の方は配列で自由に項目を追加できるのでいろいろ使いどころがあるのではないかと感じました。 ただまだこの段階では、個人的にはどういったケースで利用することが最適なのかまではつかめていない状態ですので、引き続き「DynamoDB」を使ってみたいと思います。 今回確かめたPut、Get、Scanの他にもUpdate、Deleteはもちろんのこと、BatchGetItemsやQueryというクエリが使えるようなので、次回はその辺りを確認してみます。