[AWS] dynamodb
Cloud AWS
Published : 2020-07-27   Lastmod : 2020-10-21

dynamodbとは

dynamodbとは、AWSの高速パフォーマンスを実現するNoSQLデータベースです。

NoSQLデータベースとはSQL(DBを操作するスクリプト)を書かなくてもDB操作が可能なデータベースです。dynamodbは「値」とそれを取得するための「キー」の2つのみを格納するシンプルな機能を持つ「Key-Value構造」です。値を取得するためには取得したい値に紐づくキーを投げれば値が取得できます。RDSとはまた違った特徴を持つデータベースサービスです。

dynamodbのメリット

dynamodbのメリットは高速処理です。1 日に 10 兆件以上のリクエストを処理することができ、毎秒 2,000 万件を超えるリクエストをサポートします。AWSにはRDSやAuroraなどのDB関連サービスがありますが、データ処理速度という意味ではトップでしょう。それは

dynamodbのKey-Value構造のなせる技です。普通RDBMSは、複数のテーブルを結合したり、条件を設定したりして、データベースから情報を取得します。dynamodbはこのような複雑な処理はできません。キーを投げてそれに紐づく値を取ってくるだけ。シンプルなデータ取得に特化しているからこそ、高速処理が可能となりました。

DynamoDB はサーバーレスなので、管理するサーバは当然ありません。インストール設定もバッチ適用も必要ないですし、本稼働後も運用・保守をする必要もありません。ですので不正アクセスなどのリスクを心配する必要もありません。これだけでDB運用にかかるコストが大幅に削減できます。

また、DynamoDB はテーブルを自動的にスケールアップやスケールダウンをしてくれます。自動で容量を調整してくれるので、アクセスが増えようが減ろうが、DBパフォーマンスは維持されます。

dynamodbの使い方

dynamodbはコンソール画面からdynamodbを選択して、作成を始めます。dynamodbはKey-Value構造なので、keyはプライマリーキーである必要があります。ですので、最初の操作はテーブル名の指定とプライマリーキーの指定です。この2つを指定したらテーブルが作成できます。

次はキーに紐づくカラムを追加します。カラム追加ができたらあとはデータを入れていくだけでdynamodbのテーブルができあがりです。データ取得の方法はkeyを投げて値を取得するGetItem(キーに紐づくデータは1つであり、キーはプライマリーキーなので取得できるデータは1以下となる)や全権取得するScanなどがあります。

cloudformationによるdynamodbの構築

AWSのインスタンスを作るには、上記の様にコンソール画面からブラウザ操作により作成する方法の他に、AWS CLIというコマンドラインからcloudformationというサービスを利用して、プログラム上から作成する事が可能です。その時、どのようなインスタンスを作るのか、どのようなインスタンスを作るのか、その設定ファイルを指定します。そのファイルはテンプレート(template)と呼ばれます。

そのテンプレート(設定ファイル)はyamlやjson形式でテキストベースで指定することが可能です。このように、インスタンスをテキストで管理することが出来る利点の一つが、インスタンスなどのインフラをgit管理できるという事です。

gitで管理できれば、万が一インフラが思うように構築できなかったときに、すぐに原因を突き止める事ができます。特にgitはソフトウェアのコード管理でもよく利用するので、それと同じようにインフラも管理できるというのは非常に開発・運用の効率が良いです。ソフトウェアというアプリケーションのバグと同じようにインフラのバグを見つけることが出来ます。

テンプレートファイル(template file)

cloudformationで作るdynamodbインスタンスのテンプレートの例を以下に示します。私が関与しているとあるサービスで実際に利用されているのテンプレートになります。セキュリティのため一時隠している部分があります。

このテンプレートファイルとは別にパラメタの値を設定するファイルを用意し、Parametersに設定した変数に値をセットすることが出来ます。

dynamodbを作成する際、UserDataの中にサーバーセットアップ時の最初に実行するシェルを記載することが出来ます。大体この部分で必要なセットアップ作業を行います。

AWSTemplateFormatVersion: "2010-09-09"
Description: dynamodb
Parameters:
  Service:
    Type: String
  Phase:
    Type: String
  Region:
    Type: String
  JobReadCapacityUnits:
    Type: Number
  JobWriteCapacityUnits:
    Type: Number 

Resources:
  JobTable:
    Type: "AWS::DynamoDB::Table"
    Properties:
      TableName: !Sub ${Project}-${Phase}-job
      AttributeDefinitions:
        -
          AttributeName: "office_id"
          AttributeType: "S"
        -
          AttributeName: "job_id"
          AttributeType: "S"
      KeySchema:
        -
          AttributeName: "office_id"
          KeyType: "HASH"
        -
          AttributeName: "job_id"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: !Sub ${JobReadCapacityUnits}
        WriteCapacityUnits: !Sub ${JobWriteCapacityUnits}
      SSESpecification:
        SSEEnabled: True
      TimeToLiveSpecification:
        AttributeName: ttl
        Enabled: True
      PointInTimeRecoverySpecification:
        PointInTimeRecoveryEnabled: true
      Tags:
      - Key: Name
        Value: !Sub ${Service}-${Phase}-job

stackの作成コマンド

cloudformationからdynamodbなどのインスタンスを利用するためにはAWS CLIから以下の様なコマンドをbashから実行します。これによってcloudformation上にstackが作成され、その下に各インスタンスが構築されます。

templateがテンプレートファイル、parameterがパラメタファイルになります。このテンプレートの例では、二つのファイルがbashを実行する同じディレクトリにある事を想定しています。

stack_name="stack_name"
template="template.yml"
parameters="parameters.json"
region="ap-northeast-1"

aws cloudformation create-stack --stack-name ${stack_name} \
  --disable-rollback \
  --parameters file://${parameter} \
  --capabilities CAPABILITY_IAM \
  --template-body file://${template} \
  --region ${region}

stackを更新する際、diffを見るコマンド

create-change-setにより、インスタンスを更新する際にその差分を確認することが出来ます。

stack_name="stack_name"
template="template.yml"
parameters="parameters.json"
region="ap-northeast-1"
change_set_name=${change_set_name}

aws cloudformation create-change-set --stack-name ${stack_name} \
  --change-set-name ${change_set_name} \
  --capabilities CAPABILITY_IAM \
  --parameters file://${parameter} \
  --template-body file://${template} \
  --region ${region}

stackの状態を確認するコマンド

現在のスタックの状態を確認することが出来ます。

stack_name="stack_name"
region="ap-northeast-1"

aws cloudformation describe-stacks stack-name ${stack_name} region ${region}

stackを削除するコマンド

スタックを削除し、それに伴いインスタンスを削除することが出来ます。

stack_name="stack_name"
region="ap-northeast-1"

aws cloudformation delete-stack --stack-name ${stack_name} --region ${region}

関連する記事