初めてのサーバーレスアプリケーション開発 ~DynamoDBにテーブルを作成する~
サーバレスで開発がしたい!でもそもそもサーバレスで使われるサービス全然知らないな。。
そんな方もまだまだ多いのではないでしょうか。そこで今回はサーバレス開発でよく利用されるサービス、API Gateway、Lambda、DynamoDBをマネジメントコンソールから作成し、それぞれを簡単に連携させてみようと思います。
本記事も含め3回に分けて実施します。
- 初めてのサーバーレスアプリケーション開発 ~DynamoDBにテーブルを作成する~
- 初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~
- 初めてのサーバーレスアプリケーション開発 ~API GatewayからLambdaを呼び出す~
対象読者
- サーバーレスアプリケーション開発未経験の方
- サーバーレスに縁のないインフラエンジニアの方
本記事を実践して、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
を管理するデータストアとして利用します。Key
はperson_id
、Value
はname
とします。
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_id
、name
をそれぞれ入力し、「保存」をクリックします。
するとテーブルに入力した内容が登録されていることが確認できます。
同じ要領で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_id
に001
を入力後、「開始」をクリックします。するとdemo-person
テーブルに登録されている項目の内、person_id
が001
の項目が表示されます。
また、当然ではありますが、存在しないperson_id
を指定した場合は、項目は何も取得できません。
複合キーテーブル作成
今回のアプリケーションでは利用しませんが、複合キーテーブルの使い方も確認しておきしましょう。
2.1.複合キーテーブル作成
「テーブルの作成」をクリックし、「テーブル名」、「プライマリーキー」、「ソートキー」に、それぞれdemo-weather
、place
、timestamp
と入力し、「作成」ボタンをクリックします。
先ほどと同じように初期状態ではテーブルは空の状態です。
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
テーブルでいうとplace
、timestamp
を指定して項目を取得するイメージです。実際に操作してみましょう。
クエリを選択しplace
にtokyo
を入力、timestamp
に 1534687859
を入力後、「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。
Query
次にQueryを利用した項目取得について確認して行きましょう。Queryではパーティションキーを1つ入力し、範囲条件を指定して項目を取得する操作になります。demo-weather
テーブルでいうとplace
の入力は必須、timestamp
の範囲指定はオプションということになります。
まずは、パーティションキーだけを入力してみましょう。place
にtokyo
を入力し「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。
次にパーティションキーとソートキーの範囲を指定し項目を取得します。place
にtokyo
を入力し、timestamp
をBetween
とし、1534687859
、1534687860
を入力後「開始」をクリックします。するとこの検索条件にマッチする項目が表示されます。
ちなみに、パーティションキーを指定せずに項目を取得することはできません。なぜ取得できないのか。。この辺りを理解するには、少し難しい部分もありますが このエントリをみていただければわかるかと思います。
さいごに
簡単なアプリケーションを構築するためDynamoDBを作成しました。初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~では今回作成したDynamoDBから値を取得するためのLambdaを作成して行きたいと思います。