AWSでブロックチェーンネットワーク構築第1回~環境構築編~

近年、ブロックチェーンの技術は金融業界をはじめ様々な分野で注目を集めています。

Amazon Web Service(以降AWS)ではブロックチェーンを簡単に構築、またパブリックネットワークに参加できるサービスを提供しています。

この記事では、数回に分けてAWSの「Amazon Managed Blockchain」というサービスを使ってブロックチェーンネットワークを構築する手順を紹介します。

第一回目(当記事)では、「ブロックチェーンネットワークの構築」「ネットワークと通信するためのクライアント作成」までの手順を説明します。

AWSブロックチェーンの知識がない方でも手を動かせるように画像付きで解説しているので、ブロックチェーンに興味のある方は是非、実際に触ってみてください。

ブロックチェーンとは?

「そもそもブロックチェーンってなに?」という方のために簡単におさらいしておきましょう。

ブロックチェーンとは一言で表すと「改ざん困難な分散型台帳」です。

当事者間のデータのやり取りを1つの塊(ブロック)に保持し、その取引内容を保持したブロックを不特定多数で共有、各ブロック同士を連結(チェーン)することで高セキュリティな仕組みを実現しています。

ブロックチェーンの特徴

ブロックチェーンには主に下記のような特徴があります。

  • システムの安定性が高い
  • 改ざんが困難
  • 信頼性が高い

システムの安定性が高い

通常システムを運用するには、システムを動かすサーバーやその管理者が必要であり、一企業がデータやシステムを管理している「集中管理型」の構成が多いです。
一方、ブロックチェーンはサーバーや管理者という概念がなく、各端末に処理を分散する「分散型」構成で、システムがダウンする可能性が低いのが特徴です。

改ざんが困難

ブロック一つ一つに、他の取引情報などが保持されており、1つのブロックを改ざんするには改ざん対象のブロックの情報を持つすべてのブロックにたいしても改ざんする必要があり、現実的に不可能とされています。

信頼性が高い

ブロックチェーン上での取引内容はいつでも確認することが可能なため、どのような取引が行われたか(誰が何を買ったとか)を辿ることができます。

ブロックチェーン活用事例

ブロックチェーンの技術はビットコインをはじめとする仮想通貨に用いられていることで有名ですが、それ以外にも様々な分野・用途で用いられており、今後の発展が期待されています。

  • 組織独自のコインを生成し資金調達
  • 契約の自動化(商品売買など)
  • 身分や著作物の証明

AWS Managed Blockchainでブロックチェーンネットワークを構築してみよう!

ブロックチェーンについて理解が深まったところで、ここからは実際に実際にブロックチェーンネットワークを構築していきます。
今回はAWSで提供している「Amazon Managed Blockchain」というサービスを使い「Hyperledger Fabric」を使用したコンソーシアムチェーンを構築いていきます。

Hyperledgerとは?

Hyperledger Fabricは、オープンソースで、エンタープライズグレードで、許可型の分散台帳技術(DLT)の プラットフォームです。Fabricは、エンタープライズ向けに設計されており、よく使われている他の分散台帳や ブロックチェーンプラットフォームとは大きく異なる特性を持っています。

https://hyperledger-fabric.readthedocs.io/ja/latest/whatis.html

コンソーシアムチェーンとは?

ブロックチェーンには3種類のチェーンネットワークの種類があります。

コンソーシアムチェーンはその中の一つで、特定の人しか参加できない閉じたネットワークのことです。

パブリックチェーン管理者が存在しない、誰でも参加できるオープンなブロックチェーン(BitcoinやEthereumなど)
プライベートチェーン単一の企業や組織で運営される許可されたユーザーのみが参加できるブロックチェーン
コンソーシアムチェーン複数の企業や組織にまたがって運営される許可されたユーザーのみが参加できるブロックチェーン

ここからは実際に「HyperledgerFabric開発者ガイド」に沿ってブロックチェーンを構築していきます。

前提条件

  • AWSアカウント作成済み

環境

事前準備

初めにVPCやEC2インスタンスへのアクセスに必要なキーペアなど、必要なリソースを準備しましょう。

事前準備が割と大変ですが、頑張ってこなしていきましょう!

VPCを作成

AWSマネジメントコンソール上部で「VPC」と検索し「サービス」の中の「VPC」をクリックします。

画面左側の「VPC」をクリックし、右上の「VPCを作成」をクリックします。

VPCを作成」画面が表示され、ここで作成するVPCの設定を行います。

下記のように設定したら画面下部の「VPCを作成」をクリックします。

VPCはリージョン内で5つまでという制限があるため、もし作成できない場合は別リージョンに作成しましょう。

  • VPCの設定
    • 名前タグ-オプション:(任意のVPC名)
    • IPv4 CIDRブロック:10.0.0.0/16
    • IPv6 CIDRブロック:IPv6 CIDR ブロックなし(デフォルト)
    • テナンシー:(デフォルト)
  • タグ
    • キー:(デフォルト)
    • 値-オプション:(デフォルト)

正常に処理されると下記のようにVPCが作成されます。

作成されたVPCの「VPC ID」は後々使用するためメモしておいてください。(※1)

VPC サブネットを作成

次に、作成したVPCにサブネットを作成します。

VPCコンソール左側メニューの「サブネット」をクリックし、画面右上の「サブネットを作成」をクリックします。

サブネットを作成画面が表示され、作成するサブネットに関する設定を入力していきます。

下記のように入力し、画面下部の「サブネットを作成」をクリックします。

  • VPC
    • VPC ID:VPC作成時にメモしたVPC ID(※1)を選択
  • サブネットの設定
    • サブネット名:(任意のサブネット名)
    • アベイラビリティゾーン:(VPCを作成したリージョンを指定)
    • IPv4 CIDR ブロック:10.0.0.0/16(VPCの設定に合わせる)
    • タグ-オプション:(デフォルト)

VPC インターネットゲートウェイを作成

ここからはブロックチェーンネットワークのクライアントとなるEC2インスタンスSSH接続する際に必要な設定になります。(※筆者はこの手順が抜けておりハマりましたので忘れずに実施します。)

VPCコンソールの左側メニューから「VIRTUAL PRIVATE CLOUD」-「インターネットゲートウェイ」をクリックし、右上の「インターネットゲートウェイの作成」をクリックします。

インターネットゲートウェイの作成画面が表示され、設定を行っていきます。

下記のように入力し、画面下部の「インターネットゲートウェイの作成」ボタンをクリックします。

  • インターネットゲートウェイの設定
    • 名前タグ:(任意の名前)
  • タグ-オプション
    • キー:(デフォルト)
    • 値-オプション:(デフォルト)

正常に処理されると、下記のようにインターネットゲートウェイが作成されます。

「インターネットゲートウェイID」は後ほど使用するのでメモしておいてください。※2

次に作成したインターネットゲートウェイVPCにアタッチします。

画面右上の「アクション」から「VPCにアタッチ」を選択します。

インターネットゲートウェイをアタッチするVPCを選択します。

下記のように設定し、画面下部の「インターネットゲートウェイをアタッチ」をクリックします。

  • VPC
    • 使用可能なVPCVPC作成時にメモしたVPC ID(※1)を選択

リソースの「詳細」-「状態」が「Attached」になったことが確認できればOKです。

ルートテーブルを定義

次にルートテーブルを作成します。

VPCコンソール左側メニューから「VIRTUAL PRIVATE CLOUD」-「ルートテーブル」を選択し、画面右上の「ルートテーブルを作成」をクリックします。

ルートテーブル作成画面が表示され、各設定を行います。

下記のように入力し、画面下部の「ルートテーブルを作成」をクリックします。

  • ルートテーブル設定
    • 名前-オプション:(任意の名前)
    • VPCVPC作成時にメモしたVPC ID(※1)を選択
  • タグ
    • キー:(デフォルト)
    • 値-オプション:(デフォルト)

これでルートテーブルが作成されました。

次に画面右下の「ルート編集」をクリックします。

下記のように設定し、「変更を保存」をクリックします。

最後に作成したルートテーブルをVPCサブネットに対して紐づけます。

ルートテーブル下部タブから「サブネットの関連付け」-「明示的なサブネットの関連付け」-「サブネットの関連付けを編集」をクリックします。

先ほど作成したサブネットが表示されているので、左側のチェックボックスをチェックし「関連付けを保存」をクリックします。

セキュリティグループの作成

EC2へのSSH接続や、ブロックチェーンとの通信が行えるようにセキュリティグループを作成します。

VPCコンソール左側メニューから「セキュリティ」-「セキュリティグループ」を選択し、画面右上の「セキュリティグループを作成」をクリックします。

下記のようにセキュリティグループの設定を入力したら、「セキュリティグループを作成」をクリックします。

  • 基本的な詳細
    • セキュリティグループ名:(任意の名前)
    • 説明:(任意の説明)
    • VPCVPC作成時にメモしたVPC ID(※1)を選択
  • インバウンドルール
  • アウトバウンドルール(デフォルト)
  • タグ-オプション(デフォルト)

※インバウンドルールのソースについては、本来セキュリティ上自身のIPアドレスで固定するのが望ましいですが、今回はお試しということで「Anywhere」としています。

キーペアを作成

前準備の最後の手順としてキーペアを作成しておきます。

EC2コンソールの左側メニューから「ネットワーク&セキュリティ」-「キーペア」を選択し、画面右上の「キーペアを作成」をクリックします。

下記のように設定したら「キーペアを作成」をクリックします。

すると、EC2インスタンスSSH接続する際に必要となる.pemファイル(秘密鍵)がダウンロードされるので、任意の場所に保存してください。(本来であれば鍵の格納場所がありますが、今回はお試しなのでデスクトップなどに保存)

※ダウンロードされた.pemファイルは絶対に他人に公開しないように注意しましょう!

以上で、前準備となる作業が完了しました。

お疲れ様でした。

次からいよいよManaged Blockchainを使用していきます。

1.ネットワークとメンバーを作成

初めにブロックチェーンネットワークの構築と、管理者となるメンバーを作成します。

マネジメントコンソールから「Blockchain」と検索し、「Amazon Managed Blockchain」をクリックします。

今回はクローズドなネットワークを作成するので「プライベートネットワークを作成」をクリックします。

ネットワーク作成画面が表示されたら、下記のように設定し画面下部の「次へ」をクリックします。

次にブロックチェーンネットワークに参加するメンバー(管理者となるメンバー)を設定します。

下記のように入力し「次へ」をクリックします。

  • メンバー設定
    • メンバー名:(任意の名前)
    • 説明(オプション):(任意の説明)
  • Hyperledger Fabric認証機関(CA)の設定
    • 管理者ユーザー名:(任意の名前)
    • 管理者パスワード:(任意のパスワード)
  • 設定をログに記録(デフォルト)
  • タグ(デフォルト)
  • 保管時の暗号化(デフォルト)

最後に設定内容に問題がなければ「ネットワークとメンバーを作成」ボタンをクリックします。

ネットワークの作成には時間がかかることがあるので気長に待ちましょう。(筆者の時は30分ほどかかりました。)

2.VPCエンドポイントの作成

「詳細」-「ステータス」が「利用可能」になったら、右上の「VPCエンドポイントを作成」をクリックします。

下記のように各設定を入力したら「作成」をクリックします。

  • VPCエンドポイントを作成
    • VPC:(作成したVPCVPC IDえを選択)
    • サブネット:(作成したサブネットを選択)
    • セキュリティグループ:(作成したセキュリティグループを選択)

VPCエンドポイント作成時に下記のエラーが発生する場合があります。

これは「VPCにてDNSが有効化されてない」という内容のエラーです。

上記エラーが発生した場合は「VPCコンソール」-「アクション」-「DNSホスト名を編集」-「DNSホスト名」を有効化し、再度VPCエンドポイントの作成を実行してみてください。

3.ピアノードを作成

次はピアノードを作成していきます。

ピアノードとはブロックチェーンのデータを保持する台帳のコピーみたいなものです。

まず、コンソールから「メンバータブ」-「自分が所有するメンバー」-「ピアノードを作成」をクリックします。

下記のように設定したら、「ピアノードを作成」をクリックします。

今回はデフォルトの設定で使用しますが、ピアノード設定の意味合いは下記の通りなので参考にしてください。

ブロックチェーンインスタンスタイプノードに割り当てられる計算容量とメモリ容量
想定される処理負荷により適宜設定
ステートDB設定1.4以降に使用する場合のみ指定(1.2ではLevelDBを使用)
LevelDBはチェーンコードデータをキーと値のペアとして格納
CouchDBは元帳のデータをJSONとしてモデル化
アベイラビリティゾーンピアノードを起動するアベイラビリティゾーン

以上でピアノードの作成は完了です。

4.クライアントを設定

次はブロックチェーンネットワークとやり取りするためのクライアントの設定を行います。

ここでは難しいことは考えず、公式で用意してくれているCloudFormationテンプレートを使用して環境構築します。

CloudFormationとはAWSが提供している、インフラの構成をコードで管理できるサービスです。

これを使うことで、Hyperledger Fabricクライアントを簡単に作成することができます。

CloudFormationテンプレートをダウンロード

まず、Githubからテンプレートをダウンロードします。

今回はテンプレートを使用したいだけなので単純にzipでダウンロードしましょう。

こちらからGithubへアクセスし、画面右上の「Code」-「Download ZIP」をクリックします。

次に、ダウンロードしたzipファイルを解凍し、解答したフォルダ内の「templates」-「fabric-ec2-client.template.yaml」ファイルをCloudFormationで読み込みます。

テンプレートをもとにスタック(EC2インスタンス)を作成

CloudFormationコンソールから「スタックの作成」をクリックします。

下記のように設定し、「次へ」をクリックします。

  • 前提条件-テンプレートの準備
    • テンプレートの準備:テンプレートの準備完了
  • テンプレートの指定
    • テンプレートソース:テンプレートファイルのアップロード
    • テンプレートファイルのアップロード:(fabric-ec2-client.template.yamlを選択)

テンプレートをもとにパラメータを設定できるので、下記のように設定していきます。

  • スタックの名前
    • スタックの名前:(任意の名前)
  • パラメータ
    • EC2 instance parameters:(作成したサブネットIDを設定)
    • EC2SecurityGroup:(作成したセキュリティグループを設定)
    • EC2KeyPairName:(前処理で作成したキーペア名)
    • InstanceType:t3.small
    • InstanceProfileName:(デフォルト)
  • Managed Blockchain parameters
    • Version:1.4(ネットワーク作成時に指定したバージョンを設定)
    • MemberID:(①を入力)
  • Hyperledger Fabric parameters
    • FabricCAEndpoint:(②を入力)
    • OrderingServiceEndpoint:(③を入力)
    • PeerNodeEndpoint:(④を入力)

最後に「スタックのオプション設定(デフォルト設定)」「レビュー」を確認しスタックの作成を完了します。

HyperledgerFabricClientにSSH接続

ここまで設定できたらクライアントのEC2にSSH接続できるはずなので、WindowsならコマンドプロンプトMacOSならターミナルなど、からSSH接続してみましょう。

まず、EC2コンソールから作成したインスタンスの詳細画面に移動し、右上の「接続」をクリックします。

SSHクライアント」タブの下部にある「ssh -i "キーペア名" ec2-user@ホスト名」をコピーしてSSHクライアントにて実行します。

※コマンドの実行は事前準備時にキーペアを保存した場所で実行してください。

SSH接続に成功すると下記のような出力になります。

D:\Users\user-name\Desktop>ssh -i "key_pare.pem" ec2-user@ec2-XX-XX-XX-XXX.compute-1.amazonaws.com
The authenticity of host 'ec2-XX-XX-XX-XXX.compute-1.amazonaws.com (XX.XX.XX.XXX)' can't be established.
ECDSA key fingerprint is SHA256.
Are you sure you want to continue connecting (yes/no)?yes

Last login: Thu Nov 11 00:42:26 2021 from fl9-119-243-74-87.tky.mesh.ad.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
80 package(s) needed for security, out of 108 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-203-74 ~]$

これでブロックチェーンネットワークと通信するためのクライアントに入るところまで完了しました!

※もしssh接続する際に「ssh: connect to host ec2-XXXX.amazonaws.com port 22: Operation timed out」といったタイムアウトしてしまう場合は下記の設定にて不備がないか確認してみましょう。

  • EC2インスタンスは実行されているか(停止していれば再開させる)
  • VPCセキュリティグループのインバウンド設定でsshポート(Port:22)を開放しているか
  • sshコマンドのホスト名は間違っていないか(インスタンスを再起動するたびにホスト名が変わるので注意)

(因みに筆者はいつの間にかホスト名が変わっていたことに気が付かづだいぶ時間をロスしました。)

まとめ・今後の展望

この記事では、AWSAmazon Managed Blockchain」でブロックチェーンネットワーク、クライアント環境の構築について解説しました。

前準備、環境構築がメインだったため、まだまだブロックチェーンとはどういうものかイメージできていないと思います。

次回は実際にブロックチェーン上でチェーンコード(ブロックチェーン上で実行されるプログラム)を実行し、ブロックチェーンの基本的な流れ、またどのようなことが実現可能かというところまで解説しようと思います。