DynamoDBとの接続でlaravel-dynamodbを使ってみた感想
DynamoDBとの接続でlaravel-dynamodbを使ってみた感想
laravel-dynamodについて簡単にまとめます。
- dynamodb-localもコンパイルされたある意味完成されたDockerが存在している
- 勉強用資料としてはとても優れている
- とりあえず試すには最適(これ以上の解はない)
- 本番環境で利用するにはdynamodb-localの切り離しが必要だがここが心配になるスクリプト構成をしている
個人的な感想でしかありませんが、私はこの様に感じました。
laravelがバックエンドの本番環境で実装するならAWS-SDK-for-PHP
か AWS-SDK-for-JavaScript
の2択だと思います。
Laravel-dynamodbのスゴイところ
- インストールが超楽/超早
- NoSQLに抵抗があってもそれを打ち消してくれるEloquent Likeな抽出文
最初のハードルはテーブルを作成するところになります。
テーブルを作成してしまった後は、正直言ってもうLaravelEloquentです。
それくらい抵抗なく抽出文を記載できます。
1 2 3 |
<span class="nc">App\Models\Movie</span><span class="o">::</span><span class="nf">where</span><span class="p">(</span><span class="s1">'search_key'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">) </span><span class="o"> -></span><span class="nf">where</span><span class="p">(</span><span class="s1">'date'</span><span class="p">,</span> <span class="s1">'between'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'2017-01-01'</span><span class="p">,</span> <span class="s1">'2018-01-01'</span><span class="p">]) </span><span class="o"> -></span><span class="nf">toDynamoDbQuery</span><span class="p">()</span> |
これですから。Eloquent likeでしょ。
入口としては入りやすいですが、それ故に 「noSQLってなんだったっけ ?」 と思ってしまうところもあります。
aws-sdk-for-phpだとこんな感じで書く様です。(抽出条件の内容は異なります。)
1 2 3 4 5 6 7 8 9 10 11 12 |
$<span class="s1">search_key</span> = 1; $jsonStr = '{'.'":<span class="s1">search_key</span>":'.'"'.$<span class="s1">search_key</span>.'"'.'}'; $eav = $this->marshaler->marshalJson($jsonStr); $params = [ 'TableName' => $tableName, 'KeyConditionExpression' => '#id = :<span class="s1">search_key</span>', '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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
以上略 ############################################## # 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 <strong>DYNAMODB_LOCAL_ENDPOINT=http://dynamodb:8000</strong> #<=Local限定だがエンドポイントを指定 以下略 |
■config/aws.php
1 2 3 4 5 6 7 8 9 10 |
'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), ], 'region' => env('AWS_REGION'), <strong>'endpoint' => 'http://dynamodb:8000', #<=</strong>固定値になっている 'version' => 'latest', 'ua_append' => [ 'L5MOD/' . AwsServiceProvider::VERSION, ], |
■docker-compose.yml
1 2 3 4 5 6 7 8 9 10 |
dynamodbadmin: image: instructure/dynamo-local-admin ports: - "8001:8001" environment: <strong>DYNAMO_ENDPOINT: http://dynamodb:8000/ #<=</strong>固定値になっている 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の立場だと思います。超絶書きやすいんですけどね。
-
前の記事
Laravel:数字8桁の一意の乱数を生成する5つの方法 2021.10.05
-
次の記事
コロナが終息したら在宅勤務はどう変わるか、周辺環境から推測してみた 2021.10.07
コメントを残す