自分用めも。今回の記録は一個ずつの操作とかしかないから、またいずれ、関数だけ追記する。。かな。。?
準備
- Dynamo側
接続したいDBへのアクセス権限を与えたIAMユーザーを作成する。
【ポリシーサンプル】
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListAndDescribe",
"Effect": "Allow",
"Action": [
"dynamodb:List*",
"dynamodb:DescribeReservedCapacity*",
"dynamodb:DescribeLimits",
"dynamodb:DescribeTimeToLive"
],
"Resource": "*"
},
{
"Sid": "SpecificTable",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGet*",
"dynamodb:DescribeStream",
"dynamodb:DescribeTable",
"dynamodb:Get*",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:BatchWrite*",
"dynamodb:CreateTable",
"dynamodb:Delete*",
"dynamodb:Update*",
"dynamodb:PutItem"
],
"Resource": "${対象DynamoDBのARN}"
}
]
}
“Action”の許可は使うものを。
いつも通りIAMユーザーにポリシーをアタッチして、aws_access_key_idとaws_secret_access_keyを取得する。
- PHP側
PHPはversion7.3、AWS SDKは3.1
【composer.json】
"require": {
"aws/aws-sdk-php": "^3.112"
}
DynamoDbClientとMarshalerの読み込み。
Marshalerは文字列とかをDynamo向けに変換してくれる。
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Marshaler;
接続
credentials(認証)ファイルの作成
PHPが動いてる環境上のホームディレクトリ上で、なければ.aws/credentialsファイルを作成する。
[DynamoConnectSample1]
aws_access_key_id = ${さっき取得したアクセスキーID}
aws_secret_access_key = ${さっき取得したシークレットキー}
[Sample2]
aws_access_key_id = ${アクセスキーID}
aws_secret_access_key = ${シークレットキー}
こんな感じで置いておくとLambdaとか他の接続時にも[]内の名前だけでprofileとして呼び出せるので楽。
- 接続clientの生成
/**
* dynamo接続
* @return bool
*/
try{
$dynamoClient= new DynamoDbClient([
'profile' => 'DynamoConnectSample1',
'region' => '${DynamoDBのリージョン}',
'version' => 'latest'
]);
return true;
} catch (\Exception $e) {
echo($e->getMessage());
return false;
}
}
- marshalingする
/**
* Inset,update前のmarshaling
* @param String $itemParam
*'{"id": ' . $id . ',"created_at": "' . $date . '"}'
* @return Json
*/
public function marshalingJson($itemParam)
{
$marshaler = new Marshaler();
$item = $marshaler->marshalJson($itemParam);
echo(print_r($item, true));
return $item;
}
‘{“id”: ‘ . $id . ‘,”created_at”: “‘ . $date . ‘”}’みたいな文字列を引数に与えると
Array
(
[id] => Array
(
[S] => idididididi
)
[created_at] => Array
(
[S] => 2020-01-21
)
)
のように、DynamoDB向けの形に変換してくれる。
$params = [
'TableName' => ${DynamoDBのテーブル名},
'Item' => marshalingJson('{"id": ' . $id . ',"created_at": "' . $date . '"}')
];
- アイテムを一個挿入する
$result = dynamoClient->putItem($params);
- アイテムを一個取得する
$result = dynamoClient->getItem($params);
Array(
[Item] => Array
(
[id] => Array
(
[S] => idididididididi
)
[created_at] => Array
(
[S] => 2021-01-21
)
)
)
こんな感じの配列で返るので$results[“Item”][“id”][“S”]とかって感じで対象を取得できる。
- アイテムを一個削除
dynamoClient->deleteItem($param);
超基礎。