Amazon Neptuneで始める初めてのグラフDB④ G.V()を用いてローカル端末からAmazon Neptuneに接続する

記事タイトルとURLをコピーする

こんにちは。
DevOpsが好きなアプリケーションサービス部の兼安です。

本記事は「Amazon Neptuneで始める初めてのグラフDB」というテーマの連載記事の4回目です。

本連載記事の目標

  • 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()とは

docs.aws.amazon.com

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テンプレートを用意しました。

github.com

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 VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref BastionCidrIp
      Tags:
        - 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 VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 8182
          ToPort: 8182
          SourceSecurityGroupId: !Ref NotebookSecurityGroup
        - IpProtocol: tcp
          FromPort: 8182
          ToPort: 8182
          SourceSecurityGroupId: !Ref BastionSecurityGroup
        - IpProtocol: tcp
          FromPort: 8182
          ToPort: 8182
          SourceSecurityGroupId: !Ref TomSawyerSecurityGroup
      Tags:
        - 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::Instance
    Properties:
      InstanceType: !Ref BastionInstanceType
      SubnetId: 
        Fn::ImportValue:
          Fn::Sub: "${ServiceName}-${StageName}-subnet-public-1"
      ImageId: !Ref BastionKeyEc2ImageId
      SecurityGroupIds:
        - Fn::ImportValue:
            Fn::Sub: "${ServiceName}-${StageName}-neptune-bastion-sg"
      IamInstanceProfile: !Ref BastionInstanceProfile
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: !Ref VolumeSize
            VolumeType: gp3
      EbsOptimized: false
      SourceDestCheck: false
      KeyName: !Ref BastionKeyPairName
      Tags:
        - Key: ServiceName
          Value: !Ref ServiceName
        - Key: StageName
          Value: !Ref StageName
        - Key: Name
          Value: !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 トンネル (ポートフォワーディング)の動作の流れ

  1. SSH 接続: このコマンドにより、ローカルマシンから踏み台サーバーに SSH で接続します。
  2. ポートフォワーディング: -L オプションによって、ローカルマシンのポート 8182 にアクセスした場合、その通信が踏み台サーバーを通して、Neptune のエンドポイントのポート 8182 に転送されます。
  3. Neptune へのアクセス: その結果、ローカルマシン上で localhost:8182 に接続するだけで、実際には Neptune にアクセスすることが可能になります。

G.V()の起動と接続設定

G.V()を起動すると、以下の画面が表示されます。

New Database Connectionをクリックし、以下のように設定します。

  • Graph Technology Type: Amazon Neptune
  • Database Hostname: localhost
  • Port: 8182

G.V()を起動したら、New Database Connectionをクリック

接続情報の入力

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

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

まとめ

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