最近は業務で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を利用する。またクラスターだけでなく、コンテナなども全て作成するので、右側の「今すぐ始める」ボタンを押下して設定を開始する。

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

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


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


ECSで立てたtestnet nodeにアクセスする
ECSのウィザードで自動作成されるVPCはPublic IPが付与される。早速RPCサーバに接続してみる。
まずは、Public IPを確認する。今回作成したECSのクラスターを選択し、タスクタブから現在実行中のタスクIDをクリックして詳細画面に遷移する。

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

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

データストレージとしてEFSを利用する
Tapyrusのtestnetに接続するnodeを無事にECSを使って起動できた。しかし、この状態ではコンテナが再起動された場合、同期していた内容などが失われてしまう。
この問題を解決するために、tapyrusの情報を永続化ストレージに保存したい。そこで、ECSのコンテナの一部領域をEFSに保存する様に定義を変更する。
最初からEFSを使う設定にもできたが、タスクの更新及び、新しいタスクをECSのサービスに適用する方法も確認したかったので、あえてタスクを更新する方法をとる。
1. セキュリティグループを作成する
NFSにファイルシステムを作成する前に、ECSのコンテナからNFSにアクセスできる様にするためのセキュリティグループを作成する。
セキュリティグループを新規作成する。この時、先ほどECSでサービス作成時に自動生成されたVPCを選択する。

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

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

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

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

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

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

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

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

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

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

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

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

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

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