AWSでゆるくEthereumの環境構築
以前、Amazon Managed Blockchainのプレビュー版でHyperledger Fabricの環境構築を行いました。Amazon Managed BlockchainではEthereumが未対応なので、『AWS Blockchain Templates』を使ってEthereumの環境構築を試しました。Ethereumの各テストネットワークはパブリックなのでアプリケーションのテスト版のリリースに活用し、純粋なテストにはローカルもしくはプライベートな環境を使いましょう。Think Green !!
以前プレビュー版のAmazon Managed Blockchainを試しましたが、Hyperledger Fabric のサポートのみでEthereumが未だリリースされていません 。Amazon Blockchain TemplateではGo実装のGethで環境構築できるようになっています。
参考にしたAWSのドキュメントはこちらです。アメリカの3つのリージョンで『CloudFormation』を利用したテンプレで構築できます。アメリカのリージョンで構築するにあたり事前に用意しておくべきコンポーネントがあるので手順にします。
現状クラウドでブロックチェーンを構築する場合はAzureなどの他のクラウドサービスのほうが実装例が豊富です。以下は深圳の発票(中国の領収書のようなもの)をテンセントのブロックチェーン運用基盤「TBaaS」(Tencent Blockchain as a Service) を利用して構築した例。[3]
この発票システムはリリースから半年あまり(2018年8月〜2019年3月末)で 1500 社に導入され、深圳地下鉄の電子領収書にも採用されています。この地下鉄だけでも毎月 1.4 億人の利用があるそうです。この規模の社会実装は世界中を見渡してもそれほど多くはないと思います。
こちらは以前から話題にのぼっていたスターバックスのブロックチェーン活用事例。Azureのフルマネージドブロックチェーンサービスである「 Azure Blockchain Service」を利用して珈琲豆のトレーサビリティをブロックチェーン上で実装しています。意識高い系ですね。[4]
契約農場での珈琲豆の栽培状況やフェアトレード認証の有無、農場から工場へ出荷された珈琲豆が本物である証明と移動経路の情報、配送状況、店舗に配達された記録など、生産から消費までのサプライチェーンのデータをブロックチェーンのコントラクトに記録し、サプライチェーンの関係者が追跡できるようにしています
『AWS Blockchain Templates』では2つのパターン(Amazon ECSコンテナプラットフォームとdocker-localプラットフォーム)を構築できますが、ここでは意識低くdocker-localのパターンを選択します。理由はECSの構成では踏み台サーバ(Bastion)経由でのプロキシー接続を設定する必要があるからです(つまり面倒くさいww)。
docker-localは単一のEC2インスタンスの上でDockerコンテナを利用して、Gethマイナー、Gethクライアント、Eth Statsアプリ、Eth Explorerアプリをコンテナで立ち上げてくれます。
またEC2インスタンスにElastic IPを設定しておけば、同じIPで接続できるので設定したIPをエンドポイントとしてテスト環境やステージング環境を構築するのに便利です。例えば毎回ローカルの環境でビルド・デプロイするよりスマートコントラクトはデプロイしておいて、アプリだけローカルで起動したほうが早くないでしょうか。
docker-localパターンの構成図です。
構築手順です。スタックの作成までは下ごしらえです。
- キーペア作成
- EC2インスタンス用のプロファイル作成
- セキュリティグループの作成
- スタックの作成
- Eth Explorer/Eth Statsの確認
キーペア作成
『AWS Blockchain Templates』では3つのアメリカのリージョンで環境構築ができます。使用するリージョンを決定したら、まずはそのリージョンでキーペアを作成します。手順はすべて構築するリージョンで行ってください。
※AWS Cloudformationを起動するリンク、後で使用します
オハイオで作業してみました。なぜなら The Ohio Players 好きなので。
EC2 -> ネットワーク&セキュリティ -> キーペア と進みます。EC2インスタンス用のキーペアを作成してください。ここではAWS_BCという名前のキーペアを作成しました。
EC2インスタンス用のプロファイル作成
Dockerコンテナを使用するEC2インスタンスのプロファイルを作成します。以下の手順で作成します。
- EC2のロールに割り当てるためのポリシーの作成
- ポリシーを割り当てたロールの作成
IAM -> ポリシー と進みポリシーの作成をクリックします。JSONのタブへ切り替えて以下の内容を入力してください。このコンフィグはECSコンテナパターンでも使用できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:CreateCluster",
"ecs:DeregisterContainerInstance",
"ecs:DiscoverPollEndpoint",
"ecs:Poll",
"ecs:RegisterContainerInstance",
"ecs:StartTelemetrySession",
"ecs:Submit*",
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents",
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": "*"
}
]
}
ポリシーの確認をクリックします。
ポリシーの名前と必要であれば説明を入力し、ポリシーの作成をクリックしてください。
IAM -> ポリシー から作成したポリシーは確認できます。
作成したポリシーを割り当てたEC2インスタンス用のロールを作成します。作成したロールのプロファイルARN(Amazon Resource Name)はスタックの作成に必要となるのでメモってください。
IAM -> ロール と進み、ロールの作成をクリックします。
このロールを使用するサービスを選択でEC2を選択し、次のステップ:アクセス権限をクリックしてください。
作成したポリシーをフィルタで検索してアタッチします。
タグは必要であれば設定し、ロールの確認へ進みます。ロール名を入力してロールの作成をクリックします。
IAM -> ロール から作成したロールをクリックすると以下のようにロールのインスタンスプロファイル ARN(Amazon Resource Name)が確認できます。これをメモります 〆(._.) メモメモ。
セキュリティグループの作成
対象のEC2で必要となるセキュリティグループを作成します。ソースのIPアドレスを指定したほうが望ましいです、がここではソースを0.0.0.0/0として作っています(動作確認後に閉じています)。
- SSH Access:TCP 22 (SSH)
- Eth Explorer:TCP 80 (HTTP)
- Eth Stats:TCP 8080 (HTTP Alternative)
- JSON RPC:TCP 8545 (Geth)
EC2 -> ネットワーク&セキュリティ -> セキュリティグループ と進み、セキュリティグループの作成をクリックします。セキュリティグループ名と説明を入力してください。
インバウンドのルールを設定します。
作成をクリックするとセキュリティグループが作成されます。
スタックの作成
下ごしらえは完了です。ここから『CloudFormation』を使用して環境構築を行います。
EC2キーペア、プロファイルおよびセキュリティグループを作成したリージョンの『CloudFormation』のテンプレを起動します(ここではオハイオ)。以下のリンクをクリックすることでテンプレの起動が可能です。このテンプレはすべてYAMLで書かれています。
スタックの名前に任意の名前を入力します。各パラメータを入力していきますが、基本的にはデフォルトのままで問題ありません。変更や選択する必要のあるところだけ示していきます。
Container Platformの項目はdocker-localを選択してください。EC2 configurationは各項目とも手順の中で用意したものを入力します。
VPNはリージョンのデフォルトVPCを使用しました。サブネットはパブリックなものを選択し、IPアドレスやDNSも自動割り当ての設定のままです。
docker-localでの構築なのですが、ECS cluster configurationとApplication Load Balancer configuration (ECS only)の項目を埋めないと進めることができません。テンプレの作りの問題です。以下のように埋めて進みました。
スタックの作成が成功しました。
Eth Explorer/Eth Statsの確認
スタックの作成でEC2インスタンスが作成され、インスタンス上のDockerコンテナで各サービスが動き始めます。パブリックサブネットでEC2インスタンスを起動しているはずですのでEC2インスタンスのFQDNかIPアドレスをブラウザへ入力しましょう。
Eth Explorerの画面が表示されるはずです。
http://ec2-X-X-X-X.us-east-2.compute.amazonaws.com
同じFQDNもしくはIPアドレスへポート8080を指定してアクセスするとEth Statsの画面が確認できます。
http://ec2-X-X-X-X.us-east-2.compute.amazonaws.com:8080
JSON RPCはポート番号8545で開けていますので、ローカルやリモートの開発環境(truffleなど)からこのEC2インスタンスで稼働しているEthereum環境へデプロイすることができます。
EC2にSSHでリモートログインしてみます。 docker ps -a
コマンドで各イメージが動作していることを確認できます。
[ec2-user@ip-X-X-X-X ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3aaae3e64818 763976151875.dkr.ecr.us-east-2.amazonaws.com/eth-explorer:v1 "npm start" 27 minutes ago Up 27 minutes 0.0.0.0:8080->8080/tcp pensive_lamarrab8d2a5102c8 763976151875.dkr.ecr.us-east-2.amazonaws.com/eth-netstats:v1 "npm start" 27 minutes ago Up 27 minutes 0.0.0.0:80->80/tcp mystifying_roentgenaf94e23ec243 763976151875.dkr.ecr.us-east-2.amazonaws.com/client-go:v1 "/usr/bin/node /opt/・ 27 minutes ago Up 27 minutes priceless_borg
以上です。
まとめ
- Amazon Managed BlockchainではEthereumがまだサポートされていない
- 『AWS Blockchain Templates』はYAMLで記述されたCloudFormationのテンプレートで起動するだけで簡単に使用できる
- 『AWS Blockchain Templates』を使用すると2つのパターン(Amazon ECSコンテナプラットフォームとdocker-localプラットフォーム)のEthereum環境が構築できる