ちょっと話題の記事

初めてのサーバーレスアプリケーション開発 ~DynamoDBにテーブルを作成する~

2018.08.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーバレスで開発がしたい!でもそもそもサーバレスで使われるサービス全然知らないな。。

そんな方もまだまだ多いのではないでしょうか。そこで今回はサーバレス開発でよく利用されるサービス、API GatewayLambdaDynamoDBをマネジメントコンソールから作成し、それぞれを簡単に連携させてみようと思います。

本記事も含め3回に分けて実施します。

↓追加しました。

対象読者

  • サーバーレスアプリケーション開発未経験の方
  • サーバーレスに縁のないインフラエンジニアの方

本記事を実践して、API Gateway、Lambda、DynamoDBと仲良くなりましょう!!

それでは本題に入っていきます。

サーバーレスアプリケーション超入門

今回構築するアプリケーションの全体構成はこちら。

AWSのサーバーレスアプリケーションではよくある構成です。最近弊社内外?で盛り上がっているAmazon Goの再現システムでもこのような構成としている箇所が多くあります。

このシリーズでは上記のようなサーバーレスの構成で、「クライアントからリクエストを受けて、DynamoDBの情報を返却する」簡単なアプリケーションを作成しようと思います。今回はデータストアであるDynamoDBから作成していきます。

DynamoDB

DynamoDBとは何なのか。公式ドキュメントより概要を抜粋します。

Amazon DynamoDB は、どのような規模でも信頼性が高いパフォーマンスを維持できる、非リレーショナルデータベースです。完全マネージド型、マルチリージョン、マルチマスターのデータベースで、レイテンシーを 10 ミリ秒未満に維持でき、組み込みのセキュリティ、バックアップと復元、インメモリキャッシュを利用できます。

また、このエントリにDynamoDBの特徴が綺麗にまとまっていたので一部抜粋します。

DynamoDBの特徴

  • フルマネージドサービス
  • データの格納と取得に特化(高度な最適化)されている
  • 「値」とそれを取得するための「キー」だけを格納するというシンプルな機能を持った「Key-Valueストア」
  • 半構造化データをドキュメントとして保存する「ドキュメントデータベース」でもある
  • 1桁ミリ秒単位のレイテンシーを要求するアプリケーションにも対応
  • 期限切れになった項目を自動的にテーブルから削除

もう少し詳しく知りたい方は、Black Beltの資料もご覧ください。 ※資料は最新のものではないため適宜公式ドキュメントを参照してください。

DynamoDBはLambdaとの相性の良いデータストアであり、(LambdaとRDBMSの相性が悪いという側面も)サーバーレスでアプリケーションを開発する際にLambdaと合わせて利用されることが多いサービスになります。

今回作成するアプリケーションでは、personを管理するデータストアとして利用します。Keyperson_idValuenameとします。

DynamoDBを作ってみよう

DynamoDB は 2 種類の異なるプライマリキーをサポートしています。

  • パーティションキー
  • パーティションキーとソートキー

今回作成するアプリケーションでは、パーティションキーという1つのプライマリキーをもつシンプルなテーブルを使います。パーティションキーとソートキーの2つのキーをもつ複合キーテーブルについては、アプリケーションとしては利用しませんが、作り方/使い方については紹介します。

では、早速作ってみましょう。

パーティションキーテーブル作成

1.1.テーブル作成

AWSマネジメントコンソールよりDynamoDBを選択し、「テーブルの作成」をクリックします。

テーブル名にdemo-person、プライマリーキーperson_idを入力し「作成」ボタンをクリックします。

しばらくたつとdemo-personテーブルが作成されます。初期状態ではテーブルは空です。

1.2.項目追加

次に作成したテーブルに項目を追加していきます。「項目の作成」をクリックします。

すると、項目作成用のフォームが表示されます。初期状態ではperson_idしか入力項目がありません。

