Symbolノードを30分でAWS上に立ち上げる


## 目的

まずは、Symbolメインネットローンチおめでとうございます！
ローンチはスタートでこれからが全てなので、頑張って記事を書いていこうと思います。

今回は、ノードの構築部分をスピンオフということで・・・

https://qiita.com/keiyow/items/c200c6a8288f8d728b1a

セキュリティ設定とか、dockerの設定とか、symbol-bootstrapの設定をとにかく省きたいので、新規に立ち上げる際にできる限り自動化してみた。
できる限り安全に作るということでAWSを使用。
もちろん使用は `自己責任` で。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/e653af8a-d828-15b6-a16c-53e011020c77.png)


## まずはAWSアカウント、なければ作成する。(〜10分)

ここに書いてるとおりにアカウントを作るだけで問題なし。
アカウントは2FAすることを推奨

https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/?nc1=h_ls

### アカウント登録に必要なもの

* あなたの名前・住所
* クレジットカード
* メールアドレス


## AWS上のサーバ-(インスタンス)にSSHログインするための鍵作成(〜5分)

事前にないとサーバー作れないので事前に作成する。
順番通りにすれば鍵作れる

|説明|図|
| --- | ---|
|① リージョンを選択<br>世界中にAWSがあるので、世界のどこかのデータセンター郡を選択する。<br>ここではバージニア北部にしている。東京とか大阪でも全然問題なし。<br>このリージョンにサーバが作られる。<br><br>② サービスの選択<br>上タブ左側にあるサービスをクリックすると、AWSが使用できるサービス一覧が出る<br><br>③ EC2を選択<br>コンピューティングサービス、つまりサーバ作れるサービスに移動できる|![スクリーンショット 2021-03-16 14.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/4eae0aa7-c962-18f7-ef5e-eb6b0eaf16dc.png)|
|① キーペアの選択<br>左項目は下まであるので、下の方にキーペアがある<br><br>② キーペアの作成を選択<br>左上のオレンジ色のボタンをクリックする|![スクリーンショット 2021-03-16 14.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/dc6f06dc-acbb-86a8-b66a-b0b9048c45cd.png)|
|① 名前を決める<br>適用に何でも<br><br>② 保存するファイル形式を選択<br>SSHクライアントを「OpenSSH」で使用するか、「Putty」でやるか環境によって変わるので好きな方法を選択。わからないならそのまま<br><br>③ キーペアを作成を押す<br>鍵が作成される。自動的に秘密鍵がダウンロードされるのでなくさないようにする。|![スクリーンショット 2021-03-16 14.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/3cde8a6a-cee8-fdce-b740-8a353a93f27d.png)|


## サーバーを立ち上げる(~15分)

gitHub上にAWS上に自動で作成するテンプレートから起動することで簡単に起動できる。(mainnetにも一応対応、自己責任で)
https://github.com/keiyow/symbol-aws-cloudformation

やってることは以下の通り、上のgithub上にテンプレート毎あげてるので、カスタムしたい人はどうぞ

* 専用ネットワークを作成
* ファイアウォールを作成(セキュリティグループで3000ポートの開放、SuperNodeSettingsが有効だと7880も開放)
* 固定IPアドレスの取得
* サーバーの作成(Ubuntu20)
* 追加ディスクをマウントし、xfsでフォーマット
* symbol-bootstrapの実行

### GithubのREADMEにあるStackボタンを押して作成ウィザードから起動まで

|説明|図|
| --- | ---|
|テンプレートのあるGithubへ行く|https://github.com/keiyow/symbol-aws-cloudformation|
|GithubのREADMEにあるStackボタンを押して作成ウィザードを起動する|![スクリーンショット 2021-03-16 15.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/78e5bb40-c415-b565-f6f2-ecf8c75de30e.png)|
|赤枠の雲のマークを押す|![スクリーンショット 2021-03-16 15.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/d2436689-a6d5-653e-af04-6dd0ea4c75f5.png)|
|次へを押す|![スクリーンショット 2021-03-16 15.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/4e8b3cc2-210a-d63e-43e7-a4d109b19d51.png)|
|項目を設定し、次へを押す<br>項目の説明については下記を参照|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/c47ca890-9b38-fe58-48ff-56ad760a9403.png)|
|一番下の次へを押す|![スクリーンショット 2021-03-16 16.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/c72b477b-5d7d-a38d-fcba-1635d8a08a30.png)|
|２つのチェックを入れて、スタックの作成を押す。|![スクリーンショット 2021-03-16 16.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/ce21f035-5f50-bc7d-0e76-22adf1478c29.png)|
|この状態で10分ほど待つ<br>(CREATE_IN_PROGRESS)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/bba56e41-1ff4-40d8-b5ac-ba196dff1aa7.png)|
|左項目の２つがCREATE_COMPLATEになったら構築完了|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/a00def0c-062f-6e3b-efcb-e3a97479e71c.png)|

### 項目説明

|項目|説明|
|---|---|
|Stack Name|スタック名を指定。これはユニークであればなんでもOK|
|Service Name|サーバー名やネットワーク名の冠名を指定。|
|AvailabilityZone1| AWSのデータセンターが国(リージョン)の中でさらに分かれているというイメージなだけなので適当に選択|
|PublicLocationIP| RESTポート(3000)と通信(7900)ポートに接続できるIPアドレス範囲を指定。|
|DefaultUnixUser| symbolを起動するUNIXユーザー名。わかりやすくsymbolユーザーとしている|
|KeyName| 上で作成した鍵を指定。空欄だと作成時にエラーになるので注意。 |
|symbolInstanceType| サーバーのスペックを指定。AWSでは種類が多く、従量課金で高くつくことも多いのでちゃんと検討する。でも後からでもスペック変更できるので、とりあえずはt3.largeでも十分なはず。 |
|symbolRootVolumeSize| `/` パーティションのディスクサイズ(GB) <br>システム領域。このままで問題なし|
|symbolDataVolumeSize| `/mnt/symbol/data` パーティションのディスクサイズ(GB) <br> ここにSymbolのデータを集約している。後からでも容量は増やせる |
|SymbolNetwork| testnetかmainnetか選ぶ。　**重要**|
|SymbolAssembly| api,peer,dualの３つから選べる。簡単に説明。<br>apiはrestを提供し、ブロック生成することはない。(ブロックは保持)<br>peerはブロックを生成することができる<br>dualはapi + peerの機能がある|
|SymbolBootstrapVersion| symbol-bootstrap version のバージョンを指定 <br>https://github.com/nemtech/symbol-bootstrap|
|SymbolFriendlyName| ノード名を指定。explorerからノード名が確認できる。空だとbootstrapがランダムな名前を付けてくれる |
|SymbolCreateVotingFile| 投票権ノードとしてVotingTreeファイルとアカウントを生成するか否か。投票権ノードになりたいわけでない場合は不要。このVotingアカウントとmainアカウントをlinkするトランザクションまでは投げない。(それは手動で)|
|SymbolSuperNodeSettings| スーパーノードのagentを作成するか否か。有効にするとsuper node agentプラグラムが動き、ファイアウォールで7880ポートを開放する。 スーパーノードにならないのであれば不要<br> スーパーノードの登録処理(enrol)まではやらない。|


## ブラウザでノードが動いているか確認してみる

|説明|図|
| --- | ---|
|出力を押す|![スクリーンショット 2021-03-16 16.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/f487fc6a-b679-7b2c-3e34-6c829edd43ca.png)|
|ChainInfoのURLを押す|![スクリーンショット 2021-03-16 16.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/c69c0cf8-bc8e-03c2-a29d-562601f6b2a4.png)|
|最初にあるheightの値が増えていることを確認する。増えていればノード参加できている<br>1の場合、うまくつながってない。|![スクリーンショット 2021-03-16 16.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/91ed9775-714d-a658-f989-a175441051c6.png)|

## サーバーにログインする

|説明|図|
| --- | ---|
|サービスを選択し、EC2サービスに移動する|![スクリーンショット 2021-03-16 16.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/418e0f8d-5351-ccd8-2edf-063933ddcce2.png)|
|① 左項目のインスタンスを選択<br>② 作成したサーバーを選択<br>③ 接続を押す|![スクリーンショット 2021-03-16 17.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/2be3bd8d-0fcb-b633-7f22-e5c474c6767d.png)|
|① セッションマネージャータブを選択<br>② 接続を押す|![スクリーンショット 2021-03-16 17.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/00d440f8-db6e-6e23-09d0-fc0c31cda7de.png)|
|ターミナルが開き、SSH接続した時と同じような状況になる|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/70102ae4-194a-ca1e-a6b6-27cd78e1a187.png)|

## ターミナル操作で内容確認

### 設定したDefaultUnixUserにスイッチする

DefaultUnixUserを変更していなければ、 `symbol` という名前のユーザーにスイッチする。

```bash
$ sudo su - symbol

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

symbol@sv-dual:~$
```

### bootstrapで展開した位置に移動する

```bash
symbol@sv-dual:~$ cd /mnt/symbol/data
symbol@sv-dual:/mnt/symbol/data$
```

### Symbolの状態を確認する

```bash
symbol@sv-dual:/mnt/symbol/data$ symbol-bootstrap healthCheck
                         _             _         _                    _         _
  ___  _   _  _ __ ___  | |__    ___  | |       | |__    ___    ___  | |_  ___ | |_  _ __  __ _  _ __
 / __|| | | || '_ ` _ \ | '_ \  / _ \ | | _____ | '_ \  / _ \  / _ \ | __|/ __|| __|| '__|/ _` || '_ \
 \__ \| |_| || | | | | || |_) || (_) || ||_____|| |_) || (_) || (_) || |_ \__ \| |_ | |  | (_| || |_) |
 |___/ \__, ||_| |_| |_||_.__/  \___/ |_|       |_.__/  \___/  \___/  \__||___/ \__||_|   \__,_|| .__/
       |___/                                                                                    |_|
