8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Hyperledger Fabric] Amazon Managed Blockchain使ってみる

Last updated at Posted at 2019-06-13

#概要
Amazon Managed Blockchainを使ってHyperledger Fabricのネットワークをデプロイしてみる

#料金
ここをみると予算が組める
https://aws.amazon.com/jp/managed-blockchain/pricing/

#ネットワークの作成
https://aws.amazon.com/jp/blogs/news/new-amazon-managed-blockchain-create-manage-scalable-blockchain-networks/

上の記事の手順にしたがってネットワークの作成, メンバーの追加, VPCエンドポイントの作成を行います.

Create a Networkを押します
スクリーンショット 2019-06-12 17.28.32.png

スクリーンショット 2019-06-12 17.28.47.png スクリーンショット 2019-06-12 17.29.28.png

以上のように入力してNextを押します

スクリーンショット 2019-06-12 17.32.57.png スクリーンショット 2019-06-12 17.33.04.png

最初のメンバーとCAの管理者, パスワードを入力してNext
管理者の名前とパスワードはメモしておきましょう

スクリーンショット 2019-06-12 17.33.14.png

確認してCreate network and memberを押します

スクリーンショット 2019-06-12 17.39.22.png

StatusがActiveになるまで待ちます

#VPCエンドポイントの作成
###インターフェイスVPCエンドポイント(AWS PrivateLink)の作成

メンバー用にインターフェイスVPCエンドポイントを作成します。これによりHyperledger Fabricクライアントとして使用するEC2インスタンスがAmazon Managed Blockchainがメンバーおよびネットワークリソースに対して公開するHyperledger Fabricエンドポイントと対話することができます。

DetailsのCreate VPC endpointを押します
簡単化のためにここではAmazon Managed Blockchainのコンソールから作成します
スクリーンショット 2019-06-13 13.41.03.png

ここで使うVPCとセキュリティグループはメモしておきましょう

#Amazon EC2インスタンスを作成してHyperledger Fabric Clientをセットアップする

###EC2インスタンスの作成
EC2インスタンスは次の要件を満たすようにします
・上で作成したVPCエンドポイントと同じセキュリティグループを使用する
・セキュリティグループのメンバー間の全てのインバウンドトラフィックとアウトバウンドトラフィックを許可する
・SSHを使用して接続できるようにする

  1. https://console.aws.amazon.com/ec2/ をクリックします
  2. ネットワーク&セキュリティのキーペアをクリックします
  3. キーペアの作成をクリックします(ここで作成するキーペアはEC2インスタンスと同じリージョンにしましょう)
  4. 作成された.pemファイルは~/.sshディレクトリに移動しておきましょう
  5. EC2ダッシュボードに戻ってインスタンスの作成をクリックします
スクリーンショット 2019-06-13 14.02.01.png 一番上のを選択 スクリーンショット 2019-06-13 14.02.18.png t2.microを選択 スクリーンショット 2019-06-13 14.08.15.png セキュリティグループの編集をクリック スクリーンショット 2019-06-13 14.11.11.png

VPCエンドポイントと同じセキュリティグループを選んで確認と作成をクリック
そして起動します

スクリーンショット 2019-06-13 14.13.22.png

先程作成したキーペアを選択し、インスタンスを作成しましょう

インスタンが作成できたらSSH接続します、が、セキュリティグループを編集します

セキュリティグループをクリックし、インバウンドタブを選択、編集をクリックし以下のように編集します

スクリーンショット 2019-06-13 16.50.16.png

これでSSH接続できるようになったので接続しましょう

$ ssh -i ~/.ssh/<pem file> ec2-user@<パブリックDNS>

###パッケージのインストール

[ec2-user@ip-hoge ~]$ sudo yum update -y
[ec2-user@ip-hoge ~]$ sudo yum install -y telnet
[ec2-user@ip-hoge ~]$ sudo yum -y install emacs
[ec2-user@ip-hoge ~]$ sudo yum install -y docker
[ec2-user@ip-hoge ~]$ sudo service docker start
[ec2-user@ip-hoge ~]$ sudo usermod -a -G docker ec2-user

usermodコマンドを有効にするためにログアウトして再度ログインします

Docker Composeをインストールします

[ec2-user@ip-hoge ~]$ 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-hoge ~]$ sudo chmod a+x /usr/local/bin/docker-compose
[ec2-user@ip-hoge ~]$ sudo yum install libtool -y

golangをインストールします

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

bash_profileは以下のように編集します

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$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

更新したら変更を適用します

[ec2-user@ip-hoge ~]$ source ~/.bash_profile 

正しいバージョンがインストールされているか確認しましょう
・Docker - 17.06.2-ce以降
・Docker-compose – 1.14.0以降
・Go 1.10.x

#Dockerバージョン確認
[ec2-user@ip-hoge ~]$ sudo docker version
#Docker Composeバージョン確認
[ec2-user@ip-hoge ~]$ sudo /usr/local/bin/docker-compose version
#goのバージョン確認
[ec2-user@ip-hoge ~]$ go version

###Hyperledger Fabric CAクライアントを設定する
この手順では[VPCエンドポイントの作成]で作成したVPCエンドポイントを使用してHyperledger Fabric CAに接続できることを確認します。その後、Hyperledger Fabric CAクライアントをインストールします。

まずaws cliをアップデートします

[ec2-user@ip-hoge ~]$ sudo pip install awscli --upgrade

[参考]sudo pipができなかったのでpipをインストールした後に私はこれらを実行しました

[ec2-user@ip-hoge ~]$ pip install -U pip
[ec2-user@ip-hoge ~]$ sudo yum install python-pip

Hyperledger Fabric CAへの接続を確認するにはCAエンドポイントが必要です。次のようにしてCAエンドポイントを取得します。--network-id--menber-idを[ネットワークの作成]で作った自分のものに置き換えます。

[ec2-user@ip-hoge ~]$ aws managedblockchain get-member \
--network-id n-BGGOTBDZBFGGJMXLFOQXBFJYRU \
--member-id m-PF4J2E3DLZBQBNPDLFGH552ZJA

こんな感じで返ってきます

{
    "Member": {
        "NetworkId": "n-BGGOTBDZBFGGJMXLFOQXBFJYRU",
        "Status": "AVAILABLE",
        "Description": "First Member",
        "FrameworkAttributes": {
            "Fabric": {
                "AdminUsername": "root",
                "CaEndpoint": "ca.m-pf4j2e3dlzbqbnpdlfgh552zja.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30002"
            }
        },
        "CreationDate": "2019-06-12T08:38:42.244Z",
        "Id": "m-PF4J2E3DLZBQBNPDLFGH552ZJA",
        "Name": "melon"
    }
}

エンドポイントが解決されたことを確認します

[ec2-user@ip-hoge ~]$ curl https://CAEndpoint/cainfo -k

こんな感じで返ってきます

{"result":{"CAName":"m-PF4J2E3DLZBQBNPDLFGH552ZJA","CAChain":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWt1Z0F3SUJBZ0lVRXpUYnIrS3.....

Hyperledger Fabric CAに接続できることを確認したので、次のコマンドを実行してCAクライアントを構成します

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

###サンプルレポジトリを複製する

[ec2-user@ip-hoge ~]$ cd /home/ec2-user
[ec2-user@ip-hoge ~]$ git clone https://github.com/hyperledger/fabric-samples.git

###Hyperledger Fabric CLIを起動するためのDocker Composeの設定と実行

[ec2-user@ip-hoge ~]$ touch docker-compose-cli.yaml
[ec2-user@ip-hoge ~]$ vim docker-compose-cli.yaml

以下のように編集します

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

次のコマンドを実行してHyperledger Fabric peer CLIコンテナを起動します

[ec2-user@ip-hoge ~]$ docker-compose -f docker-compose-cli.yaml up -d

#管理ユーザーを登録する
証明書を使用して、メンバーの認証局(CA)に対する管理権限をもつユーザーを登録する。
###証明書ファイルの作成
次のコマンドでmanagedblockchain-tls-chain.pem/home/ec2-userにコピーします

[ec2-user@ip-hoge ~]$ aws s3 cp s3://us-east-1.managedblockchain/etc/managedblockchain-tls-chain.pem  /home/ec2-user/managedblockchain-tls-chain.pem

正しくコピーされたことをテストします

[ec2-user@ip-hoge ~]$ openssl x509 -noout -text -in /home/ec2-user/managedblockchain-tls-chain.pem

###管理ユーザーを作成する
さっきも実行したこのコマンドを実行してCaEndpointを取得します
--network-id--member-idは自分のものに置き換えてください

[ec2-user@ip-hoge ~]$ aws managedblockchain get-member \
--network-id n-BGGOTBDZBFGGJMXLFOQXBFJYRU \
--member-id m-PF4J2E3DLZBQBNPDLFGH552ZJA

CAEndpoint、管理者の名前とパスワード、および証明書ファイルを使用して管理者メンバーを登録します

[ec2-user@ip-hoge ~]$ fabric-ca-client enroll \
-u https://AdminUsername:AdminPassword@SampleCAEndpointAndPort \
--tls.certfiles /home/ec2-user/managedblockchain-tls-chain.pem -M /home/ec2-user/admin-msp

こんな感じで返ってきます

2019/06/13 09:02:06 [INFO] Created a default configuration file at /home/ec2-user/.fabric-ca-client/fabric-ca-client-config.yaml
2019/06/13 09:02:06 [INFO] TLS Enabled
2019/06/13 09:02:06 [INFO] generating key: &{A:ecdsa S:256}
2019/06/13 09:02:06 [INFO] encoded CSR
2019/06/13 09:02:07 [INFO] Stored client certificate at /home/ec2-user/admin-msp/signcerts/cert.pem
2019/06/13 09:02:07 [INFO] Stored root CA certificate at /home/ec2-user/admin-msp/cacerts/ca-m-pf4j2e3dlzbqbnpdlfgh552zja-n-bggotbdzbfggjmxlfoqxbfjyru-managedblockchain-us-east-1-amazonaws-com-30002.pem

###MSPの証明書をコピーします
Hyperledger Fabricでは Membership Service Provider (MSP)がどのルートCAと中間CAが信頼ドメインのメンバーを定義するために信頼されているかを識別します。

このチュートリアルでは/home/ec2-user/admin-mspに証明書があります。このMSPは管理者メンバー用なので次のようにadmincertsにコピーします。

[ec2-user@ip-hoge ~]$ cp -r admin-msp/signcerts admin-msp/admincerts

#メンバーシップにピアノードを作成する

  1. https://console.aws.amazon.com/managedblockchain/ でManaged Blockchainコンソールを開きます。
  2. ネットワークを選択した後にメンバーを選択してCreate peer nodeをクリックします。
スクリーンショット 2019-06-13 18.25.47.png

こんな感じで作ります

#チャンネルの作成
Hyperledger Fabricでは元帳はチャネルの範囲内に存在します。すべてのメンバーが共通のチャネルで動作している場合は、元帳をネットワーク全体で共有できます。特定の参加者のセットのみを含めるようにチャネルを民営化することもできます。

ここでは基本のチャネルを設定します。

###Hyperledgerファブリックチャネル作成用のconfigtxの作成
configtx.yamlファイルにはチャネル構成の詳細が含まれています。詳細についてはこちらをみてください。

[ec2-user@ip-hoge ~]$ touch configtx.yaml
[ec2-user@ip-hoge ~]$ vim configtx.yaml

以下のように編集します
MemberIDは自分のものに変えてください

################################################################################
#
#   Section: Organizations
#
#   - This section defines the different organizational identities which will
#   be referenced later in the configuration.
#
################################################################################
Organizations:
    - &Org1
            # DefaultOrg defines the organization which is used in the sampleconfig
            # of the fabric.git development environment
        Name: MemberID
            # ID to load the MSP definition as
        ID: MemberId
        MSPDir: /opt/home/admin-msp
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context    
        AnchorPeers:    
            - Host: 
              Port:    

################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults
        # Organizations is the list of orgs which are defined as participants on
        # the application side of the network
    Organizations:

################################################################################
#
#   Profile
#
#   - Different configuration profiles may be encoded here to be specified
#   as parameters to the configtxgen tool
#
################################################################################
Profiles:
    OneOrgChannel:
        Consortium: AWSSystemConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1

次のコマンドを実行してconfigtx peer blockを作成します

[ec2-user@ip-hoge ~]$ docker exec cli configtxgen \
-outputCreateChannelTx /opt/home/mychannel.pb \
-profile OneOrgChannel -channelID mychannel \
--configPath /opt/home/

###環境変数の設定
MemberIDは自分のを入れましょう
OrdieringServiceEndpointはawsのコンソールでネットワークのDetailをみて確認します
PeerEndpointはawsのコンソールでPeer NodeのDetailsをみて確認します

[ec2-user@ip-hoge ~]$ export MSP_PATH=/opt/home/admin-msp
[ec2-user@ip-hoge ~]$ export MSP=MemberID
[ec2-user@ip-hoge ~]$ export ORDERER=OrderingServiceEndpoint
[ec2-user@ip-hoge ~]$ export PEER=PeerEndpoint

私の場合はこんな感じです

[ec2-user@ip-hoge ~]$ export MSP_PATH=/opt/home/admin-msp
[ec2-user@ip-hoge ~]$ export MSP=m-PF4J2E3DLZBQBNPDLFGH552ZJA
[ec2-user@ip-hoge ~]$ export ORDERER=orderer.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30001
[ec2-user@ip-hoge ~]$ export PEER=nd-symdsmwzynbozjzsuyoqatcxla.m-pf4j2e3dlzbqbnpdlfgh552zja.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30005

変更を反映します

[ec2-user@ip-hoge ~]$ source ~/.bash_profile

###チャンネルを作成する

設定した環境変数と作成したconfigtx peer blockを使用してチャンネルを作成します

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer channel create -c mychannel \
-f /opt/home/mychannel.pb -o $ORDERER \
--cafile /opt/home/managedblockchain-tls-chain.pem --tls

###あなたのピアノードをチャンネルに参加させる

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer channel join -b mychannel.block \
-o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls

#Chaincodeをインストールして実行する
###Chaincodeをインストールする
サンプルのチェーンコードをピアノードにインストールします

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
-e "CORE_PEER_ADDRESS=$PEER" \
cli peer chaincode install \
-n mycc -v v0 -p github.com/chaincode_example02/go

###チェーンコードのインスタンス化
チェーンコードをインスタンス化します

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
-e "CORE_PEER_ADDRESS=$PEER" \
cli peer chaincode instantiate \
-o $ORDERER -C mychannel -n mycc -v v0 \
-c '{"Args":["init","a","100","b","200"]}' \
--cafile /opt/home/managedblockchain-tls-chain.pem --tls

インスタンス化を確認するには次のコマンドを実行します

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e  "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
-e "CORE_PEER_ADDRESS=$PEER"  \
cli peer chaincode list --instantiated \
-o $ORDERER -C mychannel \
--cafile /opt/home/managedblockchain-tls-chain.pem --tls

インスタンス化されていると以下を返します

Get instantiated chaincodes on channel mychannel:
Name: mycc, Version: v0, Path: github.com/chaincode_example02/go, Escc: escc, Vscc: vscc

###チェーンコードに問い合わせる

 [ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer chaincode query -C mychannel \
-n mycc -c '{"Args":["query","a"]}'

100と返ってくるはずです

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER"  -e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer chaincode invoke -C mychannel \
-n mycc -c  '{"Args":["invoke","a","b","10"]}' \
-o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls

100から10を引きます

[ec2-user@ip-hoge ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" \
-e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" \
-e "CORE_PEER_LOCALMSPID=$MSP" \
-e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer chaincode query -C mychannel \
-n mycc -c '{"Args":["query","a"]}'

結果として90を返します

#感想
フルマネージドと聞いていたのでブラウザ上でポチポチしたらできるのかと思っていましたが、現状はdockerでコマンド打ちまくらないといけないようです。
ブロックチェーンエクスプローラーっぽい奴も今は用意されていないよう?なのでそこらへんは不便だなと思いました。

#参照
これみながらやりました
https://docs.aws.amazon.com/ja_jp/managed-blockchain/latest/managementguide/managed-blockchain-get-started-tutorial.html

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?