今回demo-personテーブルの項目には、person_idとそれに紐付くnameを保持させたいので、nameをAppendします。

person_idnameをそれぞれ入力し、「保存」をクリックします。

するとテーブルに入力した内容が登録されていることが確認できます。

同じ要領で2つの項目も追加します。

1.3.項目取得

テーブルから項目を取得する方法も確認しておきましょう。パーティションキーテーブルにおいて項目を取得する方法は以下の2つになります。※インデックスを利用した項目の取得については本記事では一旦対象外とします。

  • Scan:全件取得
  • GetItem:partition-keyに対するequal-to条件値を1つ指定して、0〜1件取得

2つの方法を確認してきましょう。

Scan

これはテーブルに登録されている全件を取得する操作になります。今回はAWSマネージメントコンソールから実施しますが、プログラミングからでも同じです。

AWSマネージメントコンソールから確認する場合は、スキャンを選択し「開始」をクリックします。すると現在demo-personテーブルに登録されている全ての項目が表示されます。

GetItem

これはテーブルのパーティションキーを指定して、それに該当する項目を取得する操作になります。demo-personテーブルでいうとperson_idを指定して項目を取得するイメージです。実際に操作してみましょう。

クエリを選択しperson_id001を入力後、「開始」をクリックします。するとdemo-personテーブルに登録されている項目の内、person_id001の項目が表示されます。

また、当然ではありますが、存在しないperson_idを指定した場合は、項目は何も取得できません。

複合キーテーブル作成

今回のアプリケーションでは利用しませんが、複合キーテーブルの使い方も確認しておきしましょう。

2.1.複合キーテーブル作成

「テーブルの作成」をクリックし、「テーブル名」、「プライマリーキー」、「ソートキー」に、それぞれdemo-weatherplacetimestampと入力し、「作成」ボタンをクリックします。

先ほどと同じように初期状態ではテーブルは空の状態です。

2.2.項目追加

先ほどと同じ要領で項目を追加し以下の状態を作り上げます。

place timestamp weather
tokyo 1534687859 cloudy
tokyo 1534687860 cloudy
tokyo 1534687861 rainy
osaka 1534687859 sunny
osaka 1534687860 sunny
osaka 1534687861 sunny

2.3.項目取得

複合キーテーブルにおいてデータを取得する方法は以下の3つになります。

  • Scan:全件取得
  • GetItem:partition-keyとsort-key両者に対するequal-to条件値を指定して、0〜1件取得
  • Query:partition-keyに対するequal-to条件値を1つ、sort-keyに対する範囲条件(optional)を指定して、0〜複数件取得

Scanについてはパーティションキーテーブルの場合と変わらないので、GetItem、Queryの2つの方法を確認してきましょう。

GetItem

これはテーブルのパーティションキー、ソートキーを指定して、それに該当する項目を取得する操作になります。demo-weatherテーブルでいうとplacetimestampを指定して項目を取得するイメージです。実際に操作してみましょう。

クエリを選択しplacetokyoを入力、timestamp 1534687859 を入力後、「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。

Query

次にQueryを利用した項目取得について確認して行きましょう。Queryではパーティションキーを1つ入力し、範囲条件を指定して項目を取得する操作になります。demo-weatherテーブルでいうとplaceの入力は必須、timestampの範囲指定はオプションということになります。

まずは、パーティションキーだけを入力してみましょう。placetokyoを入力し「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。

次にパーティションキーとソートキーの範囲を指定し項目を取得します。placetokyoを入力し、timestampBetweenとし、15346878591534687860を入力後「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。

ちなみに、パーティションキーを指定せずに項目を取得することはできません。なぜ取得できないのか。。この辺りを理解するには、少し難しい部分もありますが このエントリをみていただければわかるかと思います。

さいごに

簡単なアプリケーションを構築するためDynamoDBを作成しました。初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~では今回作成したDynamoDBから値を取得するためのLambdaを作成して行きたいと思います。