Open7

ノロノロでAWS Neptune

bohebohebohebohe

ProvisionedでNeptuneを立ち上げる前にやること

準備だよ。

  • VPCとサブネット2つ(Public/Private)
  • ssh接続できて、Neptuneに繋がるEC2インスタンス

cdkで書いちゃいなよ

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class VpcNeptuneStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        const vpc = new ec2.Vpc(this, 'Vpc', {
            ipAddresses: ec2.IpAddresses.cidr('172.32.0.0/16'),
            subnetConfiguration: [
                {
                    cidrMask: 24,
                    name: 'neptune-public-subnet',
                    subnetType: ec2.SubnetType.PUBLIC,
                },
                {
                    cidrMask: 28,
                    name: 'neptune-private-subnet',
                    subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
                },
            ],
        });

        //EC2
        const accessNeptune = new ec2.Instance(this, 'accessNeptune', {
            vpc: vpc,
            instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
            machineImage: new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2 }),
            vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
            keyName: 'your-key-name',
            instanceName: 'accessNeptune-instance',
        });
        accessNeptune.connections.allowFromAnyIpv4(ec2.Port.tcp(22));
    }
}
bohebohebohebohe

Neptuneに繋げるためのいくつかのオプションがあるよっておはなし

詳細は、WorkShopにて

  • Build Your First Graph Application with Amazon Neptune

https://catalog.us-east-1.prod.workshops.aws/workshops/2ae99bf2-10df-444f-a21f-8ad0537a9bdd/en-US/workshop1/cluster-access

What is a Neptune cluster and how do I connect to one?

A Neptune cluster consists of one or more database instances, or compute nodes, and a shared cluster volume that holds the data for the cluster. Data within the cluster volume is copied across three availability zones as a single, virtual volume. The database cluster contains a primary instance and, optionally, up to 15 read replicas.

Neptune clusters can only be created within a VPC, and its endpoints are only accessible within that VPC. Common options for connecting to a cluster include but are not limited to:

  • Direct Connect or Site-to-Site VPN tunnel
  • VPC peering
  • Client VPN
  • NLB with Lambda updater (example)
  • ALB with HAProxy (example)
  • API Gateway + Lambda
  • AppSync + Lambda (example)
  • EC2 bastion host (example)
  • SSH tunneling
  • Neptune notebook created via Neptune workbench or self-hosted (example)
bohebohebohebohe

Jupyter NotebookからNeptuneに繋がらない時

えらる・・・・。これは、Notebookが作成されているサブネットから8182の許可が通っていないので、Neptunrのセキュリティグループにその設定を入れる

{'error': ConnectionError(MaxRetryError("HTTPSConnectionPool(host='your.cluster.ap-northeast-1.neptune.amazonaws.com', port=8182): Max retries exceeded with url: /status (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fa7bab9ae10>: Failed to establish a new connection: [Errno 110] Connection timed out'))"))}

bohebohebohebohe

EC2インスタンスからNeptune

  • VPCとSubnetは、Neptuneと同じとこ
  • Neptuneのセキュリティグループで8182許可されてること
  • 自分ところからsshできること

EC2インスタンスで、とりあえず、nodeを使えるように

バージョンは生きている瞬間に合わせよう

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
. ~/.nvm/nvm.sh
nvm install 16
npm install gremlin
npm install -g npm@9.6.7

EC2インスタンスからgremlinで接続できるように

https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/access-graph-gremlin-node-js.html

bohebohebohebohe

EC2インスタンスでgremlinを動かせるようにする

https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-console.html

Gremlin Console のインストール

Neptune にアクセスできる EC2 に Gremlin Console をインストールします。ここで使用する OS は Amazon Linux 2 を前提とします。

java-openjdk11 をインストールします。

$ sudo amazon-linux-extras install -y java-openjdk11
Installing java-11-openjdk
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
・
・
・
 65  lustre                   available    [ =stable ]
 66  php8.1                   available    [ =stable ]
$

JSON を操作する jq もインストールしておきます。

$ sudo yum install -y jq

インストールした Java 11 をデフォルトのランタイムとして設定します。

$ sudo /usr/sbin/alternatives --config java

There is 1 program that provides 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.amzn2.0.1.x86_64/bin/java)

Enter to keep the current selection[+], or type selection number: 1 # インストールした Java の番号である 1 を入力
$

Engine Version 1.2.1.1 がサポートしている Gremlin のバージョンである 3.6.2 をダウンロードします。

Index of /dist/tinkerpop/3.6.2

$ wget https://archive.apache.org/dist/tinkerpop/3.6.2/apache-tinkerpop-gremlin-console-3.6.2-bin.zip

ダウンロードしたファイルを解凍します。

$ unzip apache-tinkerpop-gremlin-console-3.6.2-bin.zip

ディレクトリを移動します。

$ cd apache-tinkerpop-gremlin-console-3.6.2

**./conf/neptune-remote.yamlというファイルを作成して、接続情報を記述します。hosts**には Neptune のエンドポイントを記述します。

$ vim ./conf/neptune-remote.yaml

$ cat ./conf/neptune-remote.yaml

hosts: [your-cluster.ap-northeast-1.neptune.amazonaws.com]
port: 8182
connectionPool: { enableSsl: true }
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
              config: { serializeResultToString: true }}

**bin/gremlin.sh**を起動して接続できることを確認します。

$ bin/gremlin.sh
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/home/ec2-user/apache-tinkerpop-gremlin-console-3.6.2/lib/groovy-2.5.15-indy.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Jun 04, 2023 12:26:53 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin>
bohebohebohebohe

NeptuneへデータをBulkLoadする。S3にCSV置いて、EC2でローダー動かすです

S3の色々事前準備

  • IAM Role作る
  • 作ったIAMは、Neptuneで許可しておく
  • S3にVPCエンドポイント作る
  • CSVをPUTしておく

https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-IAM.html

EC2でBulkLoader動かす

 curl -X POST  -H 'Content-Type: application/json'  https://your-cluster.ap-northeast-1.neptune.amazonaws.com:8182/loader -d '
    {
      "source" : "s3://{data-bucket}/imdbneptune",
      "format" : "csv",
      "iamRoleArn" : "arn:aws:iam::930978281464:role/NeptuneLoadFromS3",
      "region" : "ap-northeast-1",
      "failOnError" : "FALSE"
    }'

BulkLoaderの進捗です

curl -G 'https://your-cluster.ap-northeast-1.neptune.amazonaws.com:8182/loader/e84d6df0-afdd-4518-820d-7257ed5c663'


{
    "status" : "200 OK",
    "payload" : {
        "feedCount" : [
            {
                "LOAD_NOT_STARTED" : 1
            },
            {
                "LOAD_IN_PROGRESS" : 1
            },
            {
                "LOAD_COMPLETED" : 1
            }
        ],
        "overallStatus" : {
            "fullUri" : "s3://{data-bucket}/imdbneptune",
            "runNumber" : 1,
            "retryNumber" : 0,
            "status" : "LOAD_IN_PROGRESS",
            "totalTimeSpent" : 3583,
            "startTime" : 1685837800,
            "totalRecords" : 36237114,
            "totalDuplicates" : 13800000,
            "parsingErrors" : 0,
            "datatypeMismatchErrors" : 0,
            "insertErrors" : 0
        }
    }
}