目的
以前S3でシーケンスを行うみたいな記事を書いて
(S3上でSEQUENCE)[http://qiita.com/supertaihei02/items/16b9d1cd938fb074e01e]
会員情報とかS3で管理してランニングコストを下げたいんだー!とか抜かしましたけれども、
これ無理でした。詳細は元記事に追記してます。
代案としてこちらの方法を発見したわけであります。
そうなってくるとランニングコスト下がるかなー?って突っ込みは受け付けません。
とにかく具体的な情報が少なかった。。意外とマイナー?
ずばっとソースを書きます。これでできました! 2014/03/31現在!
下準備
AWSにアクセスしてーDynamoDBを有効化してーもろもろの部分はちょっと他で調べてたも。
準備ができたらまずはクライアント取るところまで。
require(dirname(__FILE__).'/aws.phar'); // load aws.phar
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
$accesskey = 'Your AWS Access Key'; // TODO
$secret = 'Your AWS Access Secret'; // TODO
$region = 'Your Region'; // TODO (Tokyo => Region::AP_NORTHEAST_1)
$aws = AWS::factory(array(
'key' => $accesskey,
'secret' => $secret,
'certificate_authority' => false,
'region' => $region
));
$client = $aws->get('dynamodb');
シーケンス
これは正式(?)にはatomic counterと呼ばれている手法の様です。
DynamoDBテーブルレコード上のTypeが"Number"のAttributeに対してのみ実行できるアップデートコマンドと考えるとしっくりきます。
以下ソースです。Your ~の部分は自分パラメータに置換してくださいね。
$num = 1;
try {
$item = $client->updateItem(array(
'TableName' => 'Your Tablename',
'Key' => array(
'Your object keyname' => array(
'Your object keytype' => 'Your object keyvalue'
)
),
'AttributeUpdates' => array(
'Your update object keyname' => array(
'Action' => 'ADD',
'Value' => array('N' => $num)
)
),
'Expected' => null,
'ReturnValues' => 'UPDATED_NEW'
));
echo intval($item['Attributes']['memberSequence']['N'], 10);
} catch(Exception $e) {
echo $e->getMessage();
}
指定したAttributeが$num値ずつインクリメントされます。
ReturnValuesにUPDATED_NEWを指定しているので更新された後の番号が$itemに入ってきます。
他に(NONE | ALL_OLD | UPDATED_OLD | ALL_NEW)が指定可能です。
Action => ADDのとこがポイントですねー。
Expectedの部分を指定すると条件付きアップデートってのもできそう。
以上!