Open9

DynamoDB 知見まとめ

KKKKKKKK

AWS CLI : DynamoDBコマンド

  • aws dynamodb list-tables --endpoint-url http://<ホスト名>:8000
    • テーブル一覧表示
しましま

テーブル名:pet
属性 animal-type(key), name(key), sex, weight
のとき

列追加するコマンド

aws dynamodb put-item --table-name pet --item "{\"animal-type\":{\"S\":\"犬\"},\"name\":{\"S\":\"どっぐ\"},\"sex\":{\"S\":\"male\"},\"weight\":{\"N\":\"10\"}}

取得するコマンド

C:\>aws dynamodb get-item --consistent-read --table-name pet --key "{\"animal-type\":{\"S\":\"犬\"},\"name\":{\"S\":\"どっぐ\"}}"

更新するコマンド

C:\>aws dynamodb update-item --table-name pet --key "{\"animal-type\":{\"S\":\"犬\"},\"name\":{\"S\":\"どっぐ\"}}" --update-expression "set weight = :newval" --expression-attribute-values "{\":newval\":{\"N\":\"100\"}}" --return-values ALL_NEW

※注意点
windows環境の実行では特殊なエスケープが必要

'→"
"→\"
KKKKKKKK

DynamoDB SDK for JavaScript

実行環境

  • Node.js
  • Browser
  • AWS Lamda
  • AWS Cloud9 IDE
  • AWS Amplify

セットアップ

  1. Node.jsのインストール
  2. SDKのインストール
  3. インポート

1. Node.js のインストール

お好きな環境でどうぞ

2. SDK のインストール

各AWSサービスのSDKは@aws-sdkにまとめられている。

任意のサービスをパッケージマネージャーでインストールするには以下のように行う。
SERVICE_NAMEに任意のサービス名を指定する。

npm install @aws-sdk/client-{SERVICE_NAME}

yarn add @aws-sdk/client-{SERVICE_NAME}

pnpm add @aws-sdk/client-{SERVICE_NAME}


KKKKKKKK

DynamoDB SDK for PHP in Docker + Laravel

SDKインストール

$ composer require aws/aws-sdk-php


サービスクラスの作成

app/Services/DynamoDBService.php
namespace App\Services;

class DynamoDBService
{
    protected $dynamoDb;

    public function __construct()
    {
        $this->dynamoDb = new \Aws\DynamoDb\DynamoDbClient([
            'region' => env('AWS_DEFAULT_REGION', 'ap-northeast-1'),
            'version' => 'latest',
            'endpoint' => 'http://dynamodb:8000', // compose.yml のサービス名
            'credentials' => [
                'key' => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY')
            ],
        ]);
    }

    public function listTables()
    {
        return $this->dynamoDb->listTables()->get('TableNames');
    }
}


サービスコンテナに登録

app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Foundation\Application;
use Illuminate\Support\ServiceProvider;

use App\Services\DynamoDBService;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->app->singleton(DynamoDBService::class, function (Application $app) {
            return new DynamoDBService();
        });
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        //
    }
}
KKKKKKKK

DynamoDB キーワード

Table Name

その名の通り、テーブル名のこと

Attribute

RDBのカラムに相当

Item

RDBのレコードに相当

Primary Key

その名の通り、プライマリキーのこと

二種類ある

  • Partition Key (Hash Key)

    • 普通のプライマリキー
  • Sorted Key (Range Key)

    • ソートに利用するキー

Secondary Index

  • LSI (Local Secondary Index)

    • Sorted Key 以外で検索条件を追加する
    • テーブル定義時に作成する
  • GSI (Global Secondary Key)

    • Partition Key を別途定義できる
    • 既存テーブルに追加・削除可能
    • コストがかかる
KKKKKKKK

気づいたことメモ

  • GetItemでデータを取得しようとすると、テーブルに Partition Key と Sorted Key が定義されている場合、両方指定しないとエラーになる

    • queryを使えば片方のキーのみで取得できる