Wait a moment...

Catapultテストネットノードの構築スクリプトを作りました。(AWS EC2 Amazon Linux2 向け)

36829
44uk_i3
nem1917xem (19)
2807
15
2020-01-22 22:22:25
Catapultテストネットノードの構築スクリプトを作りました。(AWS EC2 Amazon Linux2 向け)

* 1/29 symbol-testnet-bootstrap が公開されたので、内容を一部修正しました。

おそらくCatapult版のテストネットはそのうちクローズされると思いますがそれまでは併記しておきます。

Symbol版と書かかれたほうを使用してください。


「ローンチする前に、テストネットのノードが最低1,000くらいほしいな」

というコア開発者のJaguar氏の発言をきっかけに、次々とテストネットを立ち上げる有志が増えてきていて

本当にありがたいです。

 

しかし、1,000という数字はかなりのサイズであり、

現行のNEMでも400機くらい(?うろ覚えの適当な数字かもしれません)なので、なかなか大変です。

 

そこで、とりあえず手順通りにやればテストネットノードが立ち上がるスクリプトを用意しました。

次のスクリプトは AWS EC2 Amazon Linux2 向けですが、

他のディストリビューションでも、ある程度変更すれば動かせると思います。

(そもそも動かすだけならDockerさえ入っていれば動かせますが、色々と工夫した分のコードが書いてあります)

 

次のスクリプトの内容を貼り付けて、インスタンスを作成すれば、

しばらく待つだけでテストネットノードとして稼働し始めます。

 

Catapult版

 

cat-peer-setup.sh (Peerノード用)

https://gist.github.com/44uk/ff9e8125a3c5ce5aa4f577130df12460

cat-api-setup.sh (APIノード用)

https://gist.github.com/44uk/d762ff2629ad684ae5234b686e30dd90

 

Symbol版

 

sym-peer-setup.sh (Peerノード用)

https://gist.github.com/44uk/a1777ee9ddcf0cf28e76a529c646d2f3

sym-api-setup.sh (APIノード用)

https://gist.github.com/44uk/abedba6915803fa92b0b4d0ecbb7eba5

 

 

 

ノードには「Peerノード」と「APIノード」の2種類があります。

 

Peerノードは別のノードとブロックチェーン情報を同期を担うノードです。

APIノードはPeerノードの役割に加えて、ブロックチェーン情報にアクセスするためのAPIの提供を行います。

 

APIノードは http://__ノードのIPアドレス__:3000/node/info のようにノード情報を返すアドレスにアクセスすれば、

稼働状況が確認できるのですが、Peerノードはそもそもブラウザからアクセスできるような窓口がありません。

建ててみたのはいいが、いまいち動いているのかよくわからない、というふうに見えてしまいます。

(サーバにログインして、あれこれコマンドを打ったりログを見ればわかるのですが、少々ハードルが高いと思われます)

 

そこで、Peerノードのスクリプトでは、ブロックのデータからそのノードの持っているブロック高の情報を抜き出し、

それだけブラウザでみれるように工夫しました。

 

Peerノードのスクリプトを使った場合は http://__ノードのIPアドレス__:50080/height.txt にアクセスしてみてください。

この数値が徐々に増えていき、他のノードのブロック高に追いつくことで同期が完了したとわかります。

 

スクリプトにはコメントを入れてありますので、ぜひ実行するだけではなく、覗いてみてください。

わからないことがあれば回答しますし、より良い方法があればぜひアドバイスいただければ幸いです。

 

 

HTTPS API Gateway対応

 

44uk/symbol-testnet-bootstrap at with-https

https://github.com/44uk/symbol-testnet-bootstrap/tree/with-https

 

私の方でゲートウェイがHTTPSでの通信に対応するように修正を加えたものを作りました。

これを使用する場合は sym-api-setup.sh の次の部分のURLを置き換えてください。

 

# この行を
- curl -L https://github.com/nemfoundation/symbol-testnet-bootstrap/archive/$BOOTSTRAP_TAG.tar.gz | tar zx
# これに置き換え
+ curl -L https://github.com/44uk/symbol-testnet-bootstrap/archive/with-https.tar.gz | tar zx

 

技術的な解説(言い訳)

 

テストネットノードの構築はすでに財団githubリポジトリにて、簡単に立ち上げられるツールが公開済みです。

 

nemfoundation/catapult-testnet-bootstrap

https://github.com/nemfoundation/catapult-testnet-bootstrap

 

nemfoundation/symbol-testnet-bootstrap

https://github.com/nemfoundation/symbol-testnet-bootstrap

 

dockerとdocker-composeがインストールされていれば docker-compose up --build -d というコマンド一発で動作を始め、

ネットワーク上のノードと同期が始まり、テストネットノードの一員となることができます。

 

スクリプトではこれをサーバ上に展開し、サーバOSが再起動した場合でも復帰するようにサービス化したりしています。

 

VPSサーバなどの場合、sshでログインすることが一般的ですが、ポート番号が22番から50022番へ変更しています。

これは22番というポート番号はsshでログインするための入り口として使われがち、ということで、

世界中のアタッカーがよく(とてもよく)機械的なアタックを仕掛けてきます。

なので、入り口をすこしずらしてしまいます。

玄関を分かりにくくしてしまえば訪問販売も面倒臭がって営業には来ないだろう、みたいな話です。

(余談ですが、UberEatsをご利用の際にはお届け先をわかりやすいように、一軒家の場合はなにか目印をメモに書いてください。

それだけで配達がはかどりますのでよろしくおねがいします。)

 

また、世のベストプラクティスでは ec2-user を削除して、別のユーザーを用意するのが良いそうですが、

手順が煩雑になるので流用することにしました。

これも、 ec2-user というユーザーが居るはずだからなりすましでアタックを仕掛けられないための自衛策です。

「田中」さんが居るはずだから「田中」と名乗ればとりあえず名前は誤魔化せるだろう、みたいな話です。

しかし、前述のsshポート番号を変更していますので、不正ログイン対策としては十分かと思います。

 

メインとなる catapult のコンテナ起動は systemctl のスクリプトに行わせています。

実行ユーザを ec2-user にしたかったのですが、コンテナ内部のユーザーがrootで動作するため、

コンテナが作成するブロックファイルやステータス管理ファイルのオーナーがrootになってしまいました。

これを解決するのが若干難儀したため、rootで動作させてしまっています。

動かすだけなら特に問題はありませんが、オーナーを修正する場合は手動で sudo chown -R ec2-user: などとしてください。

 

Peerノードの場合は更にブロックチェーン高を外部に公開するためのスクリプトとサービスを用意しています。

data/index.dat というファイルにはそのノードが持っているブロックチェーンデータの最新高が記録されています。

このファイルを読み取って、整数値を tmp/height.txt というファイルへと20秒に一回書き出します。

その書き出されるファイルを http サーバのコンテナを用いて公開するようにしました。

 

これは、Peerノードをただ立ち上げただけだと外部からちゃんと動いて同期されているのかがわかりにくかったので、

せめてブロック高が進んでいることがわかるようにと工夫しました。

dockerのログをみたり、ブロックチェーンのファイルが増加しているなどを観察してもよいのですが、

少々手間だったり、コマンドに慣れていないとなかなか大変です。

ブロックチェーン高を公開するだけですのでセキュリティ的にも影響はほぼ無いでしょう。

 

大まかに、こんなことをするスクリプトです。

ぜひ、動かしてみて色々とフィードバックを頂いたり、お好きに改造していただければ幸いです。

 

AWS でのノードサーバ構築操作(駆け足版)

 

AWS EC2 での一通りの操作を簡単にですが、キャプチャつきで解説します。

 

本当はネットワーク設定やリージョンの選択など、もう少し細かい設定があるため、

その辺でトラブルがあるかもしれませんが、ご了承ください。

 

「インスタンス」をクリックします。

 

「インスタンスの作成」をクリックします。

 

「Amazon Linux 2 AMI」を選択します。

 

「t2.micro」を選択して、「次のステップ」をクリックします。

厳密には、このサーバインスタンスですと、catapult-testnet-bootstrap が想定する最低スペックを満たしていないので、

ブロックチェーンネットワークに負荷がかかった場合に、パフォーマンスが追いつかなくなる可能性があります。

(今回は無料利用枠の対象ということで選択しています)

 

