DynamoDBとの接続でlaravel-dynamodbを使ってみた感想

DynamoDBとの接続でlaravel-dynamodbを使ってみた感想

laravel-dynamodについて簡単にまとめます。

  • dynamodb-localもコンパイルされたある意味完成されたDockerが存在している
  • 勉強用資料としてはとても優れている
  • とりあえず試すには最適(これ以上の解はない)
  • 本番環境で利用するにはdynamodb-localの切り離しが必要だがここが心配になるスクリプト構成をしている

個人的な感想でしかありませんが、私はこの様に感じました。
laravelがバックエンドの本番環境で実装するならAWS-SDK-for-PHPAWS-SDK-for-JavaScriptの2択だと思います。

Laravel-dynamodbのスゴイところ

  • インストールが超楽/超早
  • NoSQLに抵抗があってもそれを打ち消してくれるEloquent Likeな抽出文

最初のハードルはテーブルを作成するところになります。
テーブルを作成してしまった後は、正直言ってもうLaravelEloquentです。
それくらい抵抗なく抽出文を記載できます。

App\Models\Movie::where('search_key', '1')
    ->where('date', 'between', ['2017-01-01', '2018-01-01'])
    ->toDynamoDbQuery()

これですから。Eloquent likeでしょ。
入口としては入りやすいですが、それ故に 「noSQLってなんだったっけ ?」 と思ってしまうところもあります。

aws-sdk-for-phpだとこんな感じで書く様です。(抽出条件の内容は異なります。)

$search_key = 1;
$jsonStr = '{'.'":search_key":'.'"'.$search_key.'"'.'}';
$eav = $this->marshaler->marshalJson($jsonStr);

$params = [
    'TableName' => $tableName,
    'KeyConditionExpression' => '#id = :search_key',
    'ExpressionAttributeNames'=> [ '#id' => 'device_id' ],
    'Limit' => 1,
    'ScanIndexForward' => false,
    'ExpressionAttributeValues'=> $eav,
];

比べるとよく分かりますよね、圧倒的な書きやすさが。

Laravel-dynamodbのツライところ

今回の環境では、SES先の社長より「これでいいんじゃね?」とlaravel-dynamodbをプッシュされて居た事もありコイツいで行くつもりでした。が、テスト用のAWS上のDynamoDBにアクセスしてみて「???」と思うコードが点在していました。

【作りやすい環境で構築してバグとり】<【公式提供な環境で実装し初期バグを減らす】

その結果として、この様な判断に至り、AWS-SDKでの開発が確定しました。

Laravel-dynamodbで散見した課題

私がGitHubから最初のコードを取得したのも問題だと思います。
このコードの中には、configなどにハードコートされたパートが複数ありました。
結果として「.envを修正したのに何も変わらない」という状況を引き起こし「バグが出た時に探すコストが大変」との判断が降りました。

具体的にはこんなところです。

■.env.php

以上略

##############################################
# AWS-SDK の設定
##############################################

AWS_ACCESS_KEY_ID=accesskey
AWS_SECRET_ACCESS_KEY=secretkey
AWS_DEFAULT_REGION=ap-northeast-1
AWS_DEFAULT_REGION=localhost:8000
AWS_REGION=localhost:8000
AWS_BUCKET=

##############################################
# DynamoDB の設定
##############################################

DYNAMODB_CONNECTION=local
DYNAMODB_REGION=localhost:8000
DYNAMODB_KEY=accesskey
DYNAMODB_SECRET=secretkey
DYNAMODB_DEBUG=true
DYNAMODB_LOCAL_ENDPOINT=http://dynamodb:8000 #<=Local限定だがエンドポイントを指定

以下略

■config/aws.php

    'credentials' => [
        'key'    => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
    ],
    'region' => env('AWS_REGION'),
    'endpoint' => 'http://dynamodb:8000', #<=固定値になっている
    'version' => 'latest',
    'ua_append' => [
        'L5MOD/' . AwsServiceProvider::VERSION,
    ],

■docker-compose.yml

  dynamodbadmin:
    image: instructure/dynamo-local-admin
    ports:
      - "8001:8001"
    environment:
      DYNAMO_ENDPOINT: http://dynamodb:8000/ #<=固定値になっている
      AWS_ACCESS_KEY_ID: accesskey
      AWS_SECRET_ACCESS_KEY: secretkey
      AWS_DEFAULT_REGION: localhost:8000
      AWS_REGION: localhost:8000

1箇所修正しても他がハードコートされているので動かない。
「完全に動かない」ならまだ良いが、「まれに動かない」となった場合には問題箇所の確認作業にコストと時間がかかる可能性がある。
=> 本番環境の構築について、あえて選ぶ必要はない。

まとめ

dynamodb-localを利用した環境をあっという間に構築でき、ORMで簡単に記載ができる。
入口としてはもう最高のツールだと思います。

課題は実際に運用するとなるとどう判断するかに尽きます。
今回参画しているプロジェクトでは私から「やめましょう」と伝えました。

そもそも、バックエンドがDynamoDBに直接繋いでやりとりするメリットって固定な4つのカラムで検索するくらいしかありません。
Lamdba使っていじったデータをAPIで受け取った方が遥かに効率が良いと思います。
事情によりLambdaの利用ができない場合の代替手段程度に思っていれば、まぁそこそこ使える道具。

それがlaravel-dynamodbの立場だと思います。超絶書きやすいんですけどね。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください