

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

# AWS CDK と GitLab を使用して、Amazon ECS Anywhere 上のハイブリッドワークロード用に CI/CD パイプラインを設定する
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab"></a>

*Rafael Ortiz、Amazon Web Services*

## 概要
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-summary"></a>

Amazon ECS Anywhere は、Amazon Elastic Container Service (Amazon ECS) の拡張機能です。オンプレミスサーバーや仮想マシン (VM) などの*外部インスタンス*を Amazon ECS クラスターに登録するためのサポートを提供します。この機能は、コストを削減し、ローカルコンテナの複雑なオーケストレーションやオペレーションを軽減します。ECS Anywhere を使用して、オンプレミス環境とクラウド環境の両方でコンテナアプリケーションをデプロイして実行できます。これにより、チームが複数のドメインやスキルセットを習得したり、複雑なソフトウェアを独自に管理したりする必要がなくなります。

このパターンは、Amazon Web Services (AWS) Cloud Development Kit (AWS CDK) スタックを使用して Amazon ECS Anywhere インスタンスで Amazon ECS クラスターをプロビジョニングする段階的なアプローチを説明しています。　 次に、AWS CodePipeline を使用して継続的な統合と継続的なデプロイ (CI/CD) パイプラインを設定します。次に、GitLab コードリポジトリを AWS CodeCommit に複製し、コンテナ化されたアプリケーションを Amazon ECS クラスターにデプロイします。

このパターンは、オンプレミスインフラストラクチャを使用してコンテナアプリケーションを実行したり、GitLab を使用してアプリケーションコードベースを管理するユーザーに役立つように設計されています。これらのワークロードは、既存のオンプレミスインフラストラクチャに影響を与えずに、AWS クラウドサービスで管理できます。

