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