アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

TapyrusのTestnet nodeをECS + Fargate で立てる

最近は業務でTapyrusを用いたweb3システムの設計開発リードを行ってます。が、主に上流工程とマネージメントがメインで開発はチームメンバーに任せっきりです。
ということで、久々にTapyrusの環境構築を行ってみたので、その内容を整理して記事にします。
今回はTapyrusというよりはECSの環境構築を勉強することを主目的としてやってみました。

TapyrusのDocker imageの準備

TapyrusのDocker imageは既に準備されいた。起動手順もドキュメントに整理されている。
github.com

ただ、entorypoint.shを見る限り、image配置してコンテナを起動するとdevモードで起動する。
github.com

今回はテストネットにつながるnodeを立てたいので、自分でimageを作成した。
といっても、entorypoint.shと上記のドキュメントを参考に、testnetにつながるtapyrus.confを生成して配置することと、環境変数にtestnetのgenesisblockのpayloadを設定しただけ。

今回作成したimageは以下で公開した。
hub.docker.com

ECSを起動する

ECSで実行するimageが準備できたので、早速ECSでコンテナを作成する。
AWSのマネージメントコンソールにログインし、ECSのページを開く。

今回はコンテナを実行するホストを管理したくないので、EC2ではなくFARGATEを利用する。またクラスターだけでなく、コンテナなども全て作成するので、右側の「今すぐ始める」ボタンを押下して設定を開始する。

launch ECS

1. コンテナイメージの定義

最初にコンテナのベースとなるimageを選択する。今回は独自のイメージを使うので、customの「設定」ボタンを押下する。

select image

設定画面では先ほど作ったimageを使う様に設定する。また、Tapyrusのtestnetと同期を行うのと、外部からRPCでアクセスを行うので、p2p portの2357とRPC portの12383の2つを設定する。

image settings1
image settings2

2. タスク定義

特に必要というわけではないが、後で分かりやすくしておくためにタスク定義の名前を変更しておく。
タスク定義の横にある「編集」ボタンを押下し、タスク定義の編集画面を開く。
今回はタスクの名前を「run-tapyrus-node-testnet-definition」に変更する。その他の設定は特に変更してない。

edit task definition
change task name

3. サービスとクラスター定義

続いて、サービスの定義とクラスターの定義を行う。
サービスとクラスター定義ではデフォルトの設定から特に変えるものはない。クラスターの名前を分かりやすく「testnet」に変更しておく。

service setting
cluster setting

4. ECSの作成

設定は以上で完了。最後の確認ページで「作成」ボタンを押下するとサービス(コンテナというべき?)が作成され起動する。

complete settings

ECSで立てたtestnet nodeにアクセスする

ECSのウィザードで自動作成されるVPCはPublic IPが付与される。早速RPCサーバに接続してみる。

まずは、Public IPを確認する。今回作成したECSのクラスターを選択し、タスクタブから現在実行中のタスクIDをクリックして詳細画面に遷移する。

public ip check1

詳細画面の「ネットワーク」の項目にPublic IPが表示されている。今回のIPは「13.212.143.32」が割り当てられた。

public ip check2

早速、このIPに対してRPCでブロックチェーンの情報(getblockchaininfo)を取得する。今回はpostmanを使ってアクセスした。以下の図で示す通り、無事にTapyrusの情報を取得できた。

postman getblockchaininfo result

データストレージとしてEFSを利用する

Tapyrusのtestnetに接続するnodeを無事にECSを使って起動できた。しかし、この状態ではコンテナが再起動された場合、同期していた内容などが失われてしまう。
この問題を解決するために、tapyrusの情報を永続化ストレージに保存したい。そこで、ECSのコンテナの一部領域をEFSに保存する様に定義を変更する。

最初からEFSを使う設定にもできたが、タスクの更新及び、新しいタスクをECSのサービスに適用する方法も確認したかったので、あえてタスクを更新する方法をとる。

1. セキュリティグループを作成する

NFSファイルシステムを作成する前に、ECSのコンテナからNFSにアクセスできる様にするためのセキュリティグループを作成する。

セキュリティグループを新規作成する。この時、先ほどECSでサービス作成時に自動生成されたVPCを選択する。

create security group


続いてインバウンドの設定を行う。タイプには「NFS」を指定、ソースには、こちらもECS作成時に自動作成されたセキュリティグループを指定する。アウトバウンドはデフォルトの設定のまま。

port setting


EFSから新しいファイルシステムを作成する。新しいファイルシステムはECSと同じVPSを指定する。名前は任意の名前でよい。今回は分かりやすい様に、「tapyrus-testnet-data」とした。

create filesystem

ファイルシステムを作成したら、ECSからのアクセスを許可するために、先ほど作ったセキュリティグループを設定する。まずは、作成したファイルシステムの詳細画面で「ネットワーク」タブを表示し、「管理」ボタンを押下して、ネットワークの設定画面に遷移する。

set sg to filesystem

マウントターゲットにECSからアクセスできる様に、先ほど作成したセキュリティグループを設定する。

set sg to mount target

ここからは、ECSの設定を更新する。まずは現在利用しているECSのタスクを選択し、「新しいリビジョンの作成」ボタンを押下して、マウントポイントにファイルシステムを利用するタスク定義の設定を行う。

update ecs task

まず最初にvolumeを追加する。「ボリューム」カテゴリにある「ボリュームの追加」を押下する。「ボリューム」カテゴリはタスク定義の一番したの方にある。

add volume1

追加するボリュームは先ほど作成したEFSのファイルシステムを指定する。アクセスポイントIDは「None」のままで問題ない。設定が終わったら、「追加」ボタンを押下してボリュームを追加する。今回はボリューム名を「tapyrus-data」として作成した。

add volume2

次に、コンテナに対してマウントポイントを作成する。タスク定義の設定画面から、コンテナ名をクリックしてコンテナの編集画面に遷移する。

edit container1

コンテナ編集画面の「ストレージとログ」カテゴリでマウントポイントを設定する。ソースボリュームには先ほど作ったボリューム「tapyrus-data」を指定する。また、コンテナパスには、tapyrusがデータを保存するフォルダである「/var/lib/tapyrus」を指定する。

edit container2

コンテナの編集とタスク定義の更新は以上で完了である。

続いて、今作成した新しいリビジョンのタスクを使ってコンテナを起動するためにサービスの定義を更新する。
サービス詳細画面の「更新」ボタンを押下して、サービスの設定画面に遷移する。

update service

タスク定義のリビジョンを先ほど作ったタスクのリビジョンに変更する。設定を変更するのはここだけである。そのほかは変更せず、「次へ」ボタンを押下して、最後まで設定を完了させる。

update service2

サービスの更新が完了すると以下の画面が表示される。あとはECSで新しいサービスの内容が自動的に反映されるまで待つ。

update service3

サービスが正常に更新されると、以下の様に新しいリビジョンのタスクを反映させたコンテナが起動される。コンテナが無事RUNNINGになると、今のコンテナと入れ替わる。

update service4

これで、コンテナが停止しても同期していたブロック情報などはEFSに保存されているため維持できる様になった。試しにタスクを停止したりして試してみると良い。