PHPでAWS DynamoDBにアクセスする方法(使用例)

PHPAWS DynamoDB にアクセスする方法(使用例)をご紹介します。
(なお、カンマ前置でコードを記載しています。)

共通部

require 'vendor/autoload.php';

$sdk = new Aws\Sdk([
    'region'    => 'ap-northeast-1'  // 東京リージョンの場合。
    ,'version'  => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();


putItem

この例では、プライマリキーは 'ID' のみとします(パーティションキーのみでソートキー無し)。以下同様です。

$param = [
    'TableName' => 'Table1'
    ,'Item' => [
        'ID'   => [ 'S' => 'ID_001' ]
        ,'foo' => [ 'S' => 'value1' ]
        ,'bar' => [ 'S' => 'value2' ]
        ,'baz' => [ 'S' => 'value3' ]
     ]
];

try {
    $response = $dynamodb->putItem($param);
} catch(Exception $e) {
    // エラーハンドリングを行う
}

上記で、'S' は String(文字列) の S です。


上書き禁止にする場合:

$param = [
    'TableName' => 'Table1'
    ,'Item' => [
        'ID'   => [ 'S' => 'ID_001' ]
        ,'foo' => [ 'S' => 'value1' ]
        ,'bar' => [ 'S' => 'value2' ]
        ,'baz' => [ 'S' => 'value3' ]
     ]
     ,'ConditionExpression'      => 'attribute_not_exists(#ID)'
     ,'ExpressionAttributeNames' => ['#ID' => 'ID']
];

try {
    $response = $dynamodb->putItem($param);
} catch(Exception $e) {
    // エラーハンドリングを行う
}


updateItem

$param = [
    'TableName' => 'Table1'
    ,'Key' => [
        'ID' => [ 'S' => 'ID_001' ]
    ]
    ,'UpdateExpression' => 'SET foo = :value100, bar = :value200'
    ,'ExpressionAttributeValues' => [':value100' => [ 'S' => 'value100' ]
                                    ,':value200' => [ 'S' => 'value200' ]]
];

try {
    $response = $dynamodb->updateItem($param);
} catch(Exception $e) {
    // エラーハンドリングを行う
}


getItem

$param = [
    'TableName' => 'Table1'
    ,'Key' => [
        'ID' => [ 'S' => 'ID_001' ]
    ]
];

try {
    $response = $dynamodb->getItem($param);
} catch(Exception $e) {
    // エラーハンドリングを行う
}

echo $response['Item']['foo']['S']; // 参照例


deleteItem

$param = [
    'TableName' => 'Table1'
    ,'Key' => [
        'ID' => [ 'S' => 'ID_001' ]
    ]
];

try {
    $response = $dynamodb->deleteItem($param);
} catch(Exception $e) {
    // エラーハンドリングを行う
}


scan

例として、属性 foo が存在する項目を全て取得したい場合とします。

$param = [
    'TableName'                 => 'Table1'
    ,'FilterExpression'         => 'attribute_exists(#foo)'
    ,'ExpressionAttributeNames' => ['#foo' => 'foo']
    //,'ProjectionExpression'   => ...  // 一部の属性のみ欲しい場合はProjectionExpressionを指定する
];

do {
    try {
        $response = $dynamodb->scan($param);
    } catch(Exception $e) {
        // エラーハンドリングを行う
    }
    
    foreach($response['Items'] as $res) {
        echo $res['foo']['S']."\n";    // 参照例
    }
    
    $param['ExclusiveStartKey'] = $response['LastEvaluatedKey'];
} while ($param['ExclusiveStartKey']);

上記で、do~whileを行っているのは、scan および query では一度に最大1MBの取得になるためです(デフォルトの場合)。


query

ソートキー無しの例ですので操作としてはあまり意味がありませんが query の例です。
ソートキー有りの場合は KeyConditionExpression に '#ID = :val AND begins_with(#sortKey, :val2)' のような指定が可能になります。

$param = [
    'TableName'                  => 'Table1'
    ,'KeyConditionExpression'    => '#ID = :val'
    ,'ExpressionAttributeNames'  => ['#ID' => 'ID']
    ,'ExpressionAttributeValues' => [':val' => ['S' => 'ID_001']]
    //,'ProjectionExpression'    => ...  // 一部の属性のみ欲しい場合はProjectionExpressionを指定する
];

do {
    try {
        $response = $dynamodb->query($param);
    } catch(Exception $e) {
        // エラーハンドリングを行う
    }
    
    foreach($response['Items'] as $res) {
        echo $res['foo']['S']."\n";    // 参照例
    }
    
    $param['ExclusiveStartKey'] = $response['LastEvaluatedKey'];
} while ($param['ExclusiveStartKey']);