laravel
DynamoDB

DynamoDbModel派生のクラスからfind()すると400 Bad Requestが返ってくる時の原因と対策

現象

  • LaravelからDynamoDBを呼び出そうとしています。
  • DynamoDBModelを派生させたクラスを作りfind()すると400 BAD Requestが返却されます
  • all()は成功しているので接続に問題は無い模様

ググっても殆どヒットしなかったので、同様に迷ってる方の参考になれば幸いです。

現象の詳細

ソース

extendClass.php
<?php

namespace App\Models;
use BaoPham\DynamoDb\DynamoDbModel;

class hogeClass extends DynamoDbModel
{
  protected $table = 'hoge_table';

  protected $primaryKey = 'id_hash';

  protected $fillable = ['name','description','site_url','background_image_path','icon_image_path'];

}
fuga.php
$model = new hogeClass();
$result = $model->all();
Log::debug("result = " .$result);  //success

$idHash = "qawsedrftgyh123";
$hoge = $model->find($idHash);

ログ

debug.log
local.DEBUG: exception 'Aws\DynamoDb\Exception\DynamoDbException' with message 'Error executing "GetItem" on "https://dynamodb.us-east-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.us-east-1.amazonaws.com` resulted in a `400 Bad Request` response:
{"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema" (truncated...)
 ValidationException (client): The provided key element does not match the schema - {"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema"}'

後述する参考フォーラムでは「別のテーブルで試したらうまくいった」となっていてイマイチ解決してません。

原因と解決法

DynamoDBのテーブルを作る際にPrimary KeyとSort Keyの2つを指定した場合、
find()の引数にPrimary Keyのみ指定すると400が返却されるようです。

テーブル作成の際にPrimary Keyのみの指定にしたところ正常動作しました。

参考

https://www.bountysource.com/issues/42673508-dynamodbexception-in-wrappedhttphandler-error

以上です