

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

# CodeCommit 内のモノリポジトリの変更を自動的に検出し、さまざまな CodePipeline パイプラインを開始する
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit"></a>

*Helton ribeiro、Petrus Batalha、Ricardo Morais (Amazon Web Services)*

## 概要
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-summary"></a>

**注意**: AWS Cloud9 は新規顧客には利用できなくなりました。の既存のお客様は、通常どおりサービスを AWS Cloud9 引き続き使用できます。[詳細はこちら](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

このパターンは、 でモノレポベースのアプリケーションのソースコードの変更を自動的に検出し AWS CodeCommit 、マイクロサービスごとに継続的インテグレーションと継続的デリバリー (CI/CD) オートメーション AWS CodePipeline を実行するパイプラインを で開始するのに役立ちます。このアプローチは、モノレポベースのアプリケーション内の各マイクロサービスに専用の CI/CD パイプラインを持たせることができることを意味します。これにより、可視性が向上し、コードの共有が容易になり、コラボレーション、標準化、発見が容易になります。

このパターンで説明されているソリューションは、モノレポ内のマイクロサービス間での依存関係分析を実行しません。ソースコードの変更のみを検出し、一致する CI/CD パイプラインを開始します。

このパターンでは、 を統合開発環境 (IDE) AWS Cloud9 として使用し AWS Cloud Development Kit (AWS CDK) 、 `MonoRepoStack`と の 2 つの CloudFormation スタックを使用してインフラストラクチャを定義します`PipelinesStack`。`MonoRepoStack` スタックは、 にモノレポ AWS CodeCommit を作成し、CI/CD パイプラインを開始する AWS Lambda 関数を作成します。`PipelinesStack` スタックはパイプラインインフラストラクチャを定義します。

**重要**  
このパターンのワークフローは概念実証 (PoC) です。テスト環境でのみ使用することをお勧めします。このパターンのアプローチを本番環境で使用する場合は、 AWS Identity and Access Management ([IAM) ドキュメントの「IAM のセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照して、IAM ロールと に必要な変更を加えます AWS のサービス。 

## 前提条件と制限事項
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ AWS Command Line Interface (AWS CLI)、インストールおよび設定済み。詳細については、 AWS CLI ドキュメント[AWS CLIの「 のインストール、更新、アンインストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。 
+ ローカルマシンにインストール済みの Python 3 と `pip`。詳細については、[Python のドキュメント](https://www.python.org/)を参照してください。 
+ AWS CDKがインストールされ設定済みであること。詳細については、 AWS CDK ドキュメントの[「Getting started with the AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)」を参照してください。 
+ IDE AWS Cloud9 がインストールされ、設定されています。詳細については、 AWS Cloud9 ドキュメントの[「セットアップ AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/setting-up.html)」を参照してください。 
+ GitHub の [AWS CodeCommit monorepo multi-pipeline triggers](https://github.com/aws-samples/monorepo-multi-pipeline-trigger)リポジトリが、ローカルマシンでクローン済み。 
+ CodePipeline でビルドしてデプロイするアプリケーションコードを含む既存のディレクトリ。
+  AWS クラウドでの DevOps のベストプラクティスに関する知識と経験。DevOps の知識を高めるには、 パターンを使用します。[DevOps プラクティスと 規範ガイダンスウェブサイトを使用して、マイクロサービスと疎結合アーキテクチャを構築 AWS Cloud9](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/build-a-loosely-coupled-architecture-with-microservices-using-devops-practices-and-aws-cloud9.html)します。 AWS  

## アーキテクチャ
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-architecture"></a>

次の図は、 を使用して、 `MonoRepoStack`と の 2 つの AWS CloudFormation スタックを持つインフラストラクチャ AWS CDK を定義する方法を示しています`PipelinesStack`。

![\[AWS CDK を使用して 2 つの CloudFormation スタックを持つインフラストラクチャを定義するワークフロー。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a3397158-a208-4033-844e-969af13ae8b6/images/b0bb1094-b598-4b3d-ab8b-ad9b0eb45f38.png)


この図表は、次のワークフローを示しています:

1. ブートストラッププロセスでは、 AWS CDK を使用して AWS CloudFormation スタック`MonoRepoStack`と を作成します`PipelinesStack`。

1. `MonoRepoStack` スタックは、アプリケーション用の CodeCommit リポジトリと、各コミットの後に開始される `monorepo-event-handler` Lambda 関数を作成します。

1. `PipelinesStack` スタックは、Lambda 関数によって開始されるパイプラインを CodePipeline に作成します。各マイクロサービスにはインフラストラクチャパイプラインが定義されている必要があります。

1. `microservice-n` のパイプラインは Lambda 関数によって開始され、CodeCommit のソースコードに基づいて分離された CI/CD ステージを開始します。

1. `microservice-1` のパイプラインは Lambda 関数によって開始され、CodeCommit のソースコードに基づいて分離された CI/CD ステージを開始します。

次の図は、 アカウント`PipelinesStack`での AWS CloudFormation スタック`MonoRepoStack`と のデプロイを示しています。

![\[CloudFormation スタック MonoRepoStack と PipelinesStack の AWS アカウントへのデプロイ。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a3397158-a208-4033-844e-969af13ae8b6/images/39e60e49-dea2-486d-8a2c-6cae438f69b4.png)


1. ユーザーがアプリケーションのマイクロサービスの 1 つでコードを変更します。

1. ユーザーは、ローカルリポジトリから CodeCommit リポジトリに変更をプッシュします。

1. プッシュアクティビティは、CodeCommit リポジトリへのすべてのプッシュを受け取る Lambda 関数を開始します。

1. Lambda 関数は、 AWS Systems Managerの機能として Parameter Store のパラメータを読み取り、最新のコミット ID を取得します。パラメータには `/MonoRepoTrigger/{repository}/{branch_name}/LastCommit` 命名形式があります。パラメータが見つからない場合、Lambda 関数は CodeCommit リポジトリから最後のコミット ID を読み取り、戻り値をパラメータストアに保存します。

1. コミット ID と変更されたファイルを特定すると、Lambda 関数は各マイクロサービスディレクトリのパイプラインを識別し、必要な CodePipeline パイプラインを開始します。

## ツール
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-tools"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、コードでクラウドインフラストラクチャを定義し、それをプロビジョニングするためのソフトウェア開発フレームワークです CloudFormation。
+ [Python](https://www.python.org/) は、すばやく作業し、システムをより効果的に統合できるプログラミング言語です。

**コード**

このパターンのソースコードとテンプレートは、GitHub の [AWS CodeCommit monorepo multi-pipeline triggers](https://github.com/aws-samples/monorepo-multi-pipeline-trigger) リポジトリにあります。

## ベストプラクティス
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-best-practices"></a>
+ このサンプルアーキテクチャには、デプロイされたインフラストラクチャのモニタリングソリューションは含まれていません。このソリューションを本番環境にデプロイしたい場合は、モニタリングを有効にすることをお勧めします。詳細については、 AWS Serverless Application Model (AWS SAM) ドキュメントの[CloudWatch Application Insights を使用してサーバーレスアプリケーションをモニタリングする](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/monitor-app-insights.html)」を参照してください。
+ このパターンで提供されるサンプルコードを編集するときは、 AWS CDK ドキュメントの[クラウドインフラストラクチャを開発およびデプロイするためのベストプラクティス](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)に従ってください。
+ マイクロサービスパイプラインを定義するときは、 AWS CodePipeline ドキュメント[のセキュリティのベストプラクティス](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-best-practices.html)を確認してください。
+ [cdk-nag](https://github.com/cdklabs/cdk-nag) ユーティリティを使用して AWS CDK 、コードのベストプラクティスを確認することもできます。このツールは、パックごとにグループ化された一連のルールを使用してコードを評価します。使用可能なパックは次のとおりです。
  + [AWS ソリューションライブラリ](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#awssolutions)
  + [医療保険の相互運用性と責任に関する法律 (HIPAA) セキュリティ](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#hipaa-security)
  + [米国国立標準技術研究所 (NIST) 800-53 リビジョン 4](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#nist-800-53-rev-4)
  + [NIST 800-53 rev 5](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#nist-800-53-rev-5)
  + [Payment Card Industry Data Security Standard (PCI DSS) 3.2.1](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#pci-dss-321)

## エピック
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-epics"></a>

### 環境をセットアップする
<a name="set-up-the-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 仮想 Python 環境を作成します。 |  AWS Cloud9 IDE で、仮想 Python 環境を作成し、次のコマンドを実行して必要な依存関係をインストールします。`make install` | 開発者 | 
| の AWS アカウント と AWS リージョン をブートストラップします AWS CDK。 | 次のコマンドを実行して、必要な AWS アカウント とリージョンをブートストラップします。`make bootstrap account-id=<your-AWS-account-ID> region=<required-region>` | 開発者 | 

### マイクロサービス用の新しいパイプラインの追加
<a name="add-a-new-pipeline-for-a-microservice"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  サンプルコードをアプリケーションディレクトリに追加します。 | サンプルアプリケーションコードを含むディレクトリを、複製された GitHub [AWS CodeCommit monorepo multi-pipeline triggers](https://github.com/aws-samples/monorepo-multi-pipeline-trigger) リポジトリ内の `monorepo-sample` ディレクトリに追加します。 | 開発者 | 
| `monorepo-main.json` ファイルを編集します。 | アプリケーションのコードのディレクトリ名とパイプラインの名前を、複製されたリポジトリ内の `monorepo-main.json` ファイルに追加します。 | 開発者 | 
| パイプラインを作成します。 | リポジトリの `Pipelines` ディレクトリに、アプリケーションのパイプライン `class` を追加します。ディレクトリには、`pipeline_hotsite.py` と `pipeline_demo.py` の 2 つのサンプルファイルが含まれています。各ファイルには、ソース、ビルド、デプロイの 3 つのステージがあります。ファイルの 1 つをコピーして、アプリケーションの要件に応じて変更を加えることができます。  | 開発者 | 
| `monorepo_config.py` ファイルを編集します。 | `service_map` に、アプリケーションのディレクトリ名と、パイプライン用に作成したクラスを追加します。例えば、次のコードは、`MySamplePipeline`クラスで `pipeline_mysample.py` と名前が付けられたファイルを使用する `Pipelines` ディレクトリ内のパイプライン定義を示しています。<pre>...<br /># Pipeline definition imports<br />from pipelines.pipeline_demo import DemoPipeline<br />from pipelines.pipeline_hotsite import HotsitePipeline<br />from pipelines.pipeline_mysample import MySamplePipeline<br /><br />### Add your pipeline configuration here<br />service_map: Dict[str, ServicePipeline]  = {<br />    # folder-name -> pipeline-class<br />    'demo': DemoPipeline(),<br />    'hotsite': HotsitePipeline(),<br />    'mysample': MySamplePipeline()<br />}</pre> | 開発者 | 

### MonorePostack スタックをデプロイします。
<a name="deploy-the-monorepostack-stack"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  AWS CloudFormation スタックをデプロイします。 | `make deploy-core` コマンドを実行して、 AWS CloudFormation `MonoRepoStack`デフォルトのパラメータ値を持つスタックをクローンされたリポジトリのルートディレクトリにデプロイします。リポジトリの名前は、`make deploy-core monorepo-name=<repo_name>` コマンドを実行して変更できます。`make deploy monorepo-name=<repo_name>` コマンドを使用すると、両方のパイプラインを同時にデプロイできます。 | 開発者 | 
| CodeCommit リポジトリを検証します。 | `aws codecommit get-repository --repository-name <repo_name>` コマンドを実行して、リソースが作成されたことを確認します。 CloudFormation スタックはモノレポが保存されている CodeCommit リポジトリを作成するため、変更のプッシュを開始した場合は`cdk destroy MonoRepoStack `コマンドを実行しないでください。 | 開発者 | 
|  CloudFormation スタックの結果を検証します。 | 次のコマンドを実行して、 CloudFormation `MonoRepoStack`スタックが正しく作成および設定されていることを確認します。<pre>aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE --query 'StackSummaries[?StackName == 'MonoRepoStack']'</pre> | 開発者 | 

### PipelinesStack スタックをデプロイします。
<a name="deploy-the-pipelinesstack-stack"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  CloudFormation スタックをデプロイします。 |  AWS CloudFormation `PipelinesStack` スタックは、スタックをデプロイした後にデプロイする必要があります`MonoRepoStack`。monorepo のコードベースに新しいマイクロサービスが追加されるとスタックのサイズが大きくなり、新しいマイクロサービスが導入されるとスタックが再デプロイされます。`make deploy-pipelines` コマンドを実行して PipelinesStack スタックをデプロイします。`make deploy monorepo-name=<repo_name>` コマンドを実行して、両方のパイプラインを同時にデプロイすることもできます。以下の出力例は、実装の最後に `PipelinesStacks` デプロイメントによってマイクロサービスの URL がどのように出力されるかを示しています。<pre>Outputs:<br />PipelinesStack.demourl = .cloudfront.net<br />PipelinesStack.hotsiteurl = .cloudfront.net</pre> | 開発者 | 
|  AWS CloudFormation スタックの結果を検証します。 | 次のコマンドを実行して、 AWS CloudFormation `PipelinesStacks`スタックが正しく作成および設定されていることを確認します。<pre>aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE --query 'StackSummaries[?StackName == 'PipelinesStack']'</pre> | 開発者 | 

### リソースをクリーンアップする
<a name="clean-up-resources"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  AWS CloudFormation スタックを削除します。 | `make destroy` コマンドを実行します。 | 開発者 | 
| パイプラインの S3 バケットを削除します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 開発者 | 

## トラブルシューティング
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
|  AWS CDK 問題が発生しました。 | AWS CDK ドキュメントの「一般的な[AWS CDK 問題のトラブルシューティング](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)」を参照してください。 | 
| マイクロサービスコードをプッシュしましたが、マイクロサービスパイプラインは実行されませんでした。 | **セットアップの検証***ブランチ設定を確認します。*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)*設定ファイルを検証します。*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)**コンソールでのトラブルシューティング***AWS CodePipeline は以下をチェックします。*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)*AWS Lambda トラブルシューティング:*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 
| すべてのマイクロサービスを再デプロイする必要があります。 | すべてのマイクロサービスの再デプロイを強制するためには、2 つのアプローチがあります。要件に合ったオプションを選択してください。**アプローチ 1: Parameter Store でパラメータを削除する**このメソッドでは、デプロイに使用された最後のコミット ID を追跡する Systems Manager Parameter Store 内の特定のパラメータを削除します。このパラメータを削除すると、システムは新しい状態として認識するため、次のトリガーですべてのマイクロサービスを強制的に再デプロイします。手順:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)メリット:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)デメリット:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)**アプローチ 2: 各モノレポサブフォルダにコミットをプッシュする**この方法では、マイナーな変更を行い、モノレポ内の各マイクロサービスサブフォルダにプッシュし、個々のパイプラインを開始します。手順:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)メリット:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)デメリット:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 

## 関連リソース
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-resources"></a>
+ [CDK Pipelines を使用した継続的な統合と配信 (CI/CD)](https://docs.aws.amazon.com/cdk/latest/guide/cdk_pipeline.html) (AWS CDK ドキュメント)
+ [aws-cdk/pipelines モジュール](https://docs.aws.amazon.com/cdk/api/latest/docs/pipelines-readme.html) (AWS CDK API リファレンス)