Open1

Laravel DynamoDB

スースー

概要

LaravelでDynamoDBを取り扱う際の調査。次の観点について調査を行う

  1. DynamoDBとは?
  2. migration
  3. テーブル構造の設計
  4. パフォーマンス
  5. 料金
  6. 料金を抑える方法
  7. ローカルでの開発方法
  8. テスト時のmigration

1. DynamoDBとは

  1. key-value およびドキュメントデータモデルをサポートする NoSQL データベース
  2. 「オンデマンド」と「プロビジョニング済み」という 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)なので今回は見送り

参考リンク

https://www.sunnycloud.jp/column/20210228-01/
https://qiita.com/okashoi/items/b30812d837a5e830416a