AWS Blockchain TemplatesでHyperledger Fabric基盤を構築する

Hyperledger FabricをAWS上にBlockchainTemplateを使って構築する。
バージョンは1.0を利用。

## 概要
BlockchainTemplateはCloudFormationのテンプレートの1つ。
Hyperledger Fabric用のBlockchainTemplateを使うと、
サブネット上にEC2インスタンスを作成してその中に分散ノードが構築される。
利用時には、構築する環境の指定とインスタンス作成に必要なものを渡すだけでよい。

## 事前準備
BlockchainTemplateを利用するために以下の環境準備が必要。
※パブリックサブネットはNATゲートウェイへのルーティングがあるプライベートサブネットでも可。

- VPC
- インターネットゲートウェイ
- パブリックサブネット

BlockchainTemplateでのインスタンス作成のため、以下の用意が必要。

- EC2キーペア
- セキュリティグループ
- IAMロール

#### VPC
BlockchainTemplateを利用できるリージョンで作成する。
CIDR blockは任意の値。
![000.png](https://qiita-image-store.s3.amazonaws.com/0/242897/db6de9c8-dc40-8d82-7db7-63cc9caf5b00.png)
DNS hostnamesは有効にする。
ネットワークACLはデフォルト。（全てのトラフィックに制限なし）
![033.png](https://qiita-image-store.s3.amazonaws.com/0/242897/b4511fd4-1155-c215-272d-0270414d7142.png)


#### インターネットゲートウェイ
作成後、VPCにアタッチする。
![019.png](https://qiita-image-store.s3.amazonaws.com/0/242897/3ed55177-f818-6e28-8447-b8f357aaeed3.png)
VPCからルートテーブルを選択し、作成したインターネットゲートウェイをルーティングに追加する。
![034.png](https://qiita-image-store.s3.amazonaws.com/0/242897/eee8e9e6-56c6-5355-562b-f325cad5ac1d.png)
![035.png](https://qiita-image-store.s3.amazonaws.com/0/242897/1381cf18-5ac4-d97a-0e37-4a75a7ec823a.png)

#### パブリックサブネット
インターネットゲートウェイへのルーティングのあるメインルートテーブルを利用。
外部との通信ができない設定の場合、基盤構築時にエラーとなる。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/242897/b34112cd-d915-6e3d-58bd-009e4f799352.png)

#### EC2キーペア
作成したインスタンスにSSH接続する場合は、作成後にダウンロードできる鍵が必要になる。
今回はSSH接続を行わないので、作成してパラメータとして指定するのみ。
![007.png](https://qiita-image-store.s3.amazonaws.com/0/242897/3f316483-5434-0222-3283-5255933f913d.png)


#### セキュリティグループ
構築することが目的なので、とりあえずすべてのトラフィックを許可。
※説明の入力も必要。
![008.png](https://qiita-image-store.s3.amazonaws.com/0/242897/55a8c5e8-c890-3cb8-c856-f0c501b562bc.png)
![009.png](https://qiita-image-store.s3.amazonaws.com/0/242897/74622fb0-2577-de5b-093f-c45ca71cde76.png)

#### IAMロール
「AmazonEC2ContainerRegistryReadOnly」「AmazonS3ReadOnlyAccess」を指定する。
「SSHAmazonEC2RoleforSSM」は基盤構築に無関係のポリシー。
作成したインスタンスにSSH接続する場合、SSHAmazonEC2RoleforSSMは不要。
![011.png](https://qiita-image-store.s3.amazonaws.com/0/242897/ec3176ee-5756-6e50-0395-5d41e0293007.png)
![022.png](https://qiita-image-store.s3.amazonaws.com/0/242897/53e3271f-0a48-2c43-210c-ba4ad81663dd.png)

## 基盤構築
以下のURLにある起動へのリンクからCloudFormationを起動する。
https://docs.aws.amazon.com/ja_jp/blockchain-templates/latest/developerguide/blockchain-templates-hyperledger.html
今回はVPCを作成した「米国東部 (オハイオ) リージョン (us-east-2) で起動」を選択。

スタックの名前は任意。
![027.png](https://qiita-image-store.s3.amazonaws.com/0/242897/c66b6691-595a-e303-8863-4e79e9ef029f.png)
デフォルト値そのまま。
![028.png](https://qiita-image-store.s3.amazonaws.com/0/242897/43c3f00a-8e8c-db3f-6547-7000790177f9.png)
作成したVPC、サブネット等を指定。
インスタンスプロファイル ARNはIAMロールから参照できる。
![029.png](https://qiita-image-store.s3.amazonaws.com/0/242897/42aeae0a-5f60-6f9d-e2ec-791570e8e002.png)
デフォルトはt2.mediumだが、他種類も指定可能。
![030.png](https://qiita-image-store.s3.amazonaws.com/0/242897/76baabaa-5ebe-8567-c9b7-c70e55d199e4.png)
5分ほどで「CREATE_COMPLETE」となる。
※失敗の場合はロールバックされる。
![036.png](https://qiita-image-store.s3.amazonaws.com/0/242897/5324e032-b9e5-8cd3-4ae2-dafc4af84589.png)
![037.png](https://qiita-image-store.s3.amazonaws.com/0/242897/ff448180-d060-7df0-dbe1-ac0f29279f64.png)

## 構築確認
SSMのセッションマネージャーを利用してインスタンスにログインする。
※IAMロールにAmazonEC2RoleforSSMを追加していること。
SSH接続でインスタンスにログインでも可。

#### エンドポイント作成
SSM用のエンドポイントを作成する。
![031.png](https://qiita-image-store.s3.amazonaws.com/0/242897/462993eb-dd10-2620-25ea-50b9e88e3a48.png)
作成したVPCとサブネットを指定。
![038.png](https://qiita-image-store.s3.amazonaws.com/0/242897/82d44de8-f934-0026-a14c-9d5cb0274e50.png)
セキュリティグループはEC2と同じもの（制限なし）とする。
![032.png](https://qiita-image-store.s3.amazonaws.com/0/242897/d02ca9f1-29db-0ef0-6524-2bfb3fd96119.png)

#### セッションログイン
SSMセッションマネージャーから基盤構築したインスタンスのセッション開始。
![023.png](https://qiita-image-store.s3.amazonaws.com/0/242897/8467dc38-5c73-4a2d-c74f-22dce4ef4b72.png)

以下、コマンドでノードが3つ、ordererが起動していることが分かる。

```
sudo docker ps
```
![024.png](https://qiita-image-store.s3.amazonaws.com/0/242897/5a3457b2-2b4f-234f-2e23-47bb3cddf504.png)

#### ログ確認（おまけ）
セッションマネージャーの設定でCloudWatchにコマンドログを出力する。
![025.png](https://qiita-image-store.s3.amazonaws.com/0/242897/f685bd7c-8f58-0490-1ea7-d63796568b0c.png)
![026.png](https://qiita-image-store.s3.amazonaws.com/0/242897/7644e4f7-8c3d-0fa9-bc52-99ed7eb4f114.png)

#### HYPERLEDGER EXPLORER
インスタンスのパブリックDSNのポート8080にアクセスする。

```
http://（パブリックDSN）:8080/
```
ブロックの高さやノードを見ることができる。
![039.png](https://qiita-image-store.s3.amazonaws.com/0/242897/1684fffa-46a6-4a5e-7bce-dbd88493200c.png)

## おわりに
・基盤構築はできたが、チェーンコードの実行はできていない。
・1つのインスタンスの中に3つのノードを立てていて、リージョン、ネットワーク、サーバーが全て同じ環境。

セキュリティを担保しつつ、ノードを作成することは容易にできるものの、
選択できるHyperledger Fabricのバージョンが「v1」しかなく、構成的にノードが分散されていないことから
可用性や冗長性を確認するようなPoCには利用しにくいと思われる。


## 参考
https://docs.aws.amazon.com/ja_jp/blockchain-templates/latest/developerguide/blockchain-templates-hyperledger.html
https://medium.com/coinmonks/get-started-with-blockchain-using-the-aws-hyperledger-fabric-template-an-unofficial-guide-551bc46af710