【超最初のメモ】AWS SDK for PHP と DynamoDB

プログラミング

自分用めも。今回の記録は一個ずつの操作とかしかないから、またいずれ、関数だけ追記する。。かな。。?

準備

  • 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);

超基礎。

タイトルとURLをコピーしました