AWS CDK と を使用して Amazon ECS Anywhere のハイブリッドワークロード用の CI/CD パイプラインをセットアップする GitLab - AWS 規範ガイダンス

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

AWS CDK と を使用して Amazon ECS Anywhere のハイブリッドワークロード用の CI/CD パイプラインをセットアップする GitLab

作成者: Dr. Rahul Sharad Gaikwad (AWS)

概要

注意: AWS CodeCommit は、新規顧客には利用できなくなりました。AWS CodeCommit の既存のお客様は、通常どおりサービスを引き続き使用できます。詳細はこちら

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

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

このパターンは、オンプレミスインフラストラクチャを使用してコンテナアプリケーションを実行し、 GitLab を使用してアプリケーションコードベースを管理するユーザーを支援するように設計されています。これらのワークロードは、既存のオンプレミスインフラストラクチャを妨げることなく、AWSクラウドサービスを使用して管理できます。

前提条件と制限

前提条件

  • アクティブ AWS アカウント。

  • オンプレミスインフラストラクチャ上で実行されるコンテナアプリケーション。 

  • アプリケーションコードベースを管理する GitLab リポジトリ。詳細については、「リポジトリ ()」を参照してくださいGitLab。

  • AWS コマンドラインインターフェイス (AWSCLI)、インストールおよび設定済み。詳細については、「 の最新バージョンのインストールまたは更新AWSCLI」(AWS CLIドキュメント) を参照してください。

  • AWS CDK ツールキット。グローバルにインストールおよび設定されています。詳細については、「Install the AWS CDK (AWS CDKドキュメント)」を参照してください。

  • npm。 AWSCDKにインストールされ、設定されています TypeScript。詳細については、「Node.js と npm のダウンロードとインストール」 (npm ドキュメント) を参照してください。

機能制限

製品バージョン

  • AWS CDK Toolkit バージョン 2.27.0 以降

  • npm バージョン 7.20.3 以降

  • Node.js バージョン 16.6.1 以降

アーキテクチャ

ターゲットテクノロジースタック

  • 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 システムマネージャー

  • GitLab リポジトリ

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

Amazon ECSクラスターと CI/CD パイプラインのセットアップのアーキテクチャ図。

この図は、このパターンで説明されている 2 つの主要なワークフロー、Amazon ECSクラスターのプロビジョニングとCI/CD pipeline that sets up and deploys the CI/CDパイプラインの設定を次のように表しています。

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

    1. 最初のAWSCDKスタックをデプロイすると、 に CloudFormation スタックが作成されますAWS。

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

    3. Amazon ECSクラスターに外部インスタンスを登録するには、VM に AWS Systems Manager Agent (SSM エージェント) をインストールし、VM を AWS Systems Manager マネージドインスタンスとして登録する必要があります。 

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

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

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

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

    1. 2 番目のAWSCDKスタックをデプロイすると、 に別の CloudFormation スタックが作成されますAWS。

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

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

    4. GitLab リポジトリは自動的に CodeCommit リポジトリにレプリケートされます。

    5. CodeCommit リポジトリの更新が自動的に開始されます CodePipeline。 

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

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

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

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

自動化とスケール

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

ツール

AWS サービス

  • AWS Cloud Development Kit (AWS CDK) は、コードでAWSクラウドインフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。

  • AWS CodeCommit は、独自のソース管理システムを管理することなく、Git リポジトリをプライベートに保存および管理できるバージョン管理サービスです。

  • AWS CodePipeline を使用すると、ソフトウェアリリースのさまざまな段階を迅速にモデル化して設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化できます。

  • AWS コマンドラインインターフェイス (AWS CLI) は、コマンドラインシェルのコマンドを使用して AWSサービスとやり取りするのに役立つオープンソースツールです。

  • Amazon Elastic Container Registry (Amazon ECR) は、安全でスケーラブル、信頼性の高いマネージドコンテナイメージレジストリサービスです。

  • Amazon Elastic Container Service (Amazon ECS) は、クラスター上のコンテナの実行、停止、管理に役立つ、高速でスケーラブルなコンテナ管理サービスです。このパターンでは、Amazon ECS Anywhere も使用しています。Amazon Anywhere は、オンプレミスサーバーまたは VM を Amazon ECSクラスターに登録するためのサポートを提供します。

その他のツール

  • Node.js は、スケーラブルなネットワークアプリケーションを構築するために設計されたイベント駆動型の JavaScript ランタイム環境です。

  • npm は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイ管理に使用されます。

  • Vagrant は、ポータブルな仮想ソフトウェア開発環境を構築して保守するためのオープンソースユーティリティです。デモンストレーション用に、このパターンでは Vagrant を使用してオンプレミスの VM を作成します。

コードリポジトリ

このパターンのコードは、 GitHub AWSリポジトリを使用した Amazon ECS Anywhere の CI/CD パイプラインCDKで使用できます。

