この記事は約4分で読めます。
こんにちは。
DevOpsが好きなアプリケーションサービス部の兼安です。
本記事は「Amazon Neptuneで始める初めてのグラフDB」というテーマの連載記事の4回目です。
- Amazon Neptuneで始める初めてのグラフDB① NeptuneクラスターとNotebookの作成
- Amazon Neptuneで始める初めてのグラフDB② Gremlinを用いたグラフデータの基本操作
- Amazon Neptuneで始める初めてのグラフDB③ Amazon NeptuneとTom Sawyer Graph Database Browserとの接続
- Amazon Neptuneで始める初めてのグラフDB④ G.V()を用いてローカル端末からAmazon Neptuneに接続する (https://blog.serverworks.co.jp/amazon-neptune-first-steps-with-graph-db-4)
- Amazon Neptuneで始める初めてのグラフDB⑤ Amazon OpenSearch Serviceと連携した全文検索
- 本連載記事の目標
- 第4回目の目標
- G.V()とは
- Amazon Neptuneにはパブリックアクセスの設定がない
- 踏み台サーバーの作成
- G.V()を用いて踏み台サーバー経由でAmazon Neptuneに接続する
- まとめ
本連載記事の目標
- Amazon Neptuneに対する基本的な操作・認証・運用方法を習得する
- Amazon Neptuneの全文検索を実装する
第4回目の目標
- G.V()を用いてローカル端末からAmazon Neptuneに接続する
今回は軽めの内容です。前回、Tom Sawyer Graph Database Browserを使ってAmazon Neptuneに接続しました。
その流れに続けて、今回はG.V()(ジードットブイ)を使ってローカル端末からAmazon Neptuneに接続してみます。
Amazon Neptuneは、RDSと異なりパブリックアクセスの設定がないため、ローカル端末から接続するには踏み台サーバーを経由する必要があります。
このため、この記事を執筆することにしました。よろしくお願いします。
G.V()とは
G.V()は、Neptuneに接続してクエリを実行するためのツールです。
G.V()は有料ツールですが、トライアルで使用することもできます。
Tom Sawyer Graph Database Browserも強力なツールですが、ローカルから直接接続したい方もいると思いますので、G.V()の接続方法を押さえておきましょう。
Amazon Neptuneにはパブリックアクセスの設定がない
2024年10月時点では、Amazon NeptuneはAmazon RDSで言うところのパブリックアクセスの設定がありません。
Amazon Neptuneをパブリックサブネットに配置したとしても、ローカル端末で起動するツールからAmazon Neptuneに接続することはできません。
したがって、ローカル端末から接続するためには、踏み台サーバーを経由する必要があります。
構成図は以下のようになります。

踏み台サーバーの作成
CloudFormationテンプレートを用意しました。
cloudformation/graphdb_1_vpc.yml
# ------------------------------------------------------------## Security Group# ------------------------------------------------------------#BastionSecurityGroup:Type: "AWS::EC2::SecurityGroup"Properties:GroupName: !Sub "${ServiceName}-${StageName}-neptune-bastion-sg"GroupDescription: "Enable access to Notebook"VpcId: !Ref VPCSecurityGroupIngress:- IpProtocol: tcpFromPort: 22ToPort: 22CidrIp: !Ref BastionCidrIpTags:- Key: "Name"Value: !Sub "${ServiceName}-${StageName}-neptune-bastion-sg"- Key: "ServiceName"Value: !Ref ServiceName- Key: "StageName"Value: !Ref StageName(途中省略)NeptuneSecurityGroup:Type: "AWS::EC2::SecurityGroup"Properties:GroupName: !Sub "${ServiceName}-${StageName}-neptune-cluster-sg"GroupDescription: "Enable access to Neptune"VpcId: !Ref VPCSecurityGroupIngress:- IpProtocol: tcpFromPort: 8182ToPort: 8182SourceSecurityGroupId: !Ref NotebookSecurityGroup- IpProtocol: tcpFromPort: 8182ToPort: 8182SourceSecurityGroupId: !Ref BastionSecurityGroup- IpProtocol: tcpFromPort: 8182ToPort: 8182SourceSecurityGroupId: !Ref TomSawyerSecurityGroupTags:- Key: "Name"Value: !Sub "${ServiceName}-${StageName}-neptune-cluster-sg"- Key: "ServiceName"Value: !Ref ServiceName- Key: "StageName"Value: !Ref StageName
CloudFormationテンプレートは、レイヤーごとに分けています。VPC、Neptune、Notebook、踏み台サーバーの4つのテンプレートです。
ポイントは踏み台サーバー用のセキュリティグループと、Amazon Neptune用のセキュリティグループを作成しているところです。
踏み台サーバー用のセキュリティグループは、SSHのポート22番のアクセスを許可します。
Amazon Neptune用のセキュリティグループは、Neptuneのデフォルトポート8182番のアクセスについて、踏み台サーバー用のセキュリティグループからのアクセスを許可します。
cloudformation/graphdb_4_bastion.yml
# ------------------------------------------------------------## 踏み台サーバー# ------------------------------------------------------------#BastionInstance:Type: AWS::EC2::InstanceProperties:InstanceType: !Ref BastionInstanceTypeSubnetId:Fn::ImportValue:Fn::Sub: "${ServiceName}-${StageName}-subnet-public-1"ImageId: !Ref BastionKeyEc2ImageIdSecurityGroupIds:- Fn::ImportValue:Fn::Sub: "${ServiceName}-${StageName}-neptune-bastion-sg"IamInstanceProfile: !Ref BastionInstanceProfileBlockDeviceMappings:- DeviceName: /dev/xvdaEbs:VolumeSize: !Ref VolumeSizeVolumeType: gp3EbsOptimized: falseSourceDestCheck: falseKeyName: !Ref BastionKeyPairNameTags:- Key: ServiceNameValue: !Ref ServiceName- Key: StageNameValue: !Ref StageName- Key: NameValue: !Sub ${ServiceName}-${StageName}-bastion-instance
踏み台サーバーは、パブリックサブネットに配置し、事前に作った踏み台サーバー用のセキュリティグループを適用します。
踏み台サーバーとして利用するため、特別な設定は必要ありません。
G.V()を用いて踏み台サーバー経由でAmazon Neptuneに接続する
SSH トンネル (ポートフォワーディング)の実行
踏み台サーバーが準備できたら、ローカル端末から以下のコマンドを実行します。
ssh -i /path/to/your-key.pem -L 8182:{Neptuneのエンドポイント}:8182 ec2-user@{踏み台サーバーのパブリックIP}
このコマンドは、SSH トンネルを使用して、Amazon Neptune データベースに接続するための設定です。
コマンドをローカルのターミナルなどで実行した後、ローカル端末からlocalhost:8182
で接続することで、Neptuneに接続可能になります。
このコマンドを実行したターミナルを閉じたり、コマンドを中断したりすると、SSH トンネル (ポートフォワーディング)が中断され、ローカル端末からNeptuneに接続ができなくなります。
SSH トンネル (ポートフォワーディング)のコマンドの解説
ssh
- SSH (Secure Shell) を使用してリモートサーバーに接続するためのコマンドです。
-i /path/to/your-key.pem
- SSH に使用する秘密鍵ファイル (.pem) のパスを指定します。このファイルは、Amazon EC2 インスタンスにアクセスする際に使用されるもので、アクセス権限を証明するためのものです。
-L 8182:{Neptuneのエンドポイント}:8182
- ローカルポートフォワーディングの設定です。SSH トンネルを介してローカルマシンとリモートサーバーの間で特定のポートを接続します。
- 8182: ローカルマシンのポート番号。Amazon Neptune に接続する際に、ローカルマシン上でこのポートをリッスンします。
- {Neptuneのエンドポイント}: Amazon Neptune のエンドポイント。このエンドポイントは、Neptune クラスターやインスタンスの接続先のホスト名または IP アドレスです。
- 8182: リモートサーバー上の Amazon Neptune がリッスンしているポート。このポートは Neptune の Gremlin インターフェースのデフォルトのポートです。
- ec2-user@{踏み台サーバーのパブリックIP}
- SSH を使用して接続するリモートサーバーのユーザー名とパブリックIPアドレス。
- ec2-user: Amazon EC2 のデフォルトのユーザー名 (この部分はインスタンスの AMI によって異なる場合もあります)。
- {踏み台サーバーのパブリックIP}: 踏み台サーバー (Bastion Host) のパブリックIPアドレス。踏み台サーバーは、プライベートサブネットにあるリソース (例えば Amazon Neptune) にアクセスするための中継サーバーです。
SSH トンネル (ポートフォワーディング)の動作の流れ
- SSH 接続: このコマンドにより、ローカルマシンから踏み台サーバーに SSH で接続します。
- ポートフォワーディング: -L オプションによって、ローカルマシンのポート 8182 にアクセスした場合、その通信が踏み台サーバーを通して、Neptune のエンドポイントのポート 8182 に転送されます。
- Neptune へのアクセス: その結果、ローカルマシン上で localhost:8182 に接続するだけで、実際には Neptune にアクセスすることが可能になります。
G.V()の起動と接続設定
G.V()を起動すると、以下の画面が表示されます。
New Database Connection
をクリックし、以下のように設定します。
- Graph Technology Type: Amazon Neptune
- Database Hostname: localhost
- Port: 8182


接続ができたら、New Query
でクエリを実行できます。

まとめ
今回はローカルからAmazon Neptuneに繋ぐ方法を紹介しました。
コーディングにおいて試行錯誤する場合は、こちらの方法がやりやすいかもしれませんね。