LoginSignup
0
0

AWS DynamoDB入門

Posted at

AWSのDynamoDBを業務で扱う機会が多いので、調べた事や、実際に触ってみた事を記事にまとめました。

DynamoDBとは

フルマネージド型で、サーバーレスの NoSQL データベースサービス

特徴
・データの格納と取得に特化(高度な最適化)されている
・「値」とそれを取得するための「キー」だけを格納するというシンプルな機能を持った「Key-Valueストア」
・半構造化データをドキュメントとして保存する「ドキュメントデータベース」でもある
・1桁ミリ秒単位のレイテンシーを要求するアプリケーションにも対応
・大量のデータを速く検索できる

プライマリキー
・パーティションキーのみ
・パーティションキーとソートキーの組み合わせ
でデータが一意になるようにする。

セカンダリーインデックス
DynamoDBの仕様上、パーティションキーおよびソートキーにしか検索条件をかけられず、属性を検索条件にすることはできないので、プライマリキー以外の属性で、データに効率的にアクセスできるようにインデックスを貼る。

1. ローカルセカンダリインデックス(LSI)
データはそのまま、パーティションキーはそのままで、ソートキーを別の属性に変更することができます。(1つのテーブルにつき、最大5個まで、テーブルの初回構築時にしか設定できない制約がある)

例)パーティションキーがE001で、属性2がMiddleのデータを取得しようとしても仕様上、属性を検索条件にすることはできません。

スクリーンショット 2024-05-05 14.59.53.png

そこで、属性2をローカルセカンダリインデックスにします。

スクリーンショット 2024-05-05 15.00.07.png
これで、「パーティションキーがE001で、ローカルセカンダリインデックスがMiddle」であるデータを検索することができ、「山田桜子」のデータを取得できます。

2. グローバルセカンダリインデックス(GSI)
データはそのままで、パーティションキーを別の属性に変更することができる。(パーティションキーとソートキー両方も可能)
テーブル構築後に後から20個まで追加で設定できる

*データベースにおけるインデックスとは
インデックスを貼ることによって検索効率を高める手段。

DynamoDBへの検索可能な仕様
・パーティションキーおよびソートキーにしか検索条件をかけられない。属性に対して検索をかけることはできない。
・パーティションキーは必ず検索条件に指定する必要がある。ソートキーのみを検索条件にすることはできない。
・パーティションキーには、完全一致条件のみ指定できます。
例えば「xxから始まる」というような部分一致条件は指定できない。
・一方、ソートキーには「xxから始まる」というような部分一致条件が指定できます。

実際に触ってみた

DynamoDBを単体で触るより、Lambda、API Gatewayと組み合わせて簡単なサーバーレスアプリケーションを作ってみました。

構成:
クライアントからHTTP API を呼び出すと、API Gateway はリクエストを Lambda 関数にルーティング。
Lambda 関数は DynamoDB と対話し、API ゲートウェイにレスポンスを返却。
それから API Gateway はクライアントにレスポンスを返す。

スクリーンショット 2024-05-05 10.20.15.png

1. Dynamo DBのセットアップ
DynamoDBを開き、右にあるオレンジ色の「テーブルの作成」ボタンをクリック
スクリーンショット 2024-05-06 12.03.08.png

テーブル名、パーティションキー、ソートキーを設定
スクリーンショット 2024-05-06 12.06.22.png

コンソール上でレコードの追加、編集、複製、削除も可能です。

2. IAMロールのセットアップ
IAMロールとは、AWSのリソースに対して権限を割り当てるための仕組みです。
LambdaがDynamoDBにアクセスできるようにロールを設定します。

IAMを開き、右にあるオレンジ色の「ロールを作成」ボタンをクリック
スクリーンショット 2024-05-06 12.10.16.png

Lambdaに対するロールを作成するため、サービスまたはユースケースからLambdaを選択し「次へ」をクリックします。
スクリーンショット 2024-05-06 12.12.25.png

Lambdaロールに付与する権限を選択します。DynamoDBへのアクセス権限をもつ AmazonDynamoDBFullAccess をポリシーとしてアタッチします。
スクリーンショット 2024-05-06 12.15.19.png