ベストプラクティス

このパターンをデプロイする場合は、以下のベストプラクティスを考慮してください。

エピック

タスク説明必要なスキル

AWS CDK バージョンを確認します。

次のコマンドを入力して、AWSCDKToolkit のバージョンを確認します。

cdk --version

このパターンには、バージョン 2.27.0 以降が必要です。以前のバージョンがある場合は、AWSCDKドキュメントの指示に従って更新します。

DevOps エンジニア

npm バージョンを検証します。

次のコマンドを実行して、npm のバージョンを検証します。

npm --version

このパターンには、バージョン 7.20.3 以降が必要です。以前のバージョンを使用している場合は、「npm ドキュメント」の指示に従って更新してください。

DevOps エンジニア

AWS 認証情報を設定します。

aws configure コマンドを入力し、プロンプトに従ってAWS認証情報を設定します。

$aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
DevOps エンジニア
タスク説明必要なスキル

AWS CDK コードリポジトリのクローンを作成します。

  1. 次のコマンドを入力して、このパターンのAWSリポジトリを使用して Amazon ECS Anywhere の CI/CD パイプラインCDKをクローンします。

    git clone https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample.git
  2. 次のコマンドを実行して、クローンされたディレクトリに移動します。

    cd amazon-ecs-anywhere-cicd-pipeline-cdk-sample
DevOps エンジニア

環境を起動します。

次のコマンドを入力して、使用するアカウントとAWSリージョンに CloudFormation テンプレートをデプロイします。

cdk bootstrap <account-number>/<Region>

詳細については、 AWSCDKドキュメントの「ブートストラップ」を参照してください。

DevOps エンジニア
タスク説明必要なスキル

パッケージの依存関係をインストールし、 TypeScript ファイルをコンパイルします。

パッケージの依存関係をインストールし、次のコマンドを入力して TypeScript ファイルをコンパイルします。

$cd EcsAnywhereCdk $npm install $npm fund

これらのコマンドは、すべてのパッケージをサンプルリポジトリからインストールします。詳細については、npm ドキュメントの「npm ci」と「npm install」を参照してください。これらのコマンドを入力したときに、紛失したパッケージに関するエラーが表示された場合は、このパターンの[トラブルシューティング]のセクションを参照してください。

DevOps エンジニア

プロジェクトをビルドします。

プロジェクトコードをビルドするには、以下のコマンドを入力します。

npm run build

プロジェクトの構築とデプロイの詳細については、 AWSCDKドキュメントの「最初のAWSCDKアプリ」を参照してください。

DevOps エンジニア

Amazon ECS Anywhere インフラストラクチャスタックをデプロイします。

  1. 次のコマンドを実行して、スタックを一覧表示します。

    $cdk list
  2. 出力が EcsAnywhereInfraStack スタックと ECSAnywherePipelineStack スタックを返すことを確認します。

  3. 次のコマンドを実行して、EcsAnywhereInfraStack スタックをデプロイします。

    $cdk  deploy EcsAnywhereInfraStack
DevOps エンジニア

スタックの作成と出力を検証します。

  1. AWS マネジメントコンソールにサインインし、 で CloudFormation コンソールを開きますhttps://console.aws.amazon.com/cloudformation/

  2. [スタック] ページで、EcsAnywhereInfraStack スタックを選択します。

  3. スタックの状態が CREATE_IN_PROGRESS または CREATE_COMPLETE であることを確認します。

    Amazon ECSクラスターのセットアップには時間がかかる場合があります。スタックの作成が完了するまで、先に進まないでください。

DevOps エンジニア
タスク説明必要なスキル

VM をセットアップします

Vagrantfile が配置されているルートディレクトリから vagrant up コマンドを実行して Vagrant VM を作成します。詳細については、「Vagrant ドキュメント」を参照してください。

DevOps エンジニア

VM を外部インスタンスとして登録します。

  1. vagrant ssh コマンドを使用して Vagrant VM にログインします。詳細については、「Vagrant ドキュメント」を参照してください。

  2. AWS CLI インストールAWS手順に従って次のコマンドを入力して、VM に CLI をインストールします。 

    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ > -o "awscliv2.zip" $sudo apt install unzip $unzip awscliv2.zip $sudo ./aws/install $aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
  1. VM を AWS Systems Manager に登録し、外部インスタンスをアクティブ化するために使用できるアクティベーションコードと ID を作成します。このコマンドの出力には、アクティベーション ID とアクティベーションコード値が含まれます。

    aws ssm create-activation \ > --iam-role EcsAnywhereInstanceRole \ > | tee ssm-activation.json

    このコマンドを実行したときにエラーが発生した場合は、「トラブルシューティング」セクションを参照してください。

  2. アクティベーション ID とコード値を出力します。

    export ACTIVATION_ID=<activation-ID> export ACTIVATION_CODE=<activation-code>
  3. インストールスクリプトを仮想マシンにダウンロードします。 

    curl --proto "https" -o "ecs-anywhere-install.sh" \ > "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"
  4. インストールスクリプトを実行します。

    sudo bash ecs-anywhere-install.sh \ --cluster EcsAnywhereCluster \ --activation-id $ACTIVATION_ID \ --activation-code $ACTIVATION_CODE \ --region <region-name>

