Posted at

DynamoDBにつなごう! PHP編

More than 1 year has passed since last update.


はじめに

AWSのPHP-SDKを用いてDynamoDBに接続して、とりあえず一つデータを作るところまで。なお、大体は公式のDocに書いてます。最新情報とかはこちらからどうぞ。

社内でDynamoDB使う機会が来たので人に説明しやすいように纏めて置こうという程度の内容です。


AWSでの準備


アクセスキーを取得する

IAMにアクセスし、アプリケーションで利用するためのユーザを作成しましょう。

そのユーザにDynamoDBへのアクセス権を付与したあと、アクセスキーを生成します。

アプリケーション毎や役割ごとにある程度分けて作ることで、最悪鍵が漏れたときの影響を最小限に出来ます。

意外とDynamoDBFullAccessっていっぱい権限載ってるんですよねえ。。。


DynamoDBにテーブルを作成

設計の話は始めると長くなるのでしません。

適当なプライマリキーを指定してやるだけで出来ます。

最初はLocalに建てられるやつを利用するか、「キャパシティーユニット」少なくしておくとお金かからないです。

ここではあとあとStreams使ってLambdaに流して、をやる気なので東京リージョンに建ててます。


PHP側の準備

まず、先程取得したアクセスキーを環境変数にセットします。

Laravelだと.envに書いておけば済みます。まぁお好みで。

AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX

AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Credentialの設定方法を読んでいると

ハードコードも出来ますが、Githubとかに上げておくと抜かれて大変なのでやめたほうが良いと思います。


PHP Code

ここではComposer前提で話しますが、AWS-SDKのDocに書いてあるので他の手段を用いる方はそちらで。


インストール

Composer ではアプリケーションのディレクトリで require するだけです。

$ php composer.phar require aws/aws-sdk-php

完了したら、autoload.phpをrequireしてあげましょう。

<?php

require 'vendor/autoload.php';


インスタンスの生成

AWS-SDKのインスタンスを生成した後に、createDynamoDbメソッドを用いてDynamoDBClientを生成してきます。

なお、RegionやEndpointはそれを記載したDocがあるのでご参考まで。

use Aws\Sdk;

$sdk = new Sdk([
'endpoint' => 'http://dynamodb.ap-northeast-1.amazonaws.com',
'region' => 'ap-northeast-1',
'version' => 'latest'
]);
$dynamodb = $sdk->createDynamoDb();


Marshaling

データをInsert/Updateする際には、SDKに用意されたMarshalerを使います。

これは、JSONやArrayを良き形に変換してくれるスグレモノです。

DynamoDBに入れる前に通しておきましょう。

use Aws\DynamoDb\Marshaler;

$marshaler = new Marshaler();
$item = $marshaler->marshalJson('
{
"owner_id": '
. $uid . ',
"created_at": "'
. $date . '",
"content_id": "'
. $uid . "-" . $date . '",
"deleted_flag": 0
}
'
);


DynamoDBへのInsert

あとはDynamoDBにデータをInsertしておしまいです。

実行後はAWSのコンソールからテーブルの画面で正常にデータが入っているか確認しましょう。

$params = [

'TableName' => $tableName,
'Item' => $item
];

try {
$result = $dynamodb->putItem($params);
logger()->notice("Added item", $item);
} catch (DynamoDbException $e) {
logger()->critical("Unable to add item.\nMessage: $e->getMessage()", $params);
}

とりあえず一つデータが入れば、利用するFunctionちょっと変えるだけで、Getしてくるのは簡単なはず!