SimpleDBはRDBのSELECTのようなクエリーを発行することができるので、条件に該当するデータを取得することができます。

しかしながら、一回のAPIリクエストで取得できるデータ数は100件までとなっており、それ以降のデータを取得するには、「NextToken」というものを利用して、再度同様のクエリーをAPIでリクエストする必要があります。

具体例としては、100件以上該当データがある場合、レスポンスにNextTokenが含まれ、そのNextTokenを指定して、再度同様のクエリーをリクエストする形になります。
当然、次の100件でもデータが取得しきれない場合は、レスポンスに同様のNextTokenが含まれるので、それを指定して再度リクエストすることになります。

上記を考慮すると、すべてのデータを取得するには、NextTokenがあるかぎり、複数のリクエストを行う必要があります。

ということで、PHPで簡単に作ってみました。

require_once(AWS_SDK_PATH . "/sdk.class.php");
date_default_timezone_set("Asia/Tokyo");

$sdb = new AmazonSDB(
    array("key" => SDB_KEY_ACCESS, "secret" => SDB_KEY_SECRET)
);
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);

$query = "SELECT * FROM log WHERE uid >= '0' ORDER BY uid DESC";
$option = array();
do {
    $response = $sdb->select($query, $option);
    foreach($response->body->SelectResult->Item as $item) {
        print($item->Name . "t");
        foreach($item->Attribute as $attribute) {
            print($attribute->Name  . ":");
            print($attribute->Value . "t");
        }
        print("n");
    }
    if(isset($response->body->SelectResult->NextToken)) {
        $option["NextToken"] = $response->body->SelectResult->NextToken;
    } else {
        $option["NextToken"] = null;
    }
} while($option["NextToken"] != null);

exit(0);
?>

実行結果は、下記のようになります。

# php list-data.php
4f3b67cf5396d8.04566676 uid:1 timestamp:1329293263 action:1
4f3b65774e50c6.59284865 uid:1 timestamp:1329292663 action:1
4f3b64ab8239a8.32909808 uid:1 timestamp:1329292459 action:1
4f3b649b3a3cd1.62613728 uid:1 timestamp:1329292443 action:1
4f3b625e9e17f1.40124430 uid:1 timestamp:1329291870 action:1
4f3b58032f0737.20329909 uid:1 timestamp:1329289219 action:1
...

こちらを応用すれば、SipmleDBのバックアップも簡単に作れるかもしれません。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら