読者です 読者をやめる 読者になる 読者になる

【aws】phpからdynamodbを使う方法メモ

aws php

はじめに

awsのdynamodbをログ保存用として使用
今回は他の人が作った環境での作業だったのでコントロールパネル等の設定は記載しません

不慣れなのもあると思うけど、データの取得と登録する調査をするだけでけっこう時間かかってしまった、、、
今回はIAMロールを使っているのでAPIキーとシークレットはコードには書いていません
※IAMロールについてちゃんと理解できていないので意味不明だったらすみません、、、

ちなみにawsphpsdkはダウンロードして使用しました

実装

MyDynamoDB.php

require(AWS_SDK_PATH.'aws/aws-autoloader.php');
use Aws\Common\Aws;
use Aws\DynamoDb\DynamoDbClient;

class MyDynamoDB
{
    // aws設定
    public static $config = array(
        "region" => "ap-northeast-1",
        "version" => "latest",
        "endpoint" => "http://dynamodb.ap-northeast-1.amazonaws.com/", // http://dynamodb.[リージョン名].amazonaws.com
    );

    // データの登録
    public function putItem($table, $data)
    {
     	$client = new DynamoDbClient(self.$config);

        $client->putItem(array(
            "TableName" => $table,
            "Item" => $data,
        ));
    }

    // 条件を指定してスキャン
    public function scan($table, $kind)
    {
     	$client = new DynamoDbClient(self.$config);

        $iterator = $client->getIterator('Scan', array(
            'TableName' => $table,
            'ScanFilter' => array(
                'type' => array(
                    'AttributeValueList' => array(
                        array('N' => $kind)
                    ),
                    'ComparisonOperator' => 'EQ' // イコール
                ),
            )
        ));
        return $iterator;
    }

    public static function query($table, $type, $fromDate, $toDate)
    {
     	$client = new DynamoDbClient(self.$config);

        $iterator = $client->getIterator('Query', array(
            "TableName" => $table,
            "KeyConditions" => array(
                "datetime" => array(
                    "AttributeValueList" => array(
                        array('S' => $fromDate),
                        array('S' => $toDate
                    ),
                    'ComparisonOperator' => 'BETWEEN'
                ),
                "id" => array(
                    "AttributeValueList" => array(
                        array('N' => $type),
                    ),
                    "ComparisonOperator" => "EQ",
                ),
            ),
        ));
        return $iterator;
    }
}

実際に呼び出す

// 登録
MyDynamoDB::putItem("tablename", array(
    "id" => array("N" => 1),
    "name" => array("S" => "山田花子"),
));

// スキャンして検索
MyDynamoDB::scan("tablename", $kind = 1);

// クエリで検索
MyDynamoDB::query("tablename", $type = 1, $fromDate = "2016-01-01 00:00:00", $toDate = "2016-12-31 23:59:59");

普段、MySQL使っているので同じようなイメージで使えるようにしてみました。

ちなみに最初に理解しておけばよかった点は
Scan(スキャン)は全データをなめるので低速(かどうかはわかりませんが、、、)
Queryはテーブルのスキーマでキーが定義されているカラムが対象
あとは、項目を指定するときにカラム名だけでなく型も渡してあげないとダメなことでした

以上です