「次へ」をクリックし、進んだページで「ロール名」を入力し、「ロールを作成」をクリックすれば完了です。

3. Lambdaのセットアップ
Lambdaとは:
サーバーのプロビジョニングや管理なしでコードを実行できるサーバレスのFunction as a Service。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。つまりは、プログラムの実行環境を提供してくれるので、コードだけを用意すればいいという話です。

DynamoDBはLambdaとの相性の良いデータストアであり、サーバーレスでアプリケーションを開発する際にLambdaと合わせて利用されることが多いらしいです。

今回作る Lambda 関数は、DynamoDBと連携し、項目を作成、読み取り、更新、および削除します。

Lambdaを開き、右にあるオレンジ色の「関数の作成」ボタンをクリック
スクリーンショット 2024-05-06 13.12.27.png

関数名を入力し、実行ロールの変更で、既存のロールを使用するを選択すると、セレクトBOXが出てきて、そこから2で作成したIAMロールを選択します。これにより、このLambda関数はDynamoDBへアクセスする権限が付与されます。

ランタイムは、Java, Node.js, Python, RUbyが選べるのでお好きな環境を選択してください。
スクリーンショット 2024-05-06 13.14.26.png

次のページへ進むと、コードを編集するUIが出てきます。

Lambda関数にコードを登録する方法は以下の2つあります
・コンソールでコードを直接編集
・ローカルで開発したコードをアップロード(外部ライブラリなどを含む場合)

今回はシンプルな実装なので、コンソールで編集します。使用するソースコードはこちらのサンプルから拝借させて頂きました。

スクリーンショット 2024-05-06 13.15.19.png

「Deploy」ボタンがアクティブになるので、クリックして反映させます。

4. API Gatewayのセットアップ
API Gatewayとは:
あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するためのサービス

今回のケースでは、Lambdaで作った関数をAPI GatewayでAPI化するイメージです。

API Gatewayを開き、右にあるオレンジ色の「APIを作成」をクリック
スクリーンショット 2024-05-06 14.21.12.png

今回作るのはREST APIなので、REST APIの「構築」をクリック
スクリーンショット 2024-05-06 14.21.45.png

API名を入力し、説明はブランクでもOK、エンドポイントタイプはリージョンのままで「APIを作成」をクリック
スクリーンショット 2024-05-06 14.23.43.png

リソースページに遷移するので、ここでリソースとメソッドの設定をしていきます。
スクリーンショット 2024-05-06 14.26.32.png

まずはGETのリソースを設定します。「リソースの作成」をクリックし、リソース名を入力。
スクリーンショット 2024-05-06 15.27.02.png

作ったリソースに対して、メソッドを作成します。「メソッドを作成」をクリック。
統合タイプは当然Lambda関数で、Lambda関数で、3で作った関数名が表示されるので、選択します。
スクリーンショット 2024-05-06 15.33.28.png

POST, PUT, DELETEも同様の手順で設定していき、すべて完了したら、「APIをデプロイ」をクリック。
ステージを選択するモーダルが開くので、新しいステージで、任意のステージ名を入力して、「デプロイ」をクリック
スクリーンショット 2024-05-06 15.35.30.png

デプロイするとエンドポイントのURLが発行されます。
スクリーンショット 2024-05-06 15.35.49.png

5. APIを叩いてみる
私はAPIテストツールのPostmanを使って、4で発行されたエンドポイントに対して、まずはPOSTを実行してDynamoDBのレコードに反映されるか確認しました。その後、GET、DELETEなど各種メソッドも確認しました。

*AWSコンソール上で、API Gateway、Lambdaもテストを実行できますが、今回は省略しました。

参考サイト

AWS公式

まとめ

AWSの基本、主要サービスの概要など、頭ではわかっていましたが、実際に触って、ロールのアタッチや、複数のサービスを連携させるなど、手を動かして作ってみると理解がグッと深まりました。

次はクライアントサイドと接続させ、インデックスを貼るなどしてもっと使い込んでみたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0