「ユーザーデータ」の部分にスクリプトを貼り付けます。

貼り付けたら「次のステップ」をクリックします。

 

「Raw」というボタンを押すと、内容がテキスト形式で表示されるので、全てコピーして貼り付けに使用してください。

 

「サイズ」を「30」に変更します。「終了時に削除」にチェックが入っていることを確認して、「次のステップ」をクリックします。

次の画面(タグの追加)では何もせず、「次のステップ」をクリックしてください。

 

セキュリティルールを上記のように設定してください。

APIノードのスクリプトを使う場合は、「50080」を「3000」として設定してください。

「確認と作成」をクリックします。

 

警告が出ますが、これはスクリプトがポート番号を22から50022へ変更するので、50022を設定できていれば問題ありません。

「次へ」をクリックします。

 

「起動」をクリックします。

 

「キーペア名」にはお好きな名前をつけて、「キーペアのダウンロード」をクリックして、サーバの秘密鍵を保存してください。

sshでのサーバログインについては、それを解説する記事などをご参照ください。

ただしポート番号は「50022」にスクリプトが変更するので、そこだけ設定を気をつけてください。

「インスタンスの作成」をクリックします。

 

インスタンス名をクリックします。

 

しばらく待つと「running」と「2/2のチェックに合格」という状態になったら準備完了です。

そこから、1,2分程度、スクリプトのセットアップの完了を待つと、「パブリックIP」のIPアドレスでアクセスできるようになります。

 

Peerノードのスクリプトを使った場合は、http://34.200.255.61:50080/height.txt にアクセスしてみてください。

なにか数字が出ますが、これはそのノードが持つブロックチェーンが同期している最新ブロック高です。

 

APIノードのスクリプトを使った場合は、http://34.200.255.61:3000/chain/height にアクセスしてみてください。

これも最新ブロック高を表示します。

 

現在のネットワークのブロック高はエクスプローラなどで確認してみてください。

 

Catapult版

http://explorer.nemtech.network/

 

Symbol版

http://explorer-xym.nemtech.network/

 

この数値に追いつけば、他のノードと最新ブロックまでの同期ができたということになります。

(IPアドレスはサーバインスタンスを作るごとに変わるので、お使いの環境で確認してください)

 

暫く経つと、ノード一覧にあなたのノードが表示されてきます。

http://explorer.nemtech.network/nodes

http://explorer-xym.nemtech.network/nodes

hostに表示されているIPアドレスか、FRIENDY_NAMEを設定していたら、ここで確認できます。

しかし、出てきたり出てこなかったり、見えなくなったりとあまりちゃんとした情報が取れていないような気がしますので参考程度に。

ブロック高が進んでいれば問題ないと思います。

 

https://nem2-node-explorer.firebaseapp.com/

上記のエクスプローラで見つからない場合がよくあるので、

複数のAPIノードから集めたノード情報を配信するエクスプローラを用意しました。

1時間くらいごとに更新されるので、IPアドレスやFriendlyNameなどで検索して見つけてみてください。

 

なお、AWSには新規登録してから12ヶ月間は一定の条件の範囲で、無料で利用することができます。

今回のセットアップでは、サーバインスタンスとストレージについては無料の範囲です。

これに加えて、ネットワーク使用料というのがあるのですが、こちらは若干の支払いが生じる可能性があります。

(数日動かしたノードを観察したところ、0.15GB/日 程度の転送量がありましたが、

テストでトランザクションが飛び交うとまた変わるかもしれません)

それほど高額になることは無いと思いますが、ある程度の見積もりが出せたらまた追記します。

 

一応見積もりツールで見積もりを出してみたのですが、本当にあっているのかちょっと自信がないので精査中です。

https://calculator.s3.amazonaws.com/index.html#r=IAD&s=EC2&key=files/calc-e38376141e8b4632a968523b91f6769b82c7e43a&v=ver20200121eM

 

サーバインスタンスを削除する

建てたサーバをほおって置くと、無料期間を過ぎたり、使用時間によっては課金が発生します。

必要が無くなったら、忘れる前に削除しておきましょう。

 

「アクション > インスタンスの状態 > 終了」をクリックします。

 

「はい、終了する」をクリックします。

 

