

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CQRS とイベントソーシングを使用してモノリスをマイクロサービスに分解する
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Amazon Web Services、Rodolfo Jr. Cerrada、Dmitry Gulin、Tabby Ward*

## 概要
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-summary"></a>

このパターンは、コマンドクエリ責任分離 (CQRS) パターンとイベントソーシングパターンの両方を使用する 2 つのパターンを組み合わせたものです。CQRS パターンは、コマンドモデルとクエリモデルの責任を分離します。イベントソーシングパターンは、非同期のイベント駆動型通信を利用して、全体的なユーザーエクスペリエンスを向上させます。

CQRS とAmazon Web Services(AWS)サービスを使用して、モノリスアプリケーションをマイクロサービスアーキテクチャにリファクタリングしながら、各データモデルを個別に維持およびスケーリングできます。その後、イベントソーシングパターンを使用して、コマンドデータベースのデータをクエリデータベースに同期できます。

このパターンでは、最新バージョンの Visual Studio を使用して開くことができるソリューション (\*.sln) ファイルを含むサンプルコードを使用しています。この例には、AWS のサーバーレスアプリケーション、従来型アプリケーション、オンプレミスアプリケーションで CQRS とイベントソーシングがどのように機能するかを紹介する Reward API コードが含まれています。

CQRS とイベントソーシングの詳細については、[追加情報](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional) セクションを参照してください。

## 前提条件と制限事項
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ Amazon CloudWatch
+ Amazon DynamoDB テーブル
+ Amazon DynamoDB Streams
+ AWS Identity and Access Management (IAM) アクセスキーとシークレットキー。詳細については、*関連リソース*セクションのビデオを参照してください。
+ AWS Lambda
+ Visual Studio に精通していること
+ AWS Toolkit for Visual Studio に精通していること。詳細については、*関連リソース*セクションの*AWS Toolkit for Visual Studio のデモビデオ*を参照してください。

**製品バージョン**
+ [Visual Studio 2019 コミュニティエディション](https://visualstudio.microsoft.com/downloads/)。
+ [AWS Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/)。
+ .NET Core 3.1 このコンポーネントは Visual Studio インストレーションのオプションです。インストール中に.NET Core を含めるには、**NET Core クロスプラットフォーム開発を選択します**。

**制限事項**
+ 従来のオンプレミスアプリケーション (ASP.NET Core Web API とデータアクセスオブジェクト) のサンプルコードにはデータベースは付属していません。ただし、このコードにはモックデータベースとして機能する `CustomerData` インメモリオブジェクトが付属しています。用意されているコードはパターンをテストするのに十分です。

## アーキテクチャ
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-architecture"></a>

**ソーステクノロジースタック**
+ ASP.NET Core Web API プロジェクト
+ IIS Web サーバー
+ データアクセスオブジェクト
+ CRUD モデル

**ソースアーキテクチャ**

ソースアーキテクチャでは、CRUD モデルには 1 つのアプリケーションにコマンドインターフェースとクエリインターフェースの両方が含まれています。コード例については、`CustomerDAO.cs` (添付) を参照してください。

![アプリケーション、サービスインターフェイス、カスタマー CRUD モデル、データベース間の接続。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**ターゲット テクノロジー スタック**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ (オプション) Amazon API Gateway API ゲートウェイ
+ Amazon Simple Notiﬁcation Service (Amazon SNS)

**ターゲット アーキテクチャ**

ターゲットアーキテクチャでは、コマンドインターフェイスとクエリインターフェイスは分離されています。次の図に示されているアーキテクチャは、API ゲートウェイと Amazon SNS を使用して拡張できます。詳細については、[追加情報](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional) セクションを参照してください。

![サーバーレスのカスタマーコマンドおよびカスタマークエリマイクロサービスと接続するアプリケーション。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. コマンド Lambda 関数は、データベースに対して作成、更新、削除などの書き込み操作を実行します。

1. クエリ Lambda 関数は、データベースに対して get や select などの読み取り操作を実行します。

1. この Lambda 関数は、Command データベースからの DynamoDB ストリームを処理し、変更があった場合はクエリデータベースを更新します。

## ツール
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-tools"></a>

**ツール**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – Amazon DynamoDB は、フルマネージド NoSQL データベースサービスであり、シームレスなスケーラビリティを備えた高速で予測可能なパフォーマンスを提供します。
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) – Amazon DynamoDB Streams は、Amazon DynamoDB テーブル内の項目レベルでの変更を時系列順にキャプチャする のサービスです。このサービスは、この情報を最大 24 時間ログに保存します。保管時の暗号化では、DynamoDB Streams のデータが暗号化されます。
+ 「[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)」 – AWS Lambda はサーバーのプロビジョニングや管理を行わずにコードの実行を支援できるコンピューティングサービスです。Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから 1 秒あたり数千のリクエストまで自動的にスケールします。課金は実際に消費したコンピューティング時間に対してのみ発生します。コードが実行されていない場合、料金は発生しません。
+ [AWS Management Console](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) – AWS マネジメントコンソールは、AWS のサービスを管理するための広範なサービスコンソールコレクションへのアクセスを提供するウェブアプリケーションです。
+ [Visual Studio 2019 コミュニティエディション](https://visualstudio.microsoft.com/downloads/) — Visual Studio 2019 は統合開発環境 (IDE) です。コミュニティエディションは、オープンソースのコントリビューターには無料で提供されます。このパターンでは、Visual Studio 2019 コミュニティエディションを使用してサンプルコードを開き、コンパイル、実行します。表示のみの場合は、任意のテキストエディターまたは [Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html) を使用できます。
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) – AWS Toolkit for Visual Studio は Visual StudioIDE へのプラグインです。AWS Toolkit for Visual Studio を使用すると、AWS サービスを使用する .NET アプリケーションの開発、デバッグ、および展開が容易になります。

**コード**

サンプルコードは添付されています。サンプルコードを展開する手順については、「*エピック*」セクションを参照してください。

## エピック
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-epics"></a>

### ソリューションのオープンと構築
<a name="open-and-build-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  セクションを開きます。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者 | 
| ソリューションを構築します。 | ソリューションのコンテキスト (右クリック) メニューを開き、**ソリューションをビルドする** を選択します。これにより、ソリューション内のすべてのプロジェクトがビルドされ、コンパイルされます。正常にコンパイルされるはずです。<br />Visual Studio ソリューションエクスプローラーにはディレクトリ構造が表示されるはずです。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者 | 

### DynamoDB テーブルを構築する
<a name="build-the-dynamodb-tables"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  認証情報の提供 | アクセスキーをまだお持ちでない場合は、*関連リソース*セクションの動画をご覧ください。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリケーション開発者、データエンジニア、DBA | 
| プロジェクトをビルドします。 | プロジェクトをビルドするには、**AwS.APG.CQRSES.Build** プロジェクトのコンテキスト (右クリック) メニューを開き、 **ビルド**を選択します。 | アプリケーション開発者、データエンジニア、DBA | 
| テーブルを作成してデータを入力します。 | テーブルを作成してシードデータを入力するには、**AwS.APG.CQRSES.Build** プロジェクトのコンテキスト (右クリック) メニューを開き、 **デバッグ**、**新規インスタンスの開始**を選択します。 | アプリケーション開発者、データエンジニア、DBA | 
| テーブルコンストラクトとデータを検証します。 | 確認するには、**AWS Explorer**,￥に移動し、**Amazon DynamoDB** を展開します。テーブルが表示されるはずです。各テーブルを開いて、サンプルデータを表示します。 | アプリケーション開発者、データエンジニア、DBA | 

### ローカルテストを実行する
<a name="run-local-tests"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Go プロジェクトを構築します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者、テストエンジニア | 
| イベントソーシングプロジェクトを構築います。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者、テストエンジニア | 
| テストの実行 | すべてのテストを実行するには、**表示**、**テストエクスプローラー**、**すべてのテストを表示で実行**の順に選択します。すべてのテストに合格するはずです。合格すると緑色のチェックマークアイコンが表示されます。  | アプリ開発者、テストエンジニア | 

### CQRS Lambda 関数を AWS に公開する
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Lambda 関数を発行します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者、DevOps エンジニア | 
| 関数のアップロードを検証します。 | (オプション) 関数が正常にロードされたことを確認するには、AWS Explorer に移動して **AWS Lambda** を展開します。テストウィンドウを開くには、Lambda 関数を選択します (ダブルクリック)。 | アプリ開発者、DevOps エンジニア | 
| Lambda 関数をテストします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)すべての CQRS Lambda プロジェクトは、`CQRS AWS Serverless\CQRS\Command Microservice` および ` CQRS AWS Serverless\CQRS\Command Microservice` ソリューションフォルダーにあります。ソリューションディレクトリとプロジェクトについては、[追加情報](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional) セクションの**ソースコードディレクトリ**を参照してください。 | アプリ開発者、DevOps エンジニア | 
| 残りの関数を公開します。 | 次のプロジェクトに対して、前のステップを繰り返します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者、DevOps エンジニア | 

### イベントリスナーとしての Lambda 関数の設定
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 顧客 Lambda イベントハンドラーとリワード Lambda イベントハンドラーを公開します。 | 各イベントハンドラーを公開するには、前のエピックの手順に従います。<br />プロジェクトは `CQRS AWS Serverless\Event Source\Customer Event` および `CQRS AWS Serverless\Event Source\Reward Event` ソリューションフォルダーにあります。詳細については、[追加情報](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)セクションの*ソースコードディレクトリ*を参照してください。 | アプリ開発者 | 
| イベントソーシング Lambda イベントリスナーをアタッチします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)リスナーが DynamoDB テーブルに正常にアタッチされると、Lambda デザイナーページに表示されます。 | アプリ開発者 | 
| EventSourceReward Lambda 関数をパブリッシュしてアタッチします。 | `EventSourceReward` Lambda 関数をパブリッシュしてアタッチするには、**DynamoDB テーブル** のドロップダウンリストから **cqrses-reward-cmd** を選択して、前の 2 つのストーリーの手順を繰り返します。 | アプリ開発者 | 

