ノロノロでAWS Neptune
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));
}
}
Neptuneに繋げるためのいくつかのオプションがあるよっておはなし
詳細は、WorkShopにて
- Build Your First Graph Application with Amazon Neptune
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)
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'))"))}
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で接続できるように
EC2インスタンスでgremlinを動かせるようにする
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>
NeptuneへデータをBulkLoadする。S3にCSV置いて、EC2でローダー動かすです
S3の色々事前準備
- IAM Role作る
- 作ったIAMは、Neptuneで許可しておく
- S3にVPCエンドポイント作る
- CSVをPUTしておく
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
}
}
}