「terminated」という状態になっていれば、そのうち一覧から消えてなくなります。

 

うまく動いてない(っぽい)場合は

 

http://__IPアドレス__:3000/node/info や http://__IPアドレス__:50080/height.txt にアクセスしても、

応答が返ってこない場合はログを確認してみます。

 

初期化スクリプトログを確認

 

コマンドライン操作の能力が要求されますが、サーバにログインできることを前提とします。

 

$ less -R /var/log/cloud-init-output.log

 

サーバに ec2-user ユーザーでログイン後、このコマンドでシェルスクリプトが実行した内容のログを確認できます。

なにか異常終了していないか確認してみてください。

 

コンテナ動作確認

 

$ docker ps

 

このコマンドでは、コンテナが動いているかどうかを確認できます。

 

[ec2-user@ip-172-30-0-198 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0e5f78afe3b peer-assembly_peer-node "bash -c '/bin-mount…" 2 days ago Up 2 days 0.0.0.0:7900->7900/tcp peer-assembly_peer-node_1
5235861a4c8b sebp/lighttpd "start.sh" 2 days ago Up 2 days 0.0.0.0:50080->80/tcp cat-health-check

このような結果が表示されていればコンテナは動いていると思われます。

(この結果はPeerノード立ち上げ時の例)

 

セキュリティグループの確認

 

こちらはAWS側の設定になりますが、セキュリティグループで適切なポートを開放しているかどうかを確認してみてください。

 

Peerノードであれば、7900, 50022, 50080 を、APIノードであれば 3000, 7900, 50022 です。

 

 

おわりに

 

サーバの構築にはそれなりの知識と、ハッカーやアタッカーの踏み台にされないように自衛をする責任が必要です。

今回の作業とスクリプトでは簡単ではありますが、必要十分な対策は施してあります。

それでも、可能な範囲で自分のやっていることの意味を理解していただけると幸いです。

(その知識はそれほど無駄にはならないと思いますので、ぜひ調べたり、質問してください)

 

公式からもノード構築のガイドが出ていました。

こちらも参考にしてみてください。

 

(#和訳)SYMBOL Tutorial_ Running a Test Net Node (WIP).pptx - Google ドライブ

https://drive.google.com/file/d/1Dt66rhvMgE4uPxN_WbBYgUk1suq_S_Rl/view

 

 

Comment
44uk_i3
44uk_i3
2020-02-03 22:42:14ID:172066

>>mash::さん
ノードのブロック高が確認できて、それが増加し、最新ブロック高に追いついたらOKです。
(増加するところまで確認できていれば十分です)
その後は特にやることはないですw強いて言えば維持ですかね。
なるべく多くのノードが存在するほうがネットワーク耐性も安定性も高まるので、
一種のネットワーク貢献という感じでしょうか。

今回はメインネットに向けてのテストでのバグや障害出しというのが目的になりますね。
このあたりは公式から何か案内がでるようなので、
その時また改めて構築に関する記事を書こうと思います。

そのときにまた、ぜひネットワークテストに参加していただければ幸いです。

mash
mash
2020-02-03 17:19:14ID:172017

遅ればせながら、参考に立ててみました。symbolで。一度一通り進めたのですが、読み込み直していみたらインスタンスごと消えて無くなっていました。
アクセスもなんか上手く行ってなかったっぽいんですが再度インスタンス立ち上げてみたら今度はうまくいったみたい。
AWS 前に少し触ったけどよくわかってないですね私。
とりあえず私にもできたようです。ありがとうございます。
ちなみにこれ、このあとどうしたらいいんです?初歩的なこと言ってすみません。

44uk_i3
44uk_i3
2020-01-26 15:53:46ID:170918

>>わんこイン.nem::さん
うまくいってよかったです。
スクリプト内のコマンドをそのままなぞればGCPやAzureのサーバでもできると思います。
(UbuntuなどDebian系や古いRedHat系だと一発ではうまく行かないかもしれませんが)
修正したコマンドでスクリプトを書き換えれば、次回以降はそのスクリプトで一発構築できるようになりますので
ぜひ挑戦してみて、成果を残してみてください。

わんこイン.symbol
わんこイン.symbol
2020-01-26 07:10:12ID:170865

今度はできたようです。
最初からPCですればよかった!!
アンドロイドタブでしてたからできなかったのかな?
順調にheightの数値が伸びてます

手順どうりにコードをコピペして実行するだけでノードがつくれるなんてすごいです。
AWSの無料枠でしてみました。
次はGoogleにも無料枠のGCPがあるんでコマンド打ち込みながらノード作ってみようと思います

ありがとうございました!!

わんこイン.symbol
わんこイン.symbol
2020-01-24 15:43:54ID:170627

スゴくわかりやすいし、無料があるし
44uk_i3さんの記事をなぞりながらやってみます

ONCO
ONCO
2020-01-24 07:06:49ID:170554

できました!
ありがとうございます!!

nem好き
nem好き
2020-01-23 20:18:56ID:170458

ありがとうございます。

snは無理ですが、nodeは立ち上げたいと思っています。
Dockerつかうのであれば今回作っていただいた設定はすごく重要だと思います。
すごく勉強になりました。
いろいろ疑問にも答えていただいてありがとうございます。
引き続きいろいろやってみます。

44uk_i3
44uk_i3
2020-01-23 15:38:41ID:170428

>>nem好き::さん

> 一つ質問があります、現在テストネットですが、本来のmain_netになってもdockerのイメージを使って運用する予定なのでしょうか?

私にはわかりませんが、手段の一つとして提供される可能性はあると思います。
最も確実なのは、Catapult-serverのソースをコンパイルすることですが、コンパイル環境を整えたりといろいろ大変です。

ですが、それら諸々を解決済みで実行するだけでネットワークに参加できるDockerイメージは、
その製作過程でマルウェアを混入されることもあります。
実際にビットコインやMoneroマイナーが入れられたイメージの配布が起こってます。
https://blog.trendmicro.co.jp/archives/21525

なので、公式として展開されているものなら大丈夫だとは思いますが、それでもやはり監視の目は必要ではないでしょうか。
(監視できるという点がオープンソースの良いところでもありますね)

> サーバーの要求水準が1つですが、api-nodeとpeer-nodeではスペックに差がでるとずっと疑問に思っております。

テストネットノードの立ち上げ — NEM Developer Center https://nemtech.github.io/ja/guides/network/running-a-test-net-node.html#hardware-requirements
スペックについてはこちらで確認できます。あくまでテストネット向けのものですが。

> api-nodeとpeer-nodeではスペックに差がでる
APIノードはPeer+APIサーバなので、APIノードのほうがスペックもストレージも必要になるのは明らかです。
クライアントによる問い合わせも処理することになるので、それだけ負荷がかかることもあるでしょう。

> 本日テストネットは動いてるのでエラーが無い限りこのままメインネットにする
1,000ノードを用意して、負荷実験をしたり、チェーンが壊れないかのテストをしたいそうです。
その結果しだいではバグフィックスがまだまだ入るかもしれません。
このチェーンがメインネットにはなりません。
メインネットはメインネットとして改めて開始されるはずです。
(アドレスのフォーマットも違うし、それを後から変更もできませんし、テストネットのチェーン内容を引き継ぐわけにも行きませんので)

nem好き
nem好き
2020-01-23 11:57:44ID:170415

無事立ち上がりました。
インスタンス3つ目で成功しました。
丁寧な解説ありがとうございます。

一つ質問があります、現在テストネットですが、本来のmain_netになってもdockerのイメージを使って運用する予定なのでしょうか?
サーバーの要求水準が1つですが、api-nodeとpeer-nodeではスペックに差がでるとずっと疑問に思っております。
本日テストネットは動いてるのでエラーが無い限りこのままメインネットにする (という意味にjaguarさんのツイートを理解)
そういう理解でいいでしょうか?

44uk_i3
44uk_i3
2020-01-23 10:04:37ID:170407

>>やそ::さん
立ち上げるだけなら、手順通りにやっていただければできてしまいます
(本当は上記以外にもやらないといけないことはあるのですが…)
が、やはりサーバ構築は知識と責任を伴います。
しかし、調べた知識は今後、暗号通貨に限らずインターネットに関連することであれば
無駄になることは無いと思いますので、ぜひ挑戦してみてください。

この記事を書いた人
Twitter: @44uk_i3