Amazon Web Services ブログ
Amazon NeptuneとAWS Amplifyを利用したグラフアプリケーション開発
ソリューション概要
ソリューションのアーキテクチャ図は以下です。
本ソリューションはAmplifyを利用してアプリケーションをホスティングし、Amazon Neptuneへのアクセスは全てAWS AppSync経由でAWS Lambdaを呼び出して処理します。フロントエンドにはReact、バックエンドの Lambda は Node.js を利用しています。アプリケーションは、 Apache TinkerPop Gremlin を利用してNeptuneのグラフデータへアクセスしています。
本ソリューションを利用すると以下のデモ画面のUIが実装でき、操作することができます。
ナビゲーションペインには、以下の機能を実装しています:
- Dashboard – person name, product name, or affiliated academic societyを入力することで、入力情報に関連のある情報を取得できます。
- Amazon Neptune – AWSマネージメントコンソールのAmazon Neptuneへ画面遷移します。
- Amazon SageMaker – AWSマネージメントコンソールのAmazon SageMakerへ画面遷移します。
- Add Vertex/Edge – ノードとエッジをAmazon Neptuneに追加することができます。
- Visualizing Graph – Amazon Neptuneに登録したグラフデータをビジュアライズ化します。グラフデータのノードを選択すると、プロパティ情報を表示できます。
本ソリューションで利用するノードとエッジのグラフスキーマは下表の通りです。
Vertex | Description |
person |
Doctor or MR |
paper |
Paper authored by person |
product |
Medicine used by person |
conference |
Affiliated academic society |
institution |
Hospital, university, or company |
Edge | Source | Target |
knows |
person |
person |
affiliated_with |
person |
institution |
authored_by |
paper |
person |
belong_to |
person |
conference |
made_by |
product |
institution |
usage |
person |
product |
前提条件
本ソリューション利用には、以下が必要です。
- AWSアカウント – 作成されていない方は、こちらからアカウントを作成してください。
- AWS Region – 本ソリューションで
us-east-1
を利用します。 - バルクロード用のIAMロールとAmazon S3権限の設定 – Amazon Neptuneへのデータロードはバルクロード機能を利用します。AWS Identity and Access Management (IAM) ロールと Amazon Simple Storage Service (Amazon S3) VPC Endpointが必要です。 こちらのIAMロールとAmazon S3 VPC Endpoint を作成してください。詳細については、 Prerequisites: IAM Role and Amazon S3 Accessを参照してください。なお、作成したロールのAmazon Neptune への紐付けは 次のステップで行います。
AWS Cloud9環境の作成
まず、AWS Cloud9環境の作成から行います。
- AWS Cloud9コンソールにて, 以下のパラメータで環境を構築します:
- Instance type – m5.large
- Network (VPC) –
us-east-1
- Subnet –
us-east-1a
- 次に、以下のスクリプトを
resize.sh
として保存します。これは、AWS Cloud9 にアタッチされている Amazon Elastic Block Store (Amazon EBS) のVolumeサイズを変更するために利用します。実行するスクリプトの詳細は、Moving an environment and resizing or encrypting Amazon EBS volumesを参照してください。
- Volumeサイズを20GBとするため以下を実行してください。
Neptuneリソースの作成
AWS Command Line Interface (以下、AWS CLI)を利用してAmazon Neptuneを作成します。
- 以下のコマンドを実行し、Neptune DB clusterとinstanceを作成します。
- 前提条件で作成したIAMロールをAmazon Neptuneにアタッチしてください。
- セキュリティグループのインバウンドルールに以下のルールを追加し、Amazon Neptuneクラスターにアタッチしてください。これは、次のステップでAWS Cloud9からAmazon Neptuneにバルクロードのコマンドを実行するために必要です。
- Type – Custom TCP
- Port range – 8182
- Source – Custom, with the security group of the AWS Cloud9 instance
S3バケットの作成 とNeptuneへのバルクロード
このステップではS3バケットを作成して、グラフデータをアップロードします。
us-east-1
にS3バケットを作成して、以下のファイルをアップロードしてください。今回はGremlinを利用するため、Gremlinロードデータ形式にしています。今回利用するノードのサンプルデータ (vertex.csv)は次の通りですエッジのサンプルデータ (
edge.csv
)は以下です。- AWS Cloud9から以下のコマンドを実行して、Amazon Neptuneにノードデータをロードします。
- 以下のコマンドを実行し、バルクロードが成功したか(
LOAD_COMPLETED
)を確認します。 - 同様にして、
source
をedge.csv
が格納されているS3 URIに変更して、エッジデータをバルクロードします。
これでNeptuneへのグラフデータの登録は完了です。
Amplifyでのグラフアプリケーション構築
ここからは、AWS Amplifyを利用してNeptuneにアクセスするアプリケーションを実装します。AWS Cloud9でAmplifyの設定を行い、ユーザー認証、Neptuneを操作するバックエンドのLambda functionやGraphQL APIなどのコンポーネントを追加していきます。
Amplifyの設定
先ほどのステップで作成したAWS Cloud9環境のターミナルからAmplifyの設定を行います。
- WebブラウザにてCloud9環境を開き、次のコマンドを実行してください。
$ amplify configure
を実行すると、ユーザーに代わってAmplifyがアプリケーションをデプロイできるように、新しいIAMユーザーが作成されます。設定内容はdefault
というプロファイル名で保存します。設定の詳細は、Configure the Amplify CLIを参照してください。 - 次のコマンドでReact アプリケーションのテンプレートを作成します。create-react-appコマンドでReact アプリケーションのテンプレートを作成します。テンプレートが作成されると、
react-amplify-neptune-workshop
というディレクトリが作成されるので、当該ディレクトリに移動して Amplify の設定を行います。 - 同ディレクトリ (
react-amplify-neptune-workshop
)で$ amplify init
を実行し、先ほど作成した default プロファイルを使って Amplify アプリケーションをイニシャライズします。AmplifyがAWS CloudFormationを利用してアプリケーションのバックエンドを自動的に構築します。これは数分で完了します。
- AWS Cloud9 のターミナルをもう一つ開き、以下のコマンドを実行します。
- AWS Cloud9 のMenu barにある Preview をクリックし、Preview Running Application を選択します。React アプリケーションが Cloud9 の画面右半分に表示され、アプリケーションコードの変更がすぐにプレビューで確認できます。
Authentication
次に、以下のコマンドを実行してアプリケーションに認証の機能を追加します。コマンドを実行すると、AmplifyはAWS CloudFormationを用いて認証バックエンドの Amazon Cognitoユーザープールを作成します。次の例のように対話形式で質問に答えることで、ユーザ名とパスワードでログインできる設定を行います。
認証のフロントエンドを作成します。次のコマンドを実行して、フロントエンドのコードをダウンロードし、既存のコードと置き換えます。認証画面はCloud9でアプリケーションのプレビューで確認できます。
以下のコマンドでApp.js
ファイルを置き換えます。これで、認証のフロントエンドが作成できました。
この後のステップでcomponentsディレクトリを作成すると、コンパイルが成功します。
Functions
このステップでは、Neptuneを操作するAWS Lambdaを作成します。Lambda functionsを作成する前に、次のコマンドで Lambda layerを作成して、 Gremlin libraryをインポートします。詳細は、Create a Lambda Layerを参照してください。
- 以下のコマンドでLamda Layerを作成します。
getGraphData
のLambda functionを作成します。- Lambda functionを追加した後に、以下のコマンドを実行してLambda functionに関するCloudFormation templateを修正します。Amplifyはこのテンプレートを利用してLambda環境をデプロイします。テンプレートの設定を変更した場合は、コンソール画面から設定変更しないでください。ここでは、ご自身のNeptuneインスタンスのリーダーエンドポイント、セキュリティグループID、およびサブネットIDの値を指定する必要があります。
- 以下のコマンドで、Lambda functionの
index.js
を書き換えます。以下は
getGraphData
のコードです。AWS AppSyncからLambda functionは実行され、Gremlinを利用してNeptuneにアクセスしてノードやエッジといったグラフ情報を取得します。 getGraphData
のLambda functionの設定は完了しました。同様にステップ2から4の手順を実行して、以下のLambda functionを作成します(コード内のfunction名を書き換えてください)。getInfoNeptune
queryNeptune
registerNeptune
(ステップ3のsed
コマンドのyour-neptune-reader-endpointをyour-neptune-writer-endpointに書き換えてください。)
- Lambda functionsのセットアップを完了するために、以下のコマンドを実行して
components.zip
を AWS Cloud9にダウンロードします。
GraphQL API
ここまでのステップで、認証用のユーザープールとNeptuneにクエリするバックエンドのLambda functionsを作成してきました。このステップではAmplifyアプリケーションに GraphQL API を追加します。
- 以下のコマンドを実行して、GraphQL API テンプレートを作成します。
- テンプレートを作成後、次のコマンドでGraphQLスキーマを上書きしてコンパイルします。
Query
で、検索結果や検索ワードに関する情報、例えば所属、製品、学会などの情報を取得できます。Mutation
で、Neptuneにノードやエッジを登録します。 amplify push
で変更をプッシュします。
アプリケーションのデプロイ
次のコマンドを実行してアプリケーションをホスティングします。Hosting with Amplify Console
を指定して、Manual deployment
を行います。
最後にアプリケーションをデプロイします。
アプリケーションが公開したら、その操作性とレスポンスの速さを是非体感してください。
Clean up
今後の請求を避けるために、ブログで紹介したリソースを削除してください。
- 以下のコマンドを実行してAWS Amplifyで作成したリソースを削除します。
- 以下のコマンドを実行してAmazon Neptuneのクラスターとインスタンスを削除します。
- Amazon S3コンソールからノードとエッジのデータファイルを格納したバケットを選択します。
- Emptyを選択して、Deleteします。
- IAMのコンソールから、バルクロードで利用したロール(NeptuneLoadFromS3)を選択してDelete roleで削除します。
- VPCコンソールから、作成したVPC endpointエンドポイントを作成してDelete Endpointで削除します。
- AWS Cloud9コンソールから、作成したAWS Cloud9環境を選択して、Deleteで削除します。
Summary
このブログでは、AWS Amplify を利用してNeptuneを操作するアプリケーションを開発する方法を紹介しました。Neptuneデータベースを作成し、認証、バックエンドのLambda functions、GraphQL API・関数を追加しました。
NeptuneとAmplifyを利用してアプリケーションを開発するには、NeptuneとAmplifyのユーザーガイドを参照してください。
英訳版はAWS Database Blogのこちらに掲載しています。
著者について
石尾千晶(Chiaki Ishio) はプロセス製造・ヘルスケア・ライフサイエンスチームのソリューションアーキテクトです。カスタマーへのAWSでのシステム設計や構築支援に従事しています。 プライベートでは、ピアノ演奏を楽しんでいます。
小泉 秀徳(Hidenori Koizumi)は、パブリックセクターのプロトタイピングソリューションアーキテクトです。理学のバックグラウンド(生物学、化学など)を活かした研究領域でのソリューション作成を得意としています。最近では、AWS AmplifyやAWS CDKでのアプリケーション開発を行っています。趣味は旅行と写真撮影です。