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

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

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

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

コードリポジトリ: amazon-ecs-anywhere-cicd-pipeline-cdk-sample

環境:PoC またはパイロット

テクノロジー: ハイブリッドクラウド、コンテナとマイクロサービス、インフラストラクチャ、 DevOps

ワークロード: オープンソース

AWS サービス: AWS CDK、AWS CodePipeline、Amazon ECS、AWSSystems Manager、 AWS CodeCommit

[概要]

注意: 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 Kit (AWS) CDKスタックを使用して Amazon ECS Anywhere インスタンスで Amazon ECSクラスターをプロビジョニングするアプローチについて説明します。次に、 AWS CodePipeline を使用して、継続的統合と継続的デプロイ (CI/CD) パイプラインを設定します。次に、 GitLab コードリポジトリを にレプリケートAWS CodeCommit し、コンテナ化されたアプリケーションを Amazon ECSクラスターにデプロイします。

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

前提条件と制限

前提条件

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

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

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

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

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

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

機能制限

製品バージョン

  • AWS CDK ツールキットバージョン 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 System Manager

  • 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 エージェント (SSM エージェント) をインストールし、VM を AWS Systems Manager マネージドインスタンスとして登録する必要があります。 

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

    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クラスターにデプロイします。

自動化とスケール

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

ツール

AWS サービス

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

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

  • AWS CodePipeline は、ソフトウェアリリースのさまざまなステージを迅速にモデル化して設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。

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

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

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

その他のツール

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

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

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

コードリポジトリ

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

ベストプラクティス

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

エピック

タスク説明必要なスキル

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

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

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. インストール手順に従って、次のコマンドを入力して VM AWS CLI に をインストールします。 AWS 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

または

$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

関連リソース