AWSのDynamoDBを業務で扱う機会が多いので、調べた事や、実際に触ってみた事を記事にまとめました。
DynamoDBとは
フルマネージド型で、サーバーレスの NoSQL データベースサービス
特徴
・データの格納と取得に特化(高度な最適化)されている
・「値」とそれを取得するための「キー」だけを格納するというシンプルな機能を持った「Key-Valueストア」
・半構造化データをドキュメントとして保存する「ドキュメントデータベース」でもある
・1桁ミリ秒単位のレイテンシーを要求するアプリケーションにも対応
・大量のデータを速く検索できる
プライマリキー
・パーティションキーのみ
・パーティションキーとソートキーの組み合わせ
でデータが一意になるようにする。
セカンダリーインデックス
DynamoDBの仕様上、パーティションキーおよびソートキーにしか検索条件をかけられず、属性を検索条件にすることはできないので、プライマリキー以外の属性で、データに効率的にアクセスできるようにインデックスを貼る。
1. ローカルセカンダリインデックス(LSI)
データはそのまま、パーティションキーはそのままで、ソートキーを別の属性に変更することができます。(1つのテーブルにつき、最大5個まで、テーブルの初回構築時にしか設定できない制約がある)
例)パーティションキーがE001で、属性2がMiddleのデータを取得しようとしても仕様上、属性を検索条件にすることはできません。
そこで、属性2をローカルセカンダリインデックスにします。
これで、「パーティションキーがE001で、ローカルセカンダリインデックスがMiddle」であるデータを検索することができ、「山田桜子」のデータを取得できます。
2. グローバルセカンダリインデックス(GSI)
データはそのままで、パーティションキーを別の属性に変更することができる。(パーティションキーとソートキー両方も可能)
テーブル構築後に後から20個まで追加で設定できる
*データベースにおけるインデックスとは
インデックスを貼ることによって検索効率を高める手段。
DynamoDBへの検索可能な仕様
・パーティションキーおよびソートキーにしか検索条件をかけられない。属性に対して検索をかけることはできない。
・パーティションキーは必ず検索条件に指定する必要がある。ソートキーのみを検索条件にすることはできない。
・パーティションキーには、完全一致条件のみ指定できます。
例えば「xxから始まる」というような部分一致条件は指定できない。
・一方、ソートキーには「xxから始まる」というような部分一致条件が指定できます。
実際に触ってみた
DynamoDBを単体で触るより、Lambda、API Gatewayと組み合わせて簡単なサーバーレスアプリケーションを作ってみました。
構成:
クライアントからHTTP API を呼び出すと、API Gateway はリクエストを Lambda 関数にルーティング。
Lambda 関数は DynamoDB と対話し、API ゲートウェイにレスポンスを返却。
それから API Gateway はクライアントにレスポンスを返す。
1. Dynamo DBのセットアップ
DynamoDBを開き、右にあるオレンジ色の「テーブルの作成」ボタンをクリック
コンソール上でレコードの追加、編集、複製、削除も可能です。
2. IAMロールのセットアップ
IAMロールとは、AWSのリソースに対して権限を割り当てるための仕組みです。
LambdaがDynamoDBにアクセスできるようにロールを設定します。
IAMを開き、右にあるオレンジ色の「ロールを作成」ボタンをクリック
Lambdaに対するロールを作成するため、サービスまたはユースケースからLambdaを選択し「次へ」をクリックします。
Lambdaロールに付与する権限を選択します。DynamoDBへのアクセス権限をもつ AmazonDynamoDBFullAccess
をポリシーとしてアタッチします。
「次へ」をクリックし、進んだページで「ロール名」を入力し、「ロールを作成」をクリックすれば完了です。
3. Lambdaのセットアップ
Lambdaとは:
サーバーのプロビジョニングや管理なしでコードを実行できるサーバレスのFunction as a Service。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。つまりは、プログラムの実行環境を提供してくれるので、コードだけを用意すればいいという話です。
DynamoDBはLambdaとの相性の良いデータストアであり、サーバーレスでアプリケーションを開発する際にLambdaと合わせて利用されることが多いらしいです。
今回作る Lambda 関数は、DynamoDBと連携し、項目を作成、読み取り、更新、および削除します。
Lambdaを開き、右にあるオレンジ色の「関数の作成」ボタンをクリック
関数名を入力し、実行ロールの変更で、既存のロールを使用するを選択すると、セレクトBOXが出てきて、そこから2で作成したIAMロールを選択します。これにより、このLambda関数はDynamoDBへアクセスする権限が付与されます。
ランタイムは、Java, Node.js, Python, RUbyが選べるのでお好きな環境を選択してください。
次のページへ進むと、コードを編集するUIが出てきます。
Lambda関数にコードを登録する方法は以下の2つあります
・コンソールでコードを直接編集
・ローカルで開発したコードをアップロード(外部ライブラリなどを含む場合)
今回はシンプルな実装なので、コンソールで編集します。使用するソースコードはこちらのサンプルから拝借させて頂きました。
「Deploy」ボタンがアクティブになるので、クリックして反映させます。
4. API Gatewayのセットアップ
API Gatewayとは:
あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するためのサービス
今回のケースでは、Lambdaで作った関数をAPI GatewayでAPI化するイメージです。
API Gatewayを開き、右にあるオレンジ色の「APIを作成」をクリック
今回作るのはREST APIなので、REST APIの「構築」をクリック
API名を入力し、説明はブランクでもOK、エンドポイントタイプはリージョンのままで「APIを作成」をクリック
リソースページに遷移するので、ここでリソースとメソッドの設定をしていきます。
まずはGETのリソースを設定します。「リソースの作成」をクリックし、リソース名を入力。
作ったリソースに対して、メソッドを作成します。「メソッドを作成」をクリック。
統合タイプは当然Lambda関数で、Lambda関数で、3で作った関数名が表示されるので、選択します。
POST, PUT, DELETEも同様の手順で設定していき、すべて完了したら、「APIをデプロイ」をクリック。
ステージを選択するモーダルが開くので、新しいステージで、任意のステージ名を入力して、「デプロイ」をクリック
5. APIを叩いてみる
私はAPIテストツールのPostmanを使って、4で発行されたエンドポイントに対して、まずはPOSTを実行してDynamoDBのレコードに反映されるか確認しました。その後、GET、DELETEなど各種メソッドも確認しました。
*AWSコンソール上で、API Gateway、Lambdaもテストを実行できますが、今回は省略しました。
参考サイト
まとめ
AWSの基本、主要サービスの概要など、頭ではわかっていましたが、実際に触って、ロールのアタッチや、複数のサービスを連携させるなど、手を動かして作ってみると理解がグッと深まりました。
次はクライアントサイドと接続させ、インデックスを貼るなどしてもっと使い込んでみたいと思います。