AWS NeptuneにLambdaからアクセスしてみた

はじめに

AWS Neptuneを使う機会があり、Neptune作成、LambdaからNeptuneへのアクセスをまとめてみました。

目次

AWS Neptuneとは

AWS Neptuneは、フルマネージドのグラフ構造を備えたデータベースサービスです。
基本要素は以下になります。

  • ノード:頂点(Node, Vertex)
  • エッジ:辺(Edge)ノードとノードの関係を表す
  • プロパティ:ノードとエッジの属性(Key/Value形式で保持)

ちなみにグラフは、ソーシャルネットワーク、路線図、レコメンデーション・・・等、身近なところで使用されています。

サポートされているグラフモデルとクエリ言語

Gremlin、openCypher、SPARQL の3つの言語でクエリが可能です。今回は、Gremlinを使用しました。

Neptuneを準備

Neptuneを作成する前に、あらかじめサブネットを持つVPCを作成しておきます。
マネジメントコンソールのNeptune -> データベース -> データベースを作成を選択して作成します。

画面に沿って必要な項目を設定していきます。

無料利用枠も用意されているので、今回は無料枠を選択。

予め用意したVPCとサブネットを設定します。

Gremrinクエリをするために、Jupyterノートブックも一緒に作成しました。

データベースの作成ボタンをクリックするとNeptuneが作成されます。

今回は、手動でポチポチしながら作成しましたが、CloudFormation テンプレートで環境を作成するNeptuneのハンズオンもあるので、検証でやってみるのもいいですね!

グラフデータベースってどんなもの?Amazon Neptune を使って グラフデータベースのクエリを体験しよう(準備編)

LambdaからNeptuneへアクセス

今回作成した構成は以下になります。

Lambdaでは下記をおこないます。

  1. Neptuneインスタンスに接続
  2. Gremrinクエリ生成
  3. 生成したGremrinクエリを実行
  4. クエリの実行結果をレスポンスとしてユーザーに返却

 

1.Neptuneインスタンスに接続

Neptuneへの接続に関するロジック。
こちらを参考にして実装。
AWS Lambda Amazon Neptune 関数の例
署名バージョン 4 署名を使用して Neptune に接続

Neptuneが IAMデータベース認証:ありの場合、バージョン 4 署名を使用して Neptune に接続を行います。
環境変数からAWSの認証情報を取得し、NeptuneデータベースへのリクエストにSigV4認証を追加。

※参考にしたコードでは、データベースURLとリクエストヘッダーのアイテムをList型で返していたけど、Dict型で返さないとエラーとなりました。

 

接続情報(エンドポイントとポート番号)を取得し、リモート接続を作成。

 

Neptune コネクション作成。

 

Neptuneインスタンスへの接続を管理する部分はデコレータで準備し、Neptuneへの接続とトランザクションを実装しました。
この接続処理を呼び出す関数内で例外が発生した場合、ロールバックされるようにしています。

Neptune接続ロジックは、Layerにして共通化しました。

2.Gremrinクエリ生成

次はノード作成のAPIが呼び出された時のロジック(Gremrinクエリ生成と実行)です。

 

リクエストボディは、下記のように、ノードのラベル名とノードのプロパティをリスト形式で持つようにしました。

 

3.生成したGremrinクエリを実行

ここで発行されるGremrinクエリは、下記の様に作成され、result = query.next() でクエリが発行されます。

 

クエリの実行結果

ノード作成のAPIの実行結果です。
v[xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx]の値は、Neptuneで自動作成されたidが返却されます。

まとめ

AWS NeptuneとLambdaを組み合わせてグラフデータベースを操作して分かったこと

  • LambdaはNeptuneと同じVPC内に作成が必要
  • IAM DB認証ありの場合、署名バージョン 4 を使用し一時認証情報を取得して接続
  • Gremrinクエリの実行は、 .next() や .iterate() などの終了ステップで実行される

 

今回初めてグラフデータベースというものを調査しながら触ってみて、リレーショナルデータベースで複雑なクエリで実現していたデータ間の関係性を取得するようなケースには適していたりと、グラフデータベースとリレーショナルデータベースのそれぞれの良いところを組み合わせて、両方を利用するのがいいと思いました。

投稿者プロフィール

YoshiSaaaan
2023/1にスカイアーチネットワークスにJoin
AWSを日々勉強中