Hyperledger Fabric in Amazon Managed Blockchain Part 1 ~プレビュー版~

Yuya Sugano
20 min readJan 13, 2019

--

IBM Bluemixから提供されているBlockchainサービスはお手軽簡単で良いのですが、昨年末にAWSでもブロックチェーンサービスがリリースされたので試してみました。プレビュー版としてHyperledger Fabricのみ利用可能となっています。他のAWSコンポーネントと容易に組み合わせられると思いますので、AWSユーザの方には嬉しいサービスですね。FirehoseでリアルタイムなIoTデータをブロックチェーンに書き込むなど、様々なユースケースを実現できそうです。

Amazon Managed Blockchain

Part 1では以下のようにブロックチェーンの準備からFabric CAおよびFabric CLIの起動まで書いてみたいと思います。

  • AWS Managed Blockchain概要
  • AWS Managed Blockchainプレビュー版申請
  • ブロックチェーンネットワーク作成
  • エンドポイント作成
  • Fabric CAクライアントのセットアップ
  • Dockekr-composeでFabric CLIを起動

AWS Managed Blockchain概要

Hyperledger FabricもしくはEthereumのマネージドネットワークサービスで、AWS CLIやマネージドコンソールから簡単にブロックチェーンが作成できるサービスです。

Amazon Managed Blockchain is a fully managed service for creating and managing blockchain networks usingHyperledger Fabric and Ethereum open source frameworks (only Hyperledger Fabric is available during preview). Blockchain allows you to build applications where multiple parties can securely and transparently run transactions and share data without the need for a trusted, central authority.

数百万のトランザクションを処理する数千のアプリケーションまでスケールアウト可能なブロックチェーンをデプロイし、メトリックやネットワークトランザクションの情報をイミュータブルなAmazon QLDBに保存することで様々な分析も提供可能だそうです。以下、公式サイトにある利用の流れ通りにテストしてみました。[1]

Amazon Managed Blockchain is a fully managed service that allows you to set up and manage a scalable blockchain network with just a few clicks. Amazon Managed Blockchain eliminates the overhead required to create the network, and automatically scales to meet the demands of thousands of applications running millions of transactions.

Amazon Managed Blokchain How it works

参考までに公式サイトに掲載されている価格情報です。[2]

Amazon Managed Blockchain pricing

最小のbc.t3.smallでメンバー2人、20GiBのストレージに時間あたり9MBのデータ書き込みのトランザクションがある状況で1時間 $0.676になります。

AWS Managed Blockchainプレビュー版申請

プレビュー版の利用にはAWSからフォームのサブミットおよび申請を待つ必要があります(数日程度で承認あり)。既にAWSアカウントを持っている場合は、AWS Account ID(数字12桁)も含めAWSコンソールのアカウントメニューから入力に必要な情報が確認できます。

申請が承認されると以下のようなメールが届きます。

Preview applicant e-mail

ブロックチェーンネットワーク作成

公式サイトのチュートリアルを参考にしつつ進めました。[3]

Amazon Managed Blockchain Top

AWSコンソールからAmazon Managed Blockchainへ移動すると上記のトップ画面へ遷移するので『Create a network』をクリック、Hyperledger Fabric 1.2を選択してNetwork nameを入力します(ここではMyTestNetwork)。

Amazon Managed BlockchainではCA(Certificate Authority)を作成して、他のメンバー認証を行います。最初のメンバー名とFabric CA管理者のユーザ名およびパスワードを設定します。

Member and Admin

Nextで次へ進むと設定の確認画面が出てきますので、問題なければ『Create network and member』をクリックしてブロックチェーンの作成を開始します。ブロックチェーンの作成には20分ぐらいかかりました。

Created Network

エンドポイント作成

インターフェースVPCエンドポイント(AWS Private Link)を作成して、Fabric CAクライアント(EC2でサーバを設定する)からHyperledger Fabricで作成したブロックチェーンへ接続できるようにします。『Create VPC endpoint』をクリックして、VPC/Subnets/Security groupsを選択します。Fabric CAクライアントとして使用するEC2が属するSubnetsおよびSecurity groupsを設定します。

Create VPC endpoint

『Create』をクリックするとインターフェースVPCエンドポイントが作成されます。VPC endpoint service nameが設定されます。

VPC endpoint created

Fabric CAクライアントのセットアップ

Fabric CAクライアント用のEC2を準備して必要となるパッケージ類をインストールします。AMIはAmazon Linux 2を選択してみました。

Amazon Linux 2 AMI
[ec2-user@ip-X-X-X-X ~]$ sudo yum update -y
[ec2-user@ip-X-X-X-X ~]$ sudo yum install -y telnet
[ec2-user@ip-X-X-X-X ~]$ sudo yum -y install emacs
[ec2-user@ip-X-X-X-X ~]$ sudo yum install -y docker
[ec2-user@ip-X-X-X-X ~]$ sudo service docker start
[ec2-user@ip-X-X-X-X ~]$ sudo usermod -a -G docker ec2-user

usermodコマンドを反映させるために一度ログアウトして再度ログインしてください。以下でDocker Composeをインストールします。

[ec2-user@ip-X-X-X-X ~]$ sudo curl -L \ https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname \ -s`-`uname -m` -o /usr/local/bin/docker-compose 
[ec2-user@ip-X-X-X-X ~]$ sudo chmod a+x /usr/local/bin/docker-compose
[ec2-user@ip-X-X-X-X ~]$ sudo yum install libtool -y

次にgolangをインストールします。

[ec2-user@ip-X-X-X-X ~]$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
[ec2-user@ip-X-X-X-X ~]$ tar -xzf go1.10.3.linux-amd64.tar.gz
[ec2-user@ip-X-X-X-X ~]$ sudo mv go /usr/local
[ec2-user@ip-X-X-X-X ~]$ sudo yum install libtool-ltdl-devel -y
[ec2-user@ip-X-X-X-X ~]$ sudo yum install git -y

.bash_profileを以下のように編集し、source .bash_profileコマンドで環境変数を反映させます。

# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programsPATH=$PATH:$HOME/.local/bin:$HOME/bin# GOROOT is the location where Go package is installed on your system
export GOROOT=/usr/local/go
# GOPATH is the location of your work directory
export GOPATH=$HOME/go
# Update PATH so that you can access the go binary system wide
export PATH=$GOROOT/bin:$PATH
export PATH=$PATH:/home/ec2-user/go/src/github.com/hyperledger/fabric-ca/bin
export PATH

それぞれ以下のバージョン要件を満たしていることを確認してください。

  • Docker–17.06.2-ce or later(sudo docker versionで確認)
  • Docker-compose–1.14.0 or later(sudo /usr/local/bin/docker-compose versionで確認)
  • Go–1.10.x(go versionで確認)

aws-cliでmanagedblockchainコマンドを使用できるようにしてから、作成したネットワークのCA Endpointを確認します。

[ec2-user@ip-X-X-X-X ~]$ aws s3 cp s3://us-east-1.managedblockchain-preview/etc/service-2.json .
[ec2-user@ip-X-X-X-X ~]$ aws configure add-model --service-model file://service-2.json
[ec2-user@ip-X-X-X-X ~]$ aws managedblockchain get-member --network-id <YOUR NETWORK ID> --member-id <YOUR MEMBER ID>
...
{
"Member": {
"NetworkId": "<YOUR NETWORK ID>",
"Status": "ACTIVE",
"Name": "test",
"FrameworkAttributes": {
"Fabric": {
"AdminUsername": "admin",
"CaEndpoint": "ca.<YOUR MEMBER ID>.<YOUR NETWORK ID>.managedblockchain.us-east-1.amazonaws.com:30002"
}
},
"StatusReason": "Network member created successfully",
"CreationDate": 1547271800.67,
"Id": "<YOUR MEMBER ID>"
}
}

Fabric CAクライアントであるEC2側からCA Endpointへ接続できるか確認します。事前にVPC側でVPCエンドポイントサービス名を用いたエンドポイントの作成が必要になります。JSONが返ってくれば成功です。

[ec2-user@ip-X-X-X-X ~]$ curl https://ca.<YOUR MEMBER ID>.<YOUR NETWORK ID>.managedblockchain.us-east-1.amazonaws.com:30002/cainfo -k
{"result":{"CAName":"<YOUR CA>","CAChain":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvakNDQWttZ0F3SUJBZ0lVR1g5OWJyYjhkUjF2ekY0SGNUeEdsQ05JTFYwd0NnWUlLb1pJemowRUF3SXcKZ2EweEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BYWVhOb2FXNW5kRzl1TVJBd0RnWURWUVFIRXdkVApaV0YwZEd4bE1TSXdJQVlEVlFRS0V4bEJiV0Y2YjI0Z1YyVmlJRk5sY25acFkyVnpMQ0JKYm1NdU1TSXdJQVlEClZRUUxFeGxCYldGNmIyNGdUV0Z1WVdkbFpDQkNiRzlqYTJOb1lXbHVNUzh3TFFZRFZRUURFeVowWlhOMElFRnQKWVhwdmJpQk5ZVzVoWjJWa0lFSnNiMk5yWTJoaGFXNGdVbTl2ZENCRFFUQWVGdzB4T1RBeE1USXdOVFUwTURCYQpGdzB6TkRBeE1EZ3dOVFUwTURCYU1JR3RNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1YyRnphR2x1ClozUnZiakVRTUE0R0ExVUVCeE1IVTJWaGRIUnNaVEVpTUNBR0ExVUVDaE1aUVcxaGVtOXVJRmRsWWlCVFpYSjIKYVdObGN5d2dTVzVqTGpFaU1DQUdBMVVFQ3hNWlFXMWhlbTl1SUUxaGJtRm5aV1FnUW14dlkydGphR0ZwYmpFdgpNQzBHQTFVRUF4TW1kR1Z6ZENCQmJXRjZiMjRnVFdGdVlXZGxaQ0JDYkc5amEyTm9ZV2x1SUZKdmIzUWdRMEV3CldUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFSczlvbkZLT1p5blczVUZkS2l0S1NYR1NrdkNHc3IKQS80aU1lYytQSkZKOEVsbWg3cWVMSHAxeEVEV3B0ZldjOG1RcDJ2YkZ2enVkc202b1NGTnZiUStvMFV3UXpBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFUQWRCZ05WSFE0RUZnUVVXeThTClMzMXgwajJ3VlVCZ216ZDZQeEJySThnd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ1dnN2lLNHhqY0RKeVZ2M1kKUUpodGJnV3NwM0JFUVdWb1FNK1JvWGdOaWtjQ0lFZ3lXdldNaGRqZ1o0ek5hZFE1TXM5dldJcU1CYjBXWFVoOQptcWZ4bVVhawotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","Version":"1.2.1-snapshot-"}
,"errors":[],"messages":[],"success":true}

CAへの接続にTCP 30002のポートを使用しているためセキュリティグループへルールを追加しておく必要があります。

Default security-group

Hyperledger Fabric CAクライアントの設定をします。

[ec2-user@ip-X-X-X-X ~]$ go get -u github.com/hyperledger/fabric-ca/cmd/...
[ec2-user@ip-X-X-X-X ~]$ cd /home/ec2-user/go/src/github.com/hyperledger/fabric-ca
[ec2-user@ip-X-X-X-X ~]$ git fetch
[ec2-user@ip-X-X-X-X ~]$ git checkout release-1.2
[ec2-user@ip-X-X-X-X ~]$ make fabric-ca-client
[ec2-user@ip-X-X-X-X ~]$ cd /home/ec2-user
[ec2-user@ip-X-X-X-X ~]$ git clone https://github.com/hyperledger/fabric-samples.git

Dockekr-composeでFabric CLIを起動

/home/ec2-userディレクトリでdocker-compose-cli.yamlという名前のファイルを作成し、以下の設定を投入してください。Fabric CLIはメンバーが保持するピアノードとのやり取りに必要になります。

version: '2'
services:
cli:
container_name: cli
image: hyperledger/fabric-tools:1.2.0
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=info # Set logging level to debug for more verbose logging
- CORE_PEER_ID=cli
- CORE_CHAINCODE_KEEPALIVE=10
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- /home/ec2-user/fabric-samples/chaincode:/opt/gopath/src/github.com/
- /home/ec2-user:/opt/home

以下のようにしてFabric CLIを起動し、Dockerが動いていることを確認します。

[ec2-user@ip-X-X-X-X ~]$ docker-compose -f docker-compose-cli.yaml up -d
Creating network "ec2user_default" with the default driver
Pulling cli (hyperledger/fabric-tools:1.2.0)...
1.2.0: Pulling from hyperledger/fabric-tools
b234f539f7a1: Pull complete
55172d420b43: Pull complete
5ba5bbeb6b91: Pull complete
43ae2841ad7a: Pull complete
f6c9c6de4190: Pull complete
c6af77e36488: Pull complete
964f7f4f22f3: Pull complete
13cd31405e09: Pull complete
e03b35c19d96: Pull complete
96c2920985e3: Pull complete
e91461be8304: Pull complete
314928def9dd: Pull complete
d5b68ae13f8d: Pull complete
dde25187799d: Pull complete
Digest: sha256:24cca44a2f2ab6325c6ccc1c91a10bd3e0e71764037a85a473f7e9621b3a0f91
Status: Downloaded newer image for hyperledger/fabric-tools:1.2.0
Creating cli ... done
...
[ec2-user@ip-X-X-X-X ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb9ac0c8ea3c hyperledger/fabric-tools:1.2.0 "/bin/bash" 12 minutes ago Up 12 minutes cli
[ec2-user@ip-X-X-X-X- ~]$ docker exec -it bb9ac0c8ea3c /bin/bash
root@bb9ac0c8ea3c:/opt/gopath/src/github.com/hyperledger/fabric/peer#
root@bb9ac0c8ea3c:/opt/gopath/src/github.com/hyperledger/fabric/peer# go version
go version go1.10 linux/amd64

まとめ

  • Amazon Managed BlockchainではHyperledger FabricおよびEthereumのブロックチェーンを作成することができるようになる
  • プレビュー版ではHyperledger Fabricのみの提供である
  • EC2上にFabric CAクライアントを用意し、ピアノードとのやり取りに必要となるFabric CLIを起動する必要がある

References

--

--

Yuya Sugano
Yuya Sugano

Written by Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。

No responses yet