• ..

JavaScript

    CLI で DynamoDB を扱う

    ここでは Docker をlocalhost:8000で動かし、それを対象に見ていきます。DynamoDB を Docker で動かすには以下のコマンドを実行します。

    docker run \            
      --detach \            # バックグランドで、
      --name DynamoDB \     # 名前は'DynamoDB'で、
      --publish 8000:8000 \ # `localhost:8000`で、
      amazon/dynamodb-local # `amazon/dynamodb-local`を起動

    AWS CLI の DynamoDB を扱う為のコマンドはaws dynamodbです。これのサブコマンドに--endpoint-url http://localhost:8000オプションを付けることでローカルの DynamoDB に対して命令することができます。

    テーブル一覧

    list-tablesサブコマンドを使います。まだ何も無いので空です。

    aws dynamodb list-tables \
      --endpoint-url http://localhost:8000
    # {
    #   "TableNames": []
    # }

    テーブル作成

    create-tableサブコマンドを使います。まだ何も無いので空です。

    aws dynamodb create-table \
      # 'MusicCollection'というテーブル名で、 \
      --table-name MusicCollection \
      # 文字列の'Artist'と'SongTitle'値を持ち、 \
      --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
      # 'Artist'をパーティションキー、'SongTitle'をソートキーとします \
      --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
      # 1秒間に5回の読み込みと書き込みができます(デフォルト) \
      --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
      --endpoint-url http://localhost:8000
    # {
    #     "Table": {
    #         "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/MusicCollection", 
    #         "AttributeDefinitions": [
    #             {
    #                 "AttributeName": "Artist", 
    #                 "AttributeType": "S"
    #             }, 
    #             {
    #                 "AttributeName": "SongTitle", 
    #                 "AttributeType": "S"
    #             }
    #         ], 
    #         "ProvisionedThroughput": {
    #             "NumberOfDecreasesToday": 0, 
    #             "WriteCapacityUnits": 5, 
    #             "LastIncreaseDateTime": 0.0, 
    #             "ReadCapacityUnits": 5, 
    #             "LastDecreaseDateTime": 0.0
    #         }, 
    #         "TableSizeBytes": 0, 
    #         "TableName": "MusicCollection", 
    #         "BillingModeSummary": {
    #             "LastUpdateToPayPerRequestDateTime": 0.0, 
    #             "BillingMode": "PROVISIONED"
    #         }, 
    #         "TableStatus": "ACTIVE", 
    #         "KeySchema": [
    #             {
    #                 "KeyType": "HASH", 
    #                 "AttributeName": "Artist"
    #             }, 
    #             {
    #                 "KeyType": "RANGE", 
    #                 "AttributeName": "SongTitle"
    #             }
    #         ], 
    #         "ItemCount": 0, 
    #         "CreationDateTime": 1558979217.277
    #     }
    # }

    テーブル詳細の取得

    describe-tableサブコマンドを使います。

    aws dynamodb describe-table \
      # 'MusicCollection'というテーブル名を取得 \
      --table-name MusicCollection \
      --endpoint-url http://localhost:8000 
    # ...結果は`create-table`のものと同じ

    データの挿入

    put-itemサブコマンドを使います。

    aws dynamodb put-item \
      # 'MusicCollection'というテーブルに新しいデータを \
      --table-name MusicCollection \
      # パーティションは'藤山一郎'、ソートキーは'夢淡き東京'という内容で入れます \
      --item '{ 
        "Artist": {"S": "藤山一郎"},
        "SongTitle": {"S": "夢淡き東京"},
        "Youtube": {"M": { 
          "url": {"S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"}
        }}
      }' \
      --endpoint-url http://localhost:8000
    # ...出力はなし

    データ一覧取得

    scanサブコマンドを使います。

    aws dynamodb scan \
      # 'MusicCollection'テーブルのデータを取得 \
      --table-name MusicCollection \
      # (以下は無くてもいいけど、使ってみる) \
      # 'Artist'が'藤山一郎'のもので絞り込む
      --expression-attribute-names '{"#name": "Artist"}' \
      --expression-attribute-values '{":hujiyama": {"S": "藤山一郎"}}' \
      --filter-expression '#name = :hujiyama' \
      --endpoint-url http://localhost:8000    
    # {
    #     "Count": 1, 
    #     "Items": [
    #         {
    #             "Youtube": {
    #                 "M": {
    #                     "url": {
    #                         "S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"
    #                     }
    #                 }
    #             }, 
    #             "SongTitle": {
    #                 "S": "夢淡き東京"
    #             }, 
    #             "Artist": {
    #                 "S": "藤山一郎"
    #             }
    #         }
    #     ], 
    #     "ScannedCount": 1, 
    #     "ConsumedCapacity": null
    # }

    queryでも取得できます。

    aws dynamodb query \
      # 'MusicCollection'テーブルのデータを取得 \
      --table-name MusicCollection \
      --expression-attribute-names '{"#name": "Artist", "#title": "SongTitle"}' \
      --expression-attribute-values '{":hujiyama": {"S": "藤山一郎"}, ":yumeawaki_tokyo": {"S": "夢淡き東京"}}' \
      --key-condition-expression '#name=:hujiyama AND #title=:yumeawaki_tokyo' \
      --endpoint-url http://localhost:8000   
    # ...`scan`結果と同じ

    データの取得

    get-itemサブコマンドを使います。

    aws dynamodb get-item \
      # 'MusicCollection'テーブルから \
      --table-name MusicCollection \
      # '藤山一郎'なデータを取得します \
      --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
      --endpoint-url http://localhost:8000 
    # {
    #     "Item": {
    #         "Youtube": {
    #             "M": {
    #                 "url": {
    #                     "S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"
    #                 }
    #             }
    #         }, 
    #         "SongTitle": {
    #             "S": "夢淡き東京"
    #         }, 
    #         "Artist": {
    #             "S": "藤山一郎"
    #         }
    #     }
    # }

    データの更新

    update-itemサブコマンドを使います。

    aws dynamodb update-item \
      # 'MusicCollection'テーブルの対象の行に、 \
      --table-name MusicCollection \
      --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
      # 以下の値で追加・’更新する \
      --update-expression 'SET newAttributeName = :newAttributeValue' \
      --expression-attribute-values '{":newAttributeValue": {"S": "value"}}' \
      # そして、更新したデータだけ返す \
      --return-values UPDATED_NEW \
      --endpoint-url http://localhost:8000
    # {
    #   "Attributes": {
    #     "newAttribute": {
    #       "S": "value"
    #     }
    #   } 
    # }

    データの削除

    delete-itemサブコマンドを使います。

    aws dynamodb delete-item \
      # 'MusicCollection'テーブルから \
      --table-name MusicCollection \
      # '藤山一郎'パーティションから'夢淡き東京'という曲を削除します \
      --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
      --endpoint-url http://localhost:8000 
    # ...出力はなし

    バックアップ作成

    create-backupサブコマンドを使います。

    aws dynamodb create-backup \
      --table-name MusicCollection \
      --backup-name MusicCollectionBackup

    このようなコマンドを実行すると以下のようなログが出力されます。(nは数値です)
    CREATINGというステータスが表示されていますが、これがAVAILABLEになるとバックアップ完了です。

    {
        "BackupDetails": {
            "BackupCreationDateTime": nnnnnnnnn.nnn, 
            "BackupName": "MusicCollectionBackup", 
            "BackupStatus": "CREATING", 
            "BackupType": "USER", 
            "BackupSizeBytes": nnn, 
            "BackupArn": "arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn"
        }
    }

    バックアップ一覧

    list-backupsを実行するだけです。

    aws dynamodb list-backups
    # [
    #   {
    #     "BackupDetails": {
    #       "BackupCreationDateTime": nnnnnnnnn.nnn, 
    #       "BackupName": "MusicCollectionBackup", 
    #       "BackupStatus": "AVAILABLE", 
    #       "BackupType": "USER", 
    #       "BackupSizeBytes": nnn, 
    #       "BackupArn": "arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn"
    #     }
    #   }
    # ]

    バックアップの削除

    delete-backupサブコマンドを使います。--backup-arnが必須でこれはlist-backupsBackupArnから取得します。

    aws dynamodb delete-backup \
      --backup-arn 'arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn'

    バックアップの適用

    restore-table-from-backupサブコマンドを使います。

    aws dynamodb restore-table-from-backup \
      --target-table-name MusicCollection
      --backup-arn 'arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn'