AWSのDynamoDB、使っていますか?
今回は・・・
わけあってもともとあるテーブルたちの名前を一部リネームしたものをそのまま複製したい!
(中身は空で良い)
となり、手で1つずつ定義を設定して作るのは面倒なので、PHPでさくっとやってみました。
●流れ●
① AWS SDKを使えるようにする
https://github.com/masayuki0812/dynamodb-php-wrapper
② listTablesでDynamoの一覧を取得
③ ②をforeachで回し、各テーブルの定義をdescribeTableで取得
④ リネームしたテーブル名と取得した定義を使ってcreateTable
●実際のコード●
※FuelPHPで実装しています
※SDKの処理を取得するために、一度Modelを通していますがお好みで・・・
// Dynamoテーブルのテーブル名を一覧で取得
$data = Model_Dynamo_Base::listTables(); // いい感じの場所でsdkの「listTables」を呼び出してください
foreach ($data['TableNames'] as $index => $base_tablename) {
// リネーム処理
$tabelname = str_replace(‘test’,’test2’,$base_tablename);
// 1テーブルごとにテーブル定義を取得
$base_table_data = Model_Dynamo_Base::describeTable($base_tablename); // いい感じの場所でsdkの「describeTable」を呼び出してください
// 作成したいテーブル名に変更
$base_table_data['Table']['TableName'] = $tabelname;
// キャパを読み取りも書き込みも調整
$base_table_data['Table']['ProvisionedThroughput']['ReadCapacityUnits'] = 1;
$base_table_data['Table']['ProvisionedThroughput']['WriteCapacityUnits'] = 1;
$params = $base_table_data['Table'];
// テーブル作成
$bbb = Model_Dynamo_Base::createTable($params); // いい感じの場所でsdkの「createTable」を呼び出してください
}
}
dynamodb-php-wrapperに追記する形で作っています
public function listTables($ExclusiveStartTableName = null, $limit = null)
{
$params = array();
if (!is_null($ExclusiveStartTableName)) {
$params['ExclusiveStartTableName'] = $ExclusiveStartTableName;
}
if (!is_null($limit)) {
$params['limit'] = $limit;
}
$response = $this->client->listTables($params);
return $response;
}
public function describeTable($tableName)
{
$params = array();
if (!is_null($tableName)) {
$params['TableName'] = $tableName;
}
$response = $this->client->describeTable($params);
return $response;
}
public function createTable($param) {
$this->client->createTable($param);
}
こんな感じです。
あまり参考資料がなかったので苦戦しましたが、出来てしまうとかなり楽でした。