Open1
Laravel DynamoDB
概要
LaravelでDynamoDBを取り扱う際の調査。次の観点について調査を行う
- DynamoDBとは?
- migration
- テーブル構造の設計
- パフォーマンス
- 料金
- 料金を抑える方法
- ローカルでの開発方法
- テスト時のmigration
1. DynamoDBとは
- key-value およびドキュメントデータモデルをサポートする NoSQL データベース
- 「オンデマンド」と「プロビジョニング済み」という 2 種類のキャパシティーモードがある
オンデマンドキャパシティモード
DynamoDB の料金は、アプリケーションがテーブルに対して実行したデータの読み取り/書き込みに対して発生します。
DynamoDB はワークロードの拡大や縮小に即座に対応できるため、アプリケーションによって実行される読み取りと書き込みのスループット予測値を指定する必要はありません。
オンデマンドキャパシティーモードは以下のようなケースで利用がおすすめです。
・未知のワークロードで新規テーブルを作成する
・アプリケーショントラフィックが予測できない
・使った分のみ支払う方式の方が都合が良い
プロビジョニング済
アプリケーションに必要と予想される 1 秒あたりの読み込みと書き込みの回数を指定します。
Auto Scaling を使用すれば、指定した利用率に応じてテーブルのキャパシティーが自動的に調整されるので、アプリケーションのパフォーマンスを確保しつつコスト削減が可能です。
プロビジョニング済みキャパシティーモードは以下のようなケースで利用がおすすめです。
・アプリケーショントラフィックが予測できる。
・トラフィックが一定または徐々に変化するアプリケーションを実行する。
・必要なキャパシティーを予想してコストをコントロールできる。
2. migration
<?php
use Illuminate\Database\Migrations\Migration;
use BaoPham\DynamoDb\DynamoDbClientService;
class CrateDynamoDbMoviesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// テスト時には DynamoDB を利用しない
if (app()->environment('testing')) {
return;
}
$dynamoDbClientService = resolve(DynamoDbClientService::class);
$client = $dynamoDbClientService->getClient();
$params = [
'TableName' => 'Movies',
'KeySchema' => [
[
'AttributeName' => 'year',
'KeyType' => 'HASH',
],
[
'AttributeName' => 'title',
'KeyType' => 'RANGE',
],
],
'AttributeDefinitions' => [
[
'AttributeName' => 'year',
'AttributeType' => 'N'
],
[
'AttributeName' => 'title',
'AttributeType' => 'S'
],
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 10,
'WriteCapacityUnits' => 10,
],
];
$client->createTable($params);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// テスト時には DynamoDB を利用しない
if (app()->environment('testing')) {
return;
}
$dynamoDbClientService = resolve(DynamoDbClientService::class);
$client = $dynamoDbClientService->getClient();
$params = [
'TableName' => 'Movies',
];
$client->deleteTable($params);
}
}
検討内容
nordsoftware/lumen-dynamodb はテーブル作成のための仕組みを提供しているが、migration の機能は提供してなさそう
quankim/laravel-dynamodb-migrations というものも存在しているが、ドキュメントが少ないのと、利用実績があまりなさそう(Github の Star, packagist の Installs)なので今回は見送り
参考リンク