これにより、VM が Amazon ECS Anywhere 外部インスタンスとして設定され、そのインスタンスが Amazon ECSクラスターに登録されます。詳細については、Amazon ECSドキュメントの「外部インスタンスをクラスターに登録する」を参照してください。問題が発生した場合は、「トラブルシューティング」セクションを参照してください。

DevOps エンジニア

Amazon ECS Anywhere と外部 VM のステータスを確認します。

VM が Amazon ECSコントロールプレーンに接続され、実行されていることを確認するには、次のコマンドを使用します。

$aws ssm describe-instance-information $aws ecs list-container-instances --cluster $CLUSTER_NAME
DevOps エンジニア
タスク説明必要なスキル

CodeCommit リポジトリにブランチを作成します。

CodeCommit リポジトリの最初のコミットを作成して、リポジトリmainに という名前のブランチを作成します。AWS ドキュメントに従ってコミット CodeCommitを作成できます。コマンドの例を次に示します。

aws codecommit put-file \ --repository-name EcsAnywhereRepo \ --branch-name main \ --file-path README.md \ --file-content "Test" \ --name "Dev Ops" \ --email "devops@example.com" \ --commit-message "Adding README."
DevOps エンジニア

リポジトリのミラーリングを設定します。

外部ソースとの間で GitLab リポジトリをミラーリングできます。ソースとして使用するリポジトリを選択できます。ブランチ、タグ、コミットは自動的に同期されます。アプリケーションをホストする GitLab リポジトリと CodeCommit リポジトリの間にプッシュミラーを設定します。手順については、「 から GitLab へのプッシュミラーのセットアップ CodeCommit (GitLab ドキュメント)」を参照してください。

注記

デフォルトでは、ミラーリングによってリポジトリが自動的に同期されます。リポジトリを手動で更新する場合は、「ミラーの更新 (GitLab ドキュメント)」を参照してください。

DevOps エンジニア

CI/CD パイプラインスタックをデプロイする

次のコマンドを実行して、EcsAnywherePipelineStack スタックをデプロイします。

$cdk deploy EcsAnywherePipelineStack
DevOps エンジニア

CI/CD パイプラインをテストします。

  1. アプリケーションコードを変更し、ソースのオンプレミス GitLab リポジトリにプッシュします。詳細については、「プッシュオプション (GitLab ドキュメント)」を参照してください。たとえば、../application/index.html ファイルを編集してアプリケーションのバージョン値を更新します。

  2. コードが CodeCommit リポジトリにレプリケートされると、CI/CD パイプラインが開始されます。次のいずれかを行います。

    • 自動ミラーリングを使用して GitLab リポジトリを CodeCommit リポジトリと同期させる場合は、次のステップに進みます。

    • 手動ミラーリングを使用している場合は、「ミラーの更新 (GitLab ドキュメント)」の手順に従って、アプリケーションコードの変更を CodeCommit リポジトリにプッシュします。

  3. ローカルマシンのウェブブラウザーで http://localhost:80 と入力します。ポート 80 が Vagrantfile の localhost に転送されるため、NGINXウェブページが開きます。更新されたアプリケーションバージョン値が表示されることを確認します。これにより、パイプラインとイメージのデプロイが検証されます。

  4. (オプション) AWSマネジメントコンソールでデプロイを検証する場合は、次の手順を実行します。

    1. で Amazon ECSコンソールを開きますhttps://console.aws.amazon.com/ecs/

    2. ナビゲーションバーから、使用するリージョンを選択します。

    3. ナビゲーションペインで [Clusters] (クラスター) を選択します。

    4. クラスターページで、EcsAnywhereClusterクラスターを選択します。

    5. [タスク定義] を選択します。

    6. コンテナが稼働していることを確認します。 

DevOps エンジニア
タスク説明必要なスキル

リソースをクリーンアップして削除します。

このパターンを実行したら、作成したリソースを削除 proof-of-conceptする必要があります。クリーンアップするには、次のコマンドを実行します。

$cdk destroy EcsAnywherePipelineStack $cdk destroy EcsAnywhereInfraStack
DevOps エンジニア

トラブルシューティング

問題ソリューション

パッケージ依存関係のインストール中にパッケージが見つからない場合のエラー。

次のコマンドのいずれかを実行して、見つからないパッケージを解析します。

$npm ci

or

$npm install -g @aws-cdk/<package_name>

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 エージェントを再起動します。

$vagrant ssh $sudo systemctl restart ecs $sudo systemctl status ecs

関連リソース