2021-03-16T08:30:11.096Z info     Container db is running
2021-03-16T08:30:11.102Z info     Container api-node is running
2021-03-16T08:30:11.113Z info     Container api-broker is running
2021-03-16T08:30:11.114Z info     Container rest-gateway is running
2021-03-16T08:30:11.122Z info     Container api-node port 7900 -> 7900 is open
2021-03-16T08:30:11.124Z info     Container api-broker port 7902 -> 7902 is open
2021-03-16T08:30:11.124Z info     Container rest-gateway port 3000 -> 3000 is open
2021-03-16T08:30:11.146Z info     Testing http://localhost:3000/node/health
2021-03-16T08:30:11.193Z info     Rest http://localhost:3000/node/health is up and running...
2021-03-16T08:30:11.194Z info     Network is running!
```

### 設定されたアカウントを確認する

今回の方法では暗号化していないので秘密鍵は全て見える。(必要に応じてこのaddress.ymlは暗号化するなりして、秘密鍵はwalletに取り込んだり保存しておく)
基本mainアカウントのみを使うことになる。

アカウント周りに関しては、詳細に書かれていましたので参考になりました

https://qiita.com/GodTanu2/items/2426b748bcf1ec13443e


```bash
symbol@sv-dual:/mnt/symbol/data$ cat target/addresses.yml
version: 2
networkType: 152
nemesisGenerationHashSeed: 45FBCF2F0EA36EFA7923C9BC923D6503169651F7FA4EFC46A8EAF5AE09057EBD
sinkAddress: TDGY4DD2U4YQQGERFMDQYHPYS6M7LHIF6XUCJ4Q
nodes:
    -
        name: api-node
        friendlyName: XXXXXX
        roles: 'Peer,Api,Voting'
        main:
            privateKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            publicKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            address: TDYUKB2Q3QE2YO4NDJCMPEFF3ZPQGFSUVFXQ4WI
        transport:
            privateKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            publicKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            address: TA4WZKMZIYSFRAHUCTFXOZR24DIBI2C4C7SR7MY
        remote:
            privateKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            publicKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            address: TBBNA43BTWQ2SRUHKBDRIVQTFFQMQXMYVS3VHMA
        voting:
            privateKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            publicKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            address: TAHCXD442C2Q5QUGYZVHWU6ZSPP745VB7SWLXII
        vrf:
            privateKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            publicKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            address: TA56LOSYLTRQGBXJVPYC7VZUZVBHZGUQBYXSX2Q
```

## FAQ的なこと

### ノード起動後、ハーベスティングしたいんだけど？

3/25 修正

mainアカウントに10,000xym以上送金すれば、ハーベスティングできる。

```json
"minHarvesterBalance": "10'000'000'000",
```

Voting(投票ノード)やスーパーノードなどにも参加する場合は、linkコマンドを投げmainアカウントを有効にする必要がある。
linkコマンドのやりかたは [linkされてない](###linkされてない)を参照
(残高も大分必要)

### linkされてない

mainアカウントの残高があり、トランザクションを投げる前提なので、自動化はできない。(残高ある秘密鍵を事前にImportするやり方もあったが、なんか危ないので・・・)
mainアカウントに送金後、linkコマンドを発行することでlink transactionがアナウンスされる。
link後は、残高の要件を満たしていればharvestやvotingなどが動く。

ターミナルに接続してlinkコマンドの発行の仕方

```bash
$ sudo su - symbol # DefaultUnixUserで変更した場合はsymbolを変える
$ cd /mnt/symbol/data
$ symbol-bootstrap link --useKnownRestGateways
```

### AWSの料金が高い

この作成したAWSでは、以下のサービスで従量課金が発生する。
(固定IPアドレスはサーバーを起動していれば無料)

* EC2インスタンス(サーバー)料金
* EBS(データディスク)料金
* ネットワーク通信料

VPSとAWSで根本的に違うのは、 `耐障害性`
VPSでは物理ホストが死んだらデータが飛ぶが、AWSやAzureなどクラウドはデータを別で永続保持しているので、物理ホストが壊れて一時停止はあってもまた再開することができる。

ということでAWSで安く抑えるには、`リザーブドインスタンス`(スポットインスタンス、セービングプランは説明長くなるので一旦なしで・・・)というのを、年単位で使うこと前提で事前に購入することで割引を受けられ、サーバー代を安くすることが可能
(新規AWSアカウントの場合、前払いが必須)

https://aws.amazon.com/jp/ec2/pricing/reserved-instances/pricing/

例えば バージニア北部のt3.largeなら、立ち上げ時は
 
```
月 0.0832*24*30 = $59.904(6,520円/月ぐらい)
年 $59.904*12 = $718.848(78,450円/年ぐらい)
```

1年使用することを前提に一部前払いの場合、

```
初 $218(23,800円)(初月のみ)
月 $18(1,965円/月ぐらい)
年 218+(18*12) = $434(47,365円)
```

３年使用することを前提に全前払いとかしたら、大分安くなる

```
初 $822(89,700円)
月 $0
年 822/3 = $274(29,900円)
```

### 全部消したい

Cloudformationで、作成したスタック名(ネストと書いてないほう)を選択して、削除を押す。
２、３分で削除される。

![スクリーンショット 2021-03-16 17.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135107/91692259-93f8-ad7e-8895-5e12b2a7e6fd.png)