AWS-CLIを使ってDynamoDBを操作してみる

2019-04-28Amazon,AWS

LambdaからDynamoDBを操作する必要があったのだけれども、
DynamoDBにあまり触れる機会もなく今まで来ました。

コマンドラインからテーブルの作成やデータ投入を行ってみることにしました。

操作するためのツールとして AWS CLI を使ってみます。

ちなみに、DynamoDBの構成要素や概念を整理した内容は以下のエントリにまとめました。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ aws --version
aws-cli/1.16.140 Python/3.7.3 Darwin/18.5.0 botocore/1.12.130

DynamoDBの概念・コンセプトを整理してみる

Amazon DynamoDBの構成要素・コンセプト

「Amazon DynamoDB」を構成する要素については、別のエントリで整理しておきました。

上記エントリでまとめましたが、抑えておく用語は以下の4つです。

  • テーブル
  • 項目
  • 属性
  • プライマリーキー

コンセプト

DynamoDBではデータを抽出する方法は大きく2つとなります。

  1. プライマリーキー で検索し項目を受け取る
  2. 全項目を受け取りプログラムで絞り込む

データ量が増えた場合は (2) の方法は現実的ではなくなるため、 (1) でデータを取得できるように設計する必要があります。

検証用のテーブル定義

上記の概念やコンセプトを理解した上で、今回検証用に作成したいテーブルの定義を整理しておきます。

検証用のtable名

ユーザ情報を管理する users というtableを作成します。

検証用の属性名

users テーブルは以下のような属性(RDSでいうところの列情報)を保持します。

NameTypeプライマリーキー?
emailStringY
first_nameString
last_nameString
ageNumber

「属性」には型を設定する必要があります。
連想配列や配列などを指定できますが、最もよく利用するのは「文字列」と「数値」となるでしょう。

また、属性からプライマリーキーとなるものも決めておきましょう。

※ちなみにプライマリーキーとしない属性については、項目ごとにあったりなかったりしても問題がありません。このあたりはRDBとの大きな違いです。

AWS-CLIを使ったDynamoDBの操作

いよいよDynamoDBを操作してみます。

aws-cli (AWSコマンドの利用可能な環境づくり)のインストール

AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット を参照。

上記記事では Mac、Linux、Windowsの環境の差異を無視できるよう、またPythonなしでも動作するように Docker を利用しました。

もちろん yumbrewAWS CLI をインストールしても問題ありません。

テーブルの作成

まずはテーブルを作成します。

テーブルを作成するには aws dynamodb create-table コマンドを利用します。

--key-schemaオプションに対して、プライマリーキーとなる属性として「email」を指定しています。
KeyTypeとしてHASHというものを指定していますが今回は説明を飛ばします。(一意キーでスバリ検索、という利用用途しか考えない場合はHASHで十分です。)

テーブル作成時にはプライマリーキーに関する属性の情報のみを指定します。
プライマリーキー以外の属性の型は指定する必要がありません。(先も述べたとおり、プライマリーキーさえあれば項目ごとに属性が異なっていても構わない、という点がRDBと大きな違いとなっています。)

AttributeType には 文字列の場合には S を、 数値の場合には N を指定します。

$ aws dynamodb create-table \
  --table-name 'users' \
  --key-schema '
    [
      {
        "AttributeName": "email",
        "KeyType": "HASH"
      }
    ]
  ' \
  --attribute-definitions '
    [
      {
        "AttributeName": "email",
        "AttributeType": "S"
      }
    ]
  ' \
  --provisioned-throughput '
    {
      "ReadCapacityUnits": 5,
      "WriteCapacityUnits": 5
    }
  '

データの挿入

aws dynamodb put-itemコマンドを利用します。
--itemオプションに対して以下のようにJSONフォーマットを渡します。

JSONフォーマットには各属性の値を型付きで指定します( 文字列の場合には S を、 数値の場合には N )。

$ aws dynamodb put-item \
  --table-name users \
  --item '
    {
      "email": {
        "S": "yamada@gmail.com"
      },
      "first_name": {
        "S": "太郎"
      },
      "last_name": {
        "S": "山田"
      },
      "age": {
        "N": "20"
      }
    }
  '

データのスキャン

aws dynamodb scanコマンドを実行すると登録済みデータをすべて取得できます。

$ aws dynamodb scan \
  --table-name users

{
    "Items": [
        {
            "last_name": {
                "S": "山田"
            },
            "email": {
                "S": "yamada@gmail.com"
            },
            "first_name": {
                "S": "太郎"
            },
            "age": {
                "N": "20"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

データの取得(プライマリーキー指定)

aws dynamodb get-itemコマンドでデータを1件取得できます。
--keyオプションにプライマリーキー値を指定します。

$ aws dynamodb get-item \
  --table-name users \
  --key '
    {
      "email": {
        "S": "yamada@gmail.com"
      }
    }
  '

{
    "Item": {
        "last_name": {
            "S": "山田"
        },
        "email": {
            "S": "yamada@gmail.com"
        },
        "first_name": {
            "S": "太郎"
        },
        "age": {
            "N": "20"
        }
    }
}

データの削除

データの削除を行うためにはプライマリーキーを指定する必要があります。
(すべて削除したい場合はscanしてすべてのプライマリーキーを取得してから1件1件削除する必要があります。)

aws dynamodb delete-itemコマンドを実行しましょう。

$ aws dynamodb delete-item \
  --table-name users \
  --key '
    {
      "email": {
        "S": "yamada@gmail.com"
      }
    }
  '

テーブルの削除

不要になったテーブルを削除するには aws dynamodb delete-table コマンドを実行します。

$ aws dynamodb delete-table \
  --table-name users

レコード数のカウント

aws dynamodb scan \
  --table-name users \
  --select "COUNT"

{
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

ひとこと

今回は AWS-CLI を使った操作にとどまりました。

DynamoDBの構成要素や概念を整理した内容は以下のエントリにまとめました。

2019-04-28Amazon,AWS