### DynamoDB ストリームと Lambda トリガーのテストと検証
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ストリームと Lambda トリガーをテストします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者 | 
| DynamodDB 報酬クエリテーブルを使用して検証します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者 | 
| CloudWatch Logs を使用して検証します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | アプリ開発者 | 
| EventSourceCustomer トリガーを検証します。 | `EventSourceCustomer` トリガーを検証するには、`EventSourceCustomer` トリガーのそれぞれの顧客テーブルと CloudWatch ログを使用して、このエピックの手順を繰り返します。 | アプリ開発者 | 

## 関連リソース
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**リファレンス**
+ [Visual Studio 2019 Community Editionのダウンロード](https://visualstudio.microsoft.com/downloads/)。
+ [AWS Toolkit for Visual Studioのダウンロード](https://aws.amazon.com/visualstudio/)
+ [AWS Toolkit for Visual Studio ユーザーガイド](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [AWS でのサーバーレス](https://aws.amazon.com/serverless/)
+ [DynamoDB のユースケースとデザインパターン](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [マーティン ファウラー (CQRS)](https://martinfowler.com/bliki/CQRS.html)
+ [マーティン ファウラー イベント ソーシング](https://martinfowler.com/eaaDev/EventSourcing.html)

**動画**
+ [AWS Toolkit for Visual Studioのデモビデオ](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [新しい IAM ユーザーのアクセスキー ID を作成する方法を教えてください。](https://www.youtube.com/watch?v=665RYobRJDY)

## 追加情報
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS とイベントソーシング**

*CQRS*

CQRS パターンは、データアクセスオブジェクトの単一 CRUD (作成、読み取り、更新、削除) モデルなどの単一の概念操作モデルを、コマンド操作モデルとクエリ操作モデルに分離します。コマンドモデルとは、作成、更新、削除など、状態を変更するあらゆる操作を指します。クエリモデルとは、値を返すあらゆる操作を指します。

![サービス インターフェース、CRUD モデル、データベースを備えたアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. Customer CRUD モデルには以下のインターフェースが含まれます。
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

要件が複雑になれば、この単一モデルのアプローチから移行できます。CQRS はコマンドモデルとクエリモデルを使用して、データの書き込みと読み取りの責任を分離します。そうすることで、データを独立して維持管理できます。責任が明確に分離されていれば、各モデルを強化しても他のモデルには影響しません。この分離によってメンテナンスとパフォーマンスが向上し、アプリケーションが大きくなるにつれて複雑さが軽減されます。

![アプリケーションはコマンドモデルとクエリモデルに分離され、1 つのデータベースを共有していました。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. 顧客 コマンド モデルのインターフェース：
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. 顧客 コマンド モデルのインターフェース：
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

コード例については、「*ソースコードディレクトリ*」を参照してください。

次に、CQRS パターンによってデータベースが切り離されます。この分離は、マイクロサービスアーキテクチャの主要要素である各サービスの完全な独立性につながります。

![コマンドモデルとクエリモデル用のデータベースを分ける。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 AWS クラウドで CQRS を使用すると、各サービスをさらに最適化できます。たとえば、さまざまなコンピューティング設定を設定したり、サーバーレスまたはコンテナベースのマイクロサービスのどちらかを選択できます。オンプレミスのキャッシュを Amazon ElastiCache に置き換えることができます。オンプレミスでメッセージングをパブリッシュ/サブスクライブメッセージングしている場合は、そのメッセージを Amazon Simple Notiﬁcation Service (Amazon SNS) に置き換えることができます。さらに、従量制料金の料金設定や、使用した分だけ支払うさまざまな AWS サービスを利用できます。

CQRS には次の利点があります。
+ 独立スケーリング — 各モデルのスケーリング戦略は、サービスの要件と需要に合わせて調整できます。高性能アプリケーションと同様に、読み取りと書き込みを分離することで、それぞれの需要に合わせてモデルを個別にスケーリングできます。また、コンピュートリソースを追加または削減して、一方のモデルのスケーラビリティ要求に応えることもできますが、もう一方のモデルには影響しません。
+ 独立したメンテナンス — クエリモデルとコマンドモデルを分離することで、モデルの保守性が向上します。一方のモデルにコードを変更したり拡張したりしても、もう一方のモデルには影響しません。
+ セキュリティ — 権限とポリシーを別々のモデルに適用して読み取りと書き込みを行う方が簡単です。
+ 読み込みの最適化 — クエリ用に最適化されたスキーマを定義できます。たとえば、集計データにはスキーマを定義し、ファクトテーブルには別のスキーマを定義できます。
+ 統合 — CQRS はイベントベースのプログラミングモデルによく合います。
+ 複雑さの管理 — クエリモデルとコマンドモデルへの分離は、複雑な分野に適しています。

 Local を使用する場合は、次の点に留意してください。
+ CQRS パターンはアプリケーションの特定の部分にのみ適用され、アプリケーション全体には適用されません。パターンに合わないドメインに実装すると、生産性が低下し、リスクが高まり、複雑さが増す可能性があります。
+ このパターンは、読み取りと書き込みの操作が不均衡な、頻繁に使用されるモデルに最適です。
+ 処理に時間がかかる大規模なレポートなど、読み取りの多いアプリケーションでは、CQRS では適切なデータベースを選択し、集約データを保存するスキーマを作成することができます。これにより、レポートデータを 1 回だけ処理して集計テーブルにダンプすることで、レポートの読み取りと表示の応答時間を短縮できます。
+ 書き込みの多いアプリケーションでは、書き込み操作用にデータベースを設定し、書き込みの需要が高まったときにコマンド microservice が独立してスケーリングできるようにすることができます。例については、`AWS.APG.CQRSES.CommandRedeemRewardLambda` および `AWS.APG.CQRSES.CommandAddRewardLambda` マイクロサービスを参照してください。

*イベントソーシング*

次のステップは、コマンドが実行されたときに、イベントソーシングを使用してクエリデータベースを同期することです。例えば、次の事項を検討します。
+ 顧客報酬ポイントが追加され、クエリデータベース内の顧客の合計または集計された報酬ポイントを更新する必要があります。
+ 顧客の姓がコマンドデータベースで更新されるため、クエリデータベース内の代理顧客情報を更新する必要があります。

従来の CRUD モデルでは、トランザクションが完了するまでデータをロックすることでデータの一貫性を確保していました。イベントソーシングでは、一連のイベントをパブリッシュすることでデータが同期され、サブスクライバーはそのイベントを消費してそれぞれのデータを更新します。

イベントソーシングパターンでは、データに対して実行された一連のアクションをすべて確認して記録し、一連のイベントを通じて公開します。これらのイベントはデータに加えられた一連の変更を表しており、そのイベントの購読者は記録を最新の状態に保つために処理する必要があります。これらのイベントはサブスクライバーによって処理され、サブスクライバーのデータベース上のデータが同期されます。この場合は、それがクエリデータベースです。

次の図は、AWS 上の CQRS で使用されるイベントソーシングを示しています。

![CQRS と AWS サーバーレスサービスを使用したイベントソーシングパターン用のマイクロサービスアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. コマンド Lambda 関数は、データベースに対して作成、更新、削除などの書き込み操作を実行します。

1. クエリ Lambda 関数は、データベースに対して get や select などの読み取り操作を実行します。

1. この Lambda 関数は、Command データベースからの DynamoDB ストリームを処理し、変更があった場合はクエリデータベースを更新します。また、この機能を使用して Amazon SNS にメッセージを発行し、サブスクライバー がデータを処理できるようにすることもきます。

1. (オプション) Lambda イベントサブスクライバーは Amazon SNS によって発行されたメッセージを処理し、クエリデータベースを更新します。

1. (オプション) Amazon SNS は書き込みオペレーションの E メール通知を送信します。

AWS では、クエリデータベースは DynamoDB Streams によって同期できます。DynamoDB は、DynamoDB テーブル内の項目レベルの変更に関するシーケンスを時間順にキャプチャし、その情報を 24 時間以内に永続的に保存します。

DynamoDB Streams をアクティブ化すると、データベースはイベントソーシングパターンを可能にする一連のイベントを公開できます。イベントソーシングパターンによってイベントサブスクライバーが追加されます。イベントサブスクライバーアプリケーションはイベントを消費し、サブスクライバーの責任に応じて処理します。前の図では、イベントサブスクライバーが変更を Query DynamoDB データベースにプッシュして、データの同期を維持しています。Amazon SNS、メッセージブローカー、イベントサブスクライバーアプリケーションを使用することで、アーキテクチャは切り離された状態に保たれます。

イベントソーシングには次の利点があります。
+ トランザクションデータの一貫性
+ データに加えられたアクションのモニタリングに使用できる、信頼性の高い監査証跡とアクション履歴
+ マイクロサービスなどの分散アプリケーションが、環境全体でデータを同期できるようにします。
+ 状態が変化しても、確実にイベントを発行できます。
+ 過去の状態の再構築または再生
+ モノリシックなアプリケーションからマイクロサービスへの移行のためのイベントを交換する疎結合エンティティ
+ 同時更新による競合の軽減。イベントソーシングにより、データストア内のオブジェクトを直接更新する必要がなくなります。
+ タスクとイベントを切り離すことによる柔軟性と拡張性
+ 外部システム更新
+ 1 回のイベントで複数のタスクを管理

イベントソーシングを使用する場合は、次の点に注意してください。
+ ソースサブスクライバーデータベース間のデータの更新には多少の遅延があるため、変更を取り消す唯一の方法は、イベントストアに補償イベントを追加することです。
+ イベントソーシングの実装はプログラミングスタイルが異なるため、習得には時間がかかります。

**テストデータ**

デプロイが成功したら、次のテストデータを使用して Lambda 関数をテストします。

**CommandCreate Customer**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Done",  "CompanyName":"AnyCompany",  "Address": "USA",  "VIP":true }
```

**CommandUpdate Customer**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Doe",  "CompanyName":"Example Corp.",  "Address": "Seattle, USA",  "VIP":true }
```

**CommandDelete Customer**

顧客 ID をリクエストデータとして入力します。たとえば、顧客 ID が 151 の場合、リクエストデータとして 151 と入力します。

```
151
```

**QueryCustomerList**

これは空白です。呼び出されると、すべての顧客が返されます。

**CommandAddReward**

これにより、ID 1 (リチャード) のお客様 (リチャード) に 40 ポイント加算されます。

```
{
  "Id":10101,
  "CustomerId":1,
  "Points":40
}
```

**CommandRedeemReward**

これにより、ID 1 (リチャード) の顧客に 15 ポイント差し引れます。

```
{
  "Id":10110,
  "CustomerId":1,
  "Points":15
}
```

クエリー/リワード

顧客の ID を入力します。たとえば、リチャードには 1、アーナビには 2、シャーリーの場合は 3 と入力します。

```
2 
```

**ソースコードディレクトリ**

Visual Studio ソリューションのディレクトリ構造のガイドとして次の表を使用してください。 

*CQRS オンプレミスコードサンプルソリューションディレクトリ*

![コマンドサービスとクエリサービスを含むソリューションディレクトリが拡張されました。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**顧客 CRUD モデル**

CQRS オンプレミスコードサンプル\\ CRUD モデル\\ AWS.APG.CQRSES.DAL プロジェクト

**顧客 CRUD モデルの CQRS バージョン**
+ 顧客コマンド：`CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command` プロジェクト
+ 顧客クエリ：`CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query` プロジェクト

**Command and Query microservices**

Command マイクロサービスはソリューションフォルダー `CQRS On-Premises Code Sample\CQRS Model\Command Microservice` にあります。
+ `AWS.APG.CQRSES.CommandMicroservice` ASP.NET Core API プロジェクトは、コンシューマーがサービスとやり取りするエントリポイントとして機能します。
+ `AWS.APG.CQRSES.Command` .NET Core プロジェクトは、コマンド関連のオブジェクトとインターフェイスをホストするオブジェクトです。

Command マイクロサービスはソリューションフォルダー `CQRS On-Premises Code Sample\CQRS Model\Query Microservice` にあります。
+ `AWS.APG.CQRSES.QueryMicroservice` ASP.NET Core API プロジェクトは、コンシューマーがサービスとやり取りするエントリポイントとして機能します。
+ `AWS.APG.CQRSES.Query` .NET Core プロジェクトは、コマンド関連のオブジェクトとインターフェイスをホストするオブジェクトです。

*CQRS AWS サーバーレスコードソリューションディレクトリ*

![マイクロサービスとイベントソースの両方が拡張されていることを表示しているソリューションディレクトリ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

このコードは、AWS サーバーレスサービスを使用するオンプレミスコードの AWS バージョンです。

C\# .NET Core では、各 Lambda 関数は 1 つの.NET Core プロジェクトによって表されます。このパターンのサンプルコードでは、コマンドモデルとクエリモデルのインターフェースごとに個別のプロジェクトがあります。

**AWS のサービスの使用**

AWS サーバーレスサービスを使用するCQRSのルートソリューションディレクトリは、この `CQRS AWS Serverless\CQRS` フォルダーにあります。この例には、顧客と報酬という 2 つのモデルが含まれています。

顧客とリワードのLambda関数のコマンドは、`CQRS\Command Microservice\Customer` および `CQRS\Command Microservice\Reward` フォルダーにあります。これらには以下の Lambda プロジェクトが含まれています。
+ 顧客コマンド：`CommandCreateLambda`、`CommandDeleteLambda`、`CommandUpdateLambda`
+ リワードコマンド：`CommandAddRewardLambda` と `CommandRedeemRewardLambda`

顧客とリワードのクエリ Lambda 関数は、`CQRS\Query Microservice\Customer` および `CQRS\QueryMicroservice\Reward` フォルダーにあります。これらには以下の `QueryCustomerListLambda` と `QueryRewardLambda` Lambda プロジェクトが含まれています。

**CQRS テストプロジェクト**

テストプロジェクトは `CQRS\Tests` フォルダーの下にあります。このプロジェクトには、CQRS Lambda 関数のテストを自動化するテストスクリプトが含まれています。

**AWS サービスを使用したイベントソーシング**

次の Lambda イベントハンドラーは、Customer と Reward DynamoDB ストリームによって開始され、クエリテーブル内のデータを処理および同期します。
+ `EventSourceCustomer` Lambda 関数は顧客テーブル (`cqrses-customer-cmd`) の DynamoDB ストリームにマップされます。
+ `EventSourceReward` Lambda 関数は顧客テーブル (`cqrses-reward-cmd`) の DynamoDB ストリームにマップされます。

## アタッチメント
<a name="attachments-9f1bc700-def4-4201-bb2d-f1fa27404f15"></a>

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「[attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)」