https://dev.classmethod.jp/articles/amazon-neptune-auto-scaling/
https://docs.aws.amazon.com/neptune/latest/userguide/manage-console-autoscaling.html
-- 1. コマンド等のインストール
-- 1.1 aws cli version 2 インストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
-- 2. DBクラスター作成
aws neptune create-db-cluster \
--db-cluster-identifier cluster01 \
--engine neptune \
--engine-version 1.0.5.0 \
--port 8182 \
--no-storage-encrypted \
--no-deletion-protection
aws neptune create-db-instance \
--db-cluster-identifier cluster01 \
--engine neptune \
--db-instance-identifier instance01 \
--db-instance-class db.t3.medium \
--no-multi-az \
--no-auto-minor-version-upgrade
aws neptune create-db-instance \
--db-cluster-identifier cluster01 \
--engine neptune \
--db-instance-identifier instance02 \
--db-instance-class db.t3.medium \
--no-multi-az \
--no-auto-minor-version-upgrade
aws neptune describe-db-clusters --db-cluster-identifier cluster01
aws neptune describe-db-instances --db-instance-identifier instance01
aws neptune describe-db-instances --db-instance-identifier instance02
-- 3. Gremlin コンソールのインストール
※エンジンバージョンが1.0.5.0の場合、Gremlinは3.4.10を使用する必要がある
sudo yum install -y java-1.8.0-devel
sudo /usr/sbin/alternatives --config java
Java 8 の数を入力
wget https://archive.apache.org/dist/tinkerpop/3.4.10/apache-tinkerpop-gremlin-console-3.4.10-bin.zip
unzip apache-tinkerpop-gremlin-console-3.4.10-bin.zip
cd apache-tinkerpop-gremlin-console-3.4.10
wget https://www.amazontrust.com/repository/SFSRootCAG2.cer
mkdir /tmp/certs/
cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.amzn2.0.2.x86_64/jre/lib/security/cacerts /tmp/certs/cacerts
sudo keytool -importcert \
-alias neptune-tests-ca \
-keystore /tmp/certs/cacerts \
-file /home/ec2-user/apache-tinkerpop-gremlin-console-3.4.10/SFSRootCAG2.cer \
-noprompt \
-storepass changeit
hosts: [cluster01.cluster-xxxxxxxxxxxx.ap-northeast-1.neptune.amazonaws.com]
port: 8182
connectionPool: { enableSsl: true, trustStore: /tmp/certs/cacerts }
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
cat conf/neptune-remote.yaml
-- 4. データ登録
cd /home/ec2-user/apache-tinkerpop-gremlin-console-3.4.10
bin/gremlin.sh
:remote connect tinkerpop.server conf/neptune-remote.yaml
:remote console
-- 頂点追加
g.addV('person').property(id, '1').property('name', 'martin').property('age', 29).iterate()
g.addV('person').property(id, '2').property('name', 'vadas').property('age', 27).iterate()
g.addV('software').property(id, '3').property('name', 'lop').property('lang', 'java').iterate()
g.addV('person').property(id, '4').property('name', 'josh').property('age', 32).iterate()
g.addV('software').property(id, '5').property('name', 'ripple').property('lang', 'java').iterate()
g.addV('person').property(id, '6').property('name', 'peter').property('age', 35).iterate()
g.addV('person').property(id, '7').property('name', 'justin').property('age', 17)
-- エッジ追加
g.V('1').addE('knows').to(g.V('2')).property('weight', 0.5).iterate()
g.V('1').addE('created').to(g.V('3')).property('weight', 0.4).iterate()
g.V('1').addE('knows').to(g.V('4')).property('weight', 1.0).iterate()
g.V('4').addE('knows').to(g.V('3')).property('weight', 0.4).iterate()
g.V('4').addE('created').to(g.V('5')).property('weight', 1.0).iterate()
g.V('6').addE('created').to(g.V('3')).property('weight', 0.2).iterate()
g.V('7').addE('knows').to(g.V('1')).property('weight', 0.2)
g.V().valueMap()
g.E().valueMap()
:exit
-- 5. ターゲットクラスタの登録
aws application-autoscaling register-scalable-target \
--service-namespace neptune \
--resource-id cluster:cluster01 \
--scalable-dimension neptune:cluster:ReadReplicaCount \
--min-capacity 1 \
--max-capacity 2
aws application-autoscaling describe-scalable-targets --service-namespace neptune
-- 6. クラスタへのスケーリングポリシーの適用
{
"TargetValue": 10.0,
"PredefinedMetricSpecification":
{
"PredefinedMetricType": "NeptuneReaderAverageCPUUtilization"
},
"ScaleInCooldown": 60,
"ScaleOutCooldown": 60
}
aws application-autoscaling put-scaling-policy \
--policy-name policy01 \
--policy-type TargetTrackingScaling \
--resource-id cluster:cluster01 \
--service-namespace neptune \
--scalable-dimension neptune:cluster:ReadReplicaCount \
--target-tracking-scaling-policy-configuration file://a.json
aws application-autoscaling describe-scaling-policies --service-namespace neptune
下記条件でCloudWatchアラームが2個作成される
3 分内の3データポイントのCPUUtilization > 10
15 分内の15データポイントのCPUUtilization < 9
-- 7. 動作確認
cd /home/ec2-user/apache-tinkerpop-gremlin-console-3.4.10
vim conf/neptune-remote-ro.yaml
hosts: [instance02.xxxxxxxxxxxx.ap-northeast-1.neptune.amazonaws.com]
port: 8182
connectionPool: { enableSsl: true, trustStore: /tmp/certs/cacerts }
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
cat conf/neptune-remote-ro.yaml
bin/gremlin.sh
:remote connect tinkerpop.server conf/neptune-remote-ro.yaml
:remote console
下記コマンドを繰り返し実行
g.V()
g.V().valueMap()
g.E()
:exit
スケールアウトは確認できた。
スケールインについては、CloudWatchアラームはアラーム状態となりアクション実行のログも確認できたが、なぜか動作しなかった。
-- 8. クリーンアップ
-- スケーリングポリシーの削除
aws application-autoscaling delete-scaling-policy \
--policy-name policy01 \
--resource-id cluster:cluster01 \
--service-namespace neptune \
--scalable-dimension neptune:cluster:ReadReplicaCount
aws application-autoscaling describe-scaling-policies --service-namespace neptune
-- ターゲットクラスタの登録解除
aws application-autoscaling deregister-scalable-target \
--service-namespace neptune \
--resource-id cluster:cluster01 \
--scalable-dimension neptune:cluster:ReadReplicaCount
aws application-autoscaling describe-scalable-targets --service-namespace neptune
-- インスタンスの削除
aws neptune delete-db-instance \
--db-instance-identifier instance02 \
--skip-final-snapshot
aws neptune delete-db-instance \
--db-instance-identifier instance01 \
--skip-final-snapshot
aws neptune describe-db-instances
-- クラスターの削除
aws neptune delete-db-cluster \
--db-cluster-identifier cluster01 \
--skip-final-snapshot
aws neptune describe-db-clusters