## 前提条件と制限
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ オンプレミスインフラストラクチャ上で実行されるコンテナアプリケーション。　
+ アプリケーションコードベースを管理する GitLab リポジトリ。　 詳細については、「[リポジトリ](https://docs.gitlab.com/ee/user/project/repository/)」 (GitLab) を参照してください。
+ AWS コマンドラインインターフェイス (AWS CLI) をインストールして設定済み。詳細については、「[AWS CLI の最新バージョンをインストールまたはアップデート](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」 (AWS CLIのドキュメント) を参照してください。
+ AWS CDK ツールキットがインストール済みおよびグローバルに設定済み 詳細については、「[AWS CDK をインストールする](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)」 (AWS CDK ドキュメント) を参照してください。
+ npm、TypeScript で AWS CDK 用にインストールおよび設定されています。詳細については、「[Node.js と npm のダウンロードとインストール](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)」 (npm ドキュメント) を参照してください。

**機能制限**
+ 制限と考慮事項については、Amazon ECS ドキュメントの「[外部インスタンス (Amazon ECS Anywhere)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations)」を参照してください。

**製品バージョン**
+ AWS CDK ツールキットバージョン 2.27.0 以降
+ npm バージョン 7.20.3 以降
+ Node.js バージョン 16.6.1 以降

## アーキテクチャ
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-architecture"></a>

**ターゲットテクノロジースタック**
+ AWS CDK
+ AWS CloudFormation
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodePipeline
+ Amazon ECS Anywhere
+ Amazon Elastic Container Registry (Amazon ECR)
+ AWS Identity and Access Management (IAM)
+ AWS Systems Manager
+ GitHub リポジトリ

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

![\[Amazon ECS クラスターと CI/CD パイプラインをセットアップするためのアーキテクチャ図。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/b0f35986-a839-4b01-8eb0-4748182ddafc/images/85b8d4d9-3591-4d69-a54b-64aa543498f1.png)


この図は、このパターンで説明されている 2 つの主なワークフロー、つまり Amazon ECS クラスターのプロビジョニングと、CI/CD パイプラインをセットアップしてデプロイする CI/CD パイプラインの設定を以下のように表しています。

1. **Amazon ECS クラスターのプロビジョニング**

   1. AWS CDK スタックをデプロイする場合、AWS に CloudFormation スタックが作成されます。

   1. この CloudFormation スタックは Amazon ECS クラスターと関連する AWS リソースをプロビジョニングします。

   1. Amazon ECS クラスターに外部インスタンスを登録するには、仮想マシン (VM) に AWS Systems Manager Agent (SSM Agent) をインストールし、その VM を AWS Systems Manager 管理型のインスタンスとして登録する必要があります。 

   1. また、Amazon ECS コンテナエージェントと Docker を VM にインストールして、Amazon ECS クラスターの外部インスタンスとして登録する必要があります。

   1. 外部インスタンスを Amazon ECS クラスターに登録して設定すると、外部インスタンスとして登録された VM 上で複数のコンテナを実行できます。

   1. Amazon ECS クラスターはアクティブで、コンテナを介してアプリケーションワークロードを実行できます。　 Amazon ECS Anywhere コンテナインスタンスはオンプレミス環境で実行されますが、クラウドの Amazon ECS クラスターに関連付けられています。　

1. **CI/CD パイプラインのセットアップとデプロイ**

   1. 2 つ目の AWS CDK スタックをデプロイする場合、AWS に CloudFormation スタックが作成されます。

   1. この CloudFormation スタックは、CodePipeline および関連のある AWS リソースにパイプラインをプロビジョニングします。

   1. アプリケーションコードの変更をオンプレミスの GitLab リポジトリにプッシュしてマージします。 

   1. GitLab リポジトリは CodeCommit リポジトリに自動的に複製されます。　

   1. CodeCommit リポジトリを更新すると、CodePipeline が自動的に起動します。 

   1. CodePipeline は CodeCommit からコードをコピーし、CodeBuild にデプロイ可能なアプリケーションビルドを作成します。　

   1. CodePipeline は CodeBuild ビルド環境の Docker イメージを作成し、Amazon ECR リポジトリにプッシュします。

   1. CodePipeline は、Amazon ECR リポジトリからコンテナイメージをプルする CodeDeploy アクションを開始します。　

   1. CodePipeline は Amazon ECS クラスターにコンテナイメージをデプロイします。　

**自動化とスケール**

このパターンでは、AWS CDK をコードとしての Infrastructure as Code (IaC) ツールとして使用して、このアーキテクチャを設定してデプロイします。AWS CDK は、AWS リソースのオーケストレーションと Amazon ECS Anywhere と CI/CD パイプラインのセットアップに役立ちます。

## ツール
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-tools"></a>

**AWS サービス**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) は、独自のソースコントロールシステムを管理しなくても、Git リポジトリを非公開で保存および管理できるバージョン管理サービスです。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージのレジストリサービスです。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) は、クラスターでコンテナの実行、停止、管理を支援する、高速でスケーラブルなコンテナ管理サービスです。このパターンは、オンプレミスサーバーまたは VM を Amazon ECS クラスターに登録するためのサポートを提供する [Amazon ECS Anywhere](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html) も使用します。

**その他のツール**
+ [Node.js](https://nodejs.org/en/docs/) は、スケーラブルなネットワークアプリケーションを構築するために設計された、イベント駆動型の JavaScript ランタイム環境です。
+ [npm](https://docs.npmjs.com/about-npm) は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイ管理に使用されます。
+ [Vagrant](https://developer.hashicorp.com/vagrant/docs) は、ポータブルな仮想ソフトウェア開発環境を構築して保守するためのオープンソースユーティリティです。デモンストレーション用に、このパターンでは Vagrant を使用してオンプレミスの VM を作成します。

**コードリポジトリ**

このパターンのコードは、GitHub 内の「[AWS CDK を使用した Amazon ECS Anywhere の CI/CD パイプライン](https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample)」リポジトリで利用できます。

## ベストプラクティス
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-best-practices"></a>

このパターンをデプロイする場合は、以下のベストプラクティスを考慮してください。
+ [「AWS CDK でクラウドインフラストラクチャを開発およびデプロイするためのベストプラクティス」](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)
+ [「AWS CDK でクラウドアプリケーションを開発するためのベストプラクティス」](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) (AWS ブログ記事)

## エピック
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-epics"></a>

### AWS CDK の設定を検証する
<a name="verify-the-aws-cdk-configuration"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS CDK のバージョンを検証します。 | 次のコマンドを実行して、AWS CDK Toolkit のバージョンを検証します。<pre>cdk --version</pre>このパターンには、バージョン 2.27.0 以降が必要です。以前のバージョンを使用している場合は、「[AWS CDK ドキュメント](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)」の指示に従って更新してください。 | DevOps エンジニア | 
| npm バージョンを検証します。 | 次のコマンドを実行して、npm のバージョンを検証します。<pre>npm --version</pre>このパターンには、バージョン 7.20.3 以降が必要です。以前のバージョンを使用している場合は、「[npm ドキュメント](https://docs.npmjs.com/try-the-latest-stable-version-of-npm)」の指示に従って更新してください。 | DevOps エンジニア | 
| AWS 認証情報を設定します。 | 認証情報を設定するには、`aws configure` のコマンドを実行し、プロンプトに従ってください。<pre>$aws configure<br />AWS Access Key ID [None]: <your-access-key-ID><br />AWS Secret Access Key [None]: <your-secret-access-key><br />Default region name [None]: <your-Region-name><br />Default output format [None]:</pre> | DevOps エンジニア | 

### AWS CDK 環境のブートストラップ
<a name="bootstrap-the-aws-cdk-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS SAM コードリポジトリを複製します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps エンジニア | 
| 環境を起動します。 | 次ののコマンドを実行して、使用したいアカウントと AWS リージョンに AWS CloudFormation テンプレートをデプロイします。<pre>cdk bootstrap <account-number>/<Region></pre>詳細については、AWS CDK ドキュメントの「[ブートストラップ](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)」を参照してください。 | DevOps エンジニア | 

### Amazon ECS Anywhere 向けインフラストラクチャの構築とデプロイ
<a name="build-and-deploy-the-infrastructure-for-amazon-ecs-anywhere"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| パッケージの依存関係をインストールし、TypeScript ファイルをコンパイルします。 | パッケージの依存関係をインストールし、次のコマンドを実行して TypeScript ファイルをコンパイルします。<pre>$cd EcsAnywhereCdk<br />$npm install<br />$npm fund </pre>これらのコマンドは、すべてのパッケージをサンプルリポジトリからインストールします。詳細については、npm ドキュメントの「[npm ci](https://docs.npmjs.com/cli/v7/commands/npm-ci)」と「[npm install](https://docs.npmjs.com/cli/v7/commands/npm-install)」を参照してください。これらのコマンドを入力したときに、紛失したパッケージに関するエラーが表示された場合は、このパターンの[[トラブルシューティング](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting)]のセクションを参照してください。 | DevOps エンジニア | 
| プロジェクトをビルドします。 | プロジェクトコードをビルドするには、以下のコマンドを入力します。<pre>npm run build</pre>プロジェクトの構築とデプロイの詳細については、AWS CDK ドキュメントの「[初めての AWS CDK アプリケーション](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#:~:text=the%20third%20parameter.-,Synthesize%20an%20AWS%20CloudFormation%20template,-Synthesize%20an%20AWS)」を参照してください。 | DevOps エンジニア | 
| Amazon ECS Anywhere 向けインフラストラクチャスタックをデプロイします | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps エンジニア | 
| スタックの作成と出力を検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps エンジニア | 

### オンプレミス VM の設定
<a name="set-up-an-on-premises-vm"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| VM をセットアップします | Vagrantfile が配置されているルートディレクトリから `vagrant up` コマンドを実行して Vagrant VM を作成します。詳細については、「[Vagrant ドキュメント](https://developer.hashicorp.com/vagrant/docs/cli/up)」を参照してください。 | DevOps エンジニア | 
| VM を外部インスタンスとして登録します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)これにより、VM が Amazon ECS Anywhere の外部インスタンスとして設定され、Amazon ECS クラスターに登録されます。詳細については、Amazon ECS のドキュメントの「[クラスターへの外部インスタンスの登録](https://docs.amazonaws.cn/en_us/AmazonECS/latest/developerguide/ecs-anywhere-registration.html)」を参照してください。問題が発生した場合は、「[トラブルシューティング](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting)」セクションを参照してください。 | DevOps エンジニア | 
| Amazon ECS Anywhere と外部 VM のステータスを検証してください。 | VM が Amazon ECS コントロールプレーンに接続され、稼働していることを検証するには、以下のコマンドを使用します。<pre>$aws ssm describe-instance-information<br />$aws ecs list-container-instances --cluster $CLUSTER_NAME</pre> | DevOps エンジニア | 

### CI/CD パイプラインをデプロイする
<a name="deploy-the-ci-cd-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS CodeCommit リポジトリにブランチを作成します。 | 最初のリポジトリのコミットを作成して、CodeCommit リポジトリに `main` というブランチを作成します。AWS のドキュメントに従って、[CodeCommit にコミットを作成する](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-commit.html#create-first-commit)ことができます。コマンドの例を次に示します。<pre>aws codecommit put-file \<br />  --repository-name EcsAnywhereRepo \<br />  --branch-name main \<br />  --file-path README.md \<br />  --file-content "Test" \<br />  --name "Dev Ops" \<br />  --email "devops@example.com" \<br />  --commit-message "Adding README."</pre> | DevOps エンジニア | 
| リポジトリのミラーリングを設定します。 | GitLab リポジトリを外部ソースとの間でミラーリングできます。　 ソースとして使用するリポジトリを選択できます。ブランチ、タグ、コミットは自動的に同期されます。アプリケーションをホストする GitLab リポジトリと CodeCommit リポジトリの間でプッシュミラーを設定します。手順については、「[GitLab から CodeCommit へのプッシュミラーの設定](https://docs.gitlab.com/ee/user/project/repository/mirror/push.html#set-up-a-push-mirror-from-gitlab-to-aws-codecommit)」（GitLab ドキュメント）を参照してください。デフォルトでは、ミラーリングによってリポジトリが自動的に同期されます。リポジトリを手動で更新する場合は、「[ミラーの更新](https://docs.gitlab.com/ee/user/project/repository/mirror/#update-a-mirror)」(GitLab ドキュメント) を参照してください。 | DevOps エンジニア | 
| CI/CD パイプラインスタックをデプロイする | 次のコマンドを実行して、`EcsAnywherePipelineStack` スタックをデプロイします。<pre>$cdk  deploy EcsAnywherePipelineStack</pre> | DevOps エンジニア | 
| CI/CD パイプラインをテストします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps エンジニア | 

### クリーンアップ
<a name="clean-up"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リソースをクリーンアップして削除します。 | このパターンが完了したら、作成した概念実証リソースを削除する必要があります。クリーンアップするには、次のコマンドを実行します。<pre>$cdk destroy EcsAnywherePipelineStack<br />$cdk destroy EcsAnywhereInfraStack</pre> | DevOps エンジニア | 

## トラブルシューティング
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| パッケージ依存関係のインストール中にパッケージが見つからない場合のエラー。 | 次のコマンドのいずれかを実行して、見つからないパッケージを解析します。<pre>$npm ci</pre>または<pre>$npm install -g @aws-cdk/<package_name></pre> | 
| VM 上で `aws ssm create-activation` コマンドを実行すると、次のエラーが発生します。`An error occurred (ValidationException) when calling the CreateActivation operation: Nonexistent role or missing ssm service principal in trust policy: arn:aws:iam::000000000000:role/EcsAnywhereInstanceRole` | `EcsAnywhereInfraStack` スタックは完全にデプロイされておらず、このコマンドを実行するために必要な IAM ロールもまだ作成されていません。CloudFormation コンソールでスタックの状態を確認します。ステータスが `CREATE_COMPLETE` に変更したら、コマンドを再試行します。 | 
| Amazon ECS ヘルスチェックで `UNHEALTHY` が返され、Amazon ECS コンソール内でクラスターの [**サービス**] セクションに次のエラーが表示されます。`service EcsAnywhereService was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.` | 次のコマンドを実行して、Vagrant VM の Amazon ECS エージェントを再起動します。<pre>$vagrant ssh<br />$sudo systemctl restart ecs<br />$sudo systemctl status ecs</pre> | 

## 関連リソース
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-resources"></a>
+ 「[Amazon ECS Anywhere マーケティングページ](https://aws.amazon.com/ecs/anywhere/)」
+ 「[Amazon ECS Anywhere のドキュメント](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations)」
+ 「[Amazon ECS Anywhere デモ](https://www.youtube.com/watch?v=-eud6yUXsJM)」(ビデオ)
+ 「[Amazon ECS Anywhere ワークショップサンプル](https://github.com/aws-samples/aws-ecs-anywhere-workshop-samples)」
+ [「リポジトリ ミラーリング」](https://docs.gitlab.com/ee/user/project/repository/mirror/) (GitLab ドキュメント)