Amazon Web Services ブログ
Amazon Managed Blockchain を使用したサーバーレスブロックチェーンアプリケーションの構築
Amazon Managed Blockchain は、スケーラブルなブロックチェーンネットワークを簡単に作成して管理できるようにします。 このマルチパート記事のパート 1 では、Amazon Managed Blockchain を使用してハイパーレジャーファブリックブロックチェーンをデプロイする方法を学びました。 また、REST API をデプロイして、ネットワークの読み取りと書き込みを行う簡単なインターフェイスを提供する方法も学びました。これを可能にするために、ハイパーレジャーファブリック SDK を使用して Managed Blockchain と通信し、REST API サーバーを実行する Amazon EC2 インスタンスをデプロイしました。
この記事では、AWS Lambda と Amazon API Gateway を使用してサーバーレスアーキテクチャで REST API を構築する別の方法を示します。 Lambda には耐障害性が組み込まれており、サービス自体と動作する機能の高可用性を提供するため、開発者はビジネスロジックの開発に集中できます。 Lambda および API Gateway を使用して API をデプロイすると、消費したリソースに対してのみ料金を支払う一方で、アプリケーションを自動的にスケーリングできます。
この段階的なチュートリアルでは、Node.js ファブリック SDK を使用して Managed Blockchain の読み取りと書き込みを行う Lambda 関数をデプロイします。 また、デプロイされた各 API ルートに対して Lambda 関数を呼び出す API Gateway をデプロイします。 API Gateway を使用すると、リクエストを Lambda に渡す前に、リクエストの承認と認証を処理できます。
ソリューション
Managed Blockchain は、AWS マネージド VPC 内ですべてのファブリックコンポーネント (ordering service, certificate authorities, per nodes) を実行します。ファブリックコンポーネントには VPC エンドポイントを介してのみアクセスできるため、この記事では、作成済みの VPC 内に Lambda 関数をデプロイし、VPC エンドポイントと通信するように設定します。
Lambda 関数は VPC 内で実行されるため、デフォルトでは AWS Secrets Manager などのマネージド AWS サービスにアクセスできません。関数は Secrets Manager からユーザー登録認証情報をダウンロードできる必要があるため、別の VPC エンドポイントを作成してアクセスする必要があります。
次のアーキテクチャ図は、高レベルのエンドツーエンドソリューションを示しています。
API Gateway は、ウェブアプリケーションへの API ルートを提供し、各ルートに対して Lambda 関数を呼び出します。 Lambda 関数は、Secrets Manager からユーザーのブロックチェーン認証情報を取得し、それらを使用してブロックチェーントランザクションに署名します。 次に、Lambda 関数は、VPC エンドポイントを介して、Amazon Managed Blockchain ネットワーク内で実行されているピアノードに承認目的で署名付きブロックチェーントランザクションを送信します。 最後に、Lambda 関数は、承認されたトランザクション提案を注文サービスに送信し、そこでブロックチェーンにコミットされます。
ソリューションのチュートリアル
次の手順の詳細については、GitHub リポジトリで、パート 6: Amazon API Gateway と AWS Lambda を使用してブロックチェーンを読み書きするを参照してください。
REST API を介したエンドツーエンドのウェブリクエストは、複数の AWS サービスを介して実行されます。 各サービスの関係を説明するには、NGO の寄付とそれらの寄付の支出に対する透明性を提供する非営利のブロックチェーンネットワークへのリクエストを満たすための手順通りに進めます。 この例では、非営利のブロックチェーンネットワーク上のすべての寄付者に問い合わせるリクエスト通りに実行します。
最初に、API Gateway はウェブリクエストを受信し、Lambda 関数を呼び出します。
デプロイする Lambda 関数は、非営利のブロックチェーンに特定されることなく、任意のチェーンコードで動作するように設計されています。 そのランタイムは、関数を作成するときに定義する環境変数によって制御されます。 Lambda 関数は Node.js ファブリック SDK を使用して、すべての寄付者にクエリするブロックチェーンリクエストオブジェクトを構築します。
API Gateway が Lambda 関数を呼び出すとき、Lambda 関数がトランザクションの署名と実行に使用するファブリックユーザーを識別するユーザー名を指定します。 すべてのファブリックユーザーは、公開証明書と対応するプライベートキーによって識別されます。これは、ブロックチェーンネットワークに送信されるトランザクションに署名するために使用されます。
公開証明書とプライベートキーは Secrets Manager に保存されます。 Secrets Manager は、認証情報の安全で暗号化されたストレージ、および認証情報アクセスパターンの集中ビューを提供します。Lambda 関数は、ファブリックユーザーのブロックチェーン認証情報を Secrets Manager からダウンロードします。
Lambda 関数は、署名付きトランザクションを Managed Blockchain ピアノードに送信し、ブロックチェーンネットワークから API Gateway にクエリ応答を返します。
GitHub から Lambda 関数のソースコードをダウンロードします。
API Gateway と Lambda の統合
この記事で、API Gateway は 3 つの REST API ルートを使用してデプロイします。これにより、次のことが可能になります。
- 新しい寄付者の作成
- ユーザー名で寄付者をクエリする
- すべての寄付者をクエリする
API Gateway は各ルートに対して Lambda 関数を呼び出し、API Gateway Mapping Templates を使用して HTTP リクエストを Lambda 関数が必要とするパラメータに変換します。 これらは次の通りです。
- chaincodeFunction – 実行されるチェーンコード関数の名前
- chaincodeFunctionArgs – チェーンコード関数に渡す引数のオブジェクト
- functionType – invoke、queryObject、queryString、または queryArray のいずれか
- fabricUsername – このトランザクションを実行するユーザーコンテキスト
詳細については、Lambda 統合を使用した API Gateway API を構築するを参照してください。
前提条件
段階的なチュートリアルを完了する前に、GitHub リポジトリのパート 1 とパート 2 を完了する必要があります。
段階的なチュートリアル
このプロセスの各手順の詳細については、GitHub リポジトリを参照してください。ここにリストされている各ステップは、リポジトリにそれと合致するステップがあります。リポジトリ内の手順とコードベース通りに進めると、より深く理解できます。
手順 1: ファブリックユーザーの作成
Lambda は、ユーザーコンテキストのブロックチェーンでトランザクションを実行する必要があります。ブロックチェーンとやり取りするすべてのユーザーは、まず認証機関に登録して参加する必要があります。
登録のプロセスにより、組織の認証機関にユーザーのエントリが作成されます。ユーザーを登録すると、識別するための署名認証情報が生成されます。これらの認証情報は、ブロックチェーンの読み取りまたは書き込み時にピアノードに送信されるトランザクションに署名するために使用されます。
登録プロセスでは、次の 2 つのアーティファクトが生成されます。
- プライベートキー
- 署名証明書 (パブリックキー)
ユーザーは何度でも登録でき、登録プロセスで新しいプライベートキーと署名証明書が作成されるたびに登録できます。
この手順内で、登録ユーザーのプライベートキーと署名証明書は Secrets Manager に保持され、Lambda 関数は実行中にそれらをダウンロードします。
詳細については、ユーザーを管理者として参加および登録するを参照してください。
手順 2: Lambda 関数と API Gateway をデプロイする
Lambda 関数と API Gateway は、AWS CloudFormation テンプレート内の AWS SAM を使用して定義されます。API ルートは Swagger ドキュメントで定義されます。テンプレートは、Lambda 関数と API Gateway に必要な IAM ロールとポリシーとともに、Secrets Manager への VPC エンドポイントの作成も定義します。
Lambda 関数は、このシリーズの前の記事で作成した VPC 内にデプロイします。API Gateway は、dev という名前のステージにデプロイします。詳細については、Amazon Managed Blockchain で、ハイパーレジャーファブリックのアプリケーションを構築およびデプロイするを参照してください。
手順 3: Lambda 関数のテスト
これで、Lambda 関数をテストする準備ができました。この関数は、読み取りまたは書き込みトランザクションに使用できる単一のハンドラー関数を公開します。
最初に、新しい寄付者を作成してブロックチェーンに書き込みできることをテストします。また、作成したばかりの新しい寄付者をクエリし、ネットワーク上のすべての寄付者をクエリすることにより、ブロックチェーンから読み取りできることをテストできます。
Lambda 関数をテストするには、コマンドラインインターフェイスまたは Lambda コンソールを使用します。CLI を介したテストの詳細については、GitHub で、手順 3 – Lambda 関数をテストするを参照してください。
手順 4: API Gateway のテスト
API Gateway は、dev という名前のステージにデプロイします。このステージへの URL は、この記事の手順 2 の最後に表示されます。API Gateway コンソールから取得することもできます。
3 つの API ルートを使用して、Lambda 関数をテストしたときと同じ手順を実行できることをテストできます。
まとめ
この記事では、Lambda 関数と Amazon API Gateway を使用し、Secrets Manager でユーザー認証情報を保持することにより、Managed Blockchain ネットワークでトランザクションを簡単かつ安全に実行するための段階ごとのプロセスを紹介しました。
この API を拡張するには、API Gateway コンソールまたは Swagger ドキュメントで追加の API ルートを定義できます。各ルートに対して、Lambda 関数に渡す引数を定義するマッピングテンプレートを作成します。
著者について
Emile は AWS のシニアブロックチェーンアーキテクトです。自由時間には、サンフランシスコ北部の丘でトレイルランニングを楽しみ、18 か月の娘に遅れをとらないように頑張っています。