Amazon Elastic Container Serviceへのデプロイ

このステップバイステップのガイドは、GitLab.comでホストされているプロジェクトをAmazonElastic Container Service(ECS) にデプロイするのに役立ちます。

このガイドでは、まずAWSコンソールを使って手動でECSクラスターを作成します。GitLabテンプレートから作成したシンプルなアプリケーションを作成し、デプロイします。

これらの手順は、SaaSとセルフマネージドGitLabインスタンスの両方で動作します。自分のRunnerが設定されていることを確認してください。

前提条件

  • AWSアカウント。既存のAWSアカウントでサインインするか、新規アカウントを作成します。
  • このガイドでは、us-east-2 リージョンにインフラストラクチャを作成します。任意のリージョンを使用できますが、開始後に変更しないでください。

インフラストラクチャの作成と AWS での初期デプロイ

GitLabからアプリケーションをデプロイするには、まずAWS上にインフラストラクチャと初期デプロイを作成する必要があります。これには、ECSクラスターとECSタスク定義ECSサービス、コンテナ化されたアプリケーションイメージなどの関連コンポーネントが含まれます。

ここでの最初のステップでは、プロジェクトテンプレートからデモアプリケーションを作成します。

テンプレートから新しいプロジェクトを作成します。

GitLab プロジェクトのテンプレートを使って始めましょう。名前が示すように、これらのプロジェクトはいくつかの有名なフレームワーク上に構築されたベアボーンアプリケーションを提供します。

  1. GitLab で、ナビゲーションバーの一番上にあるプラスアイコン({プラス四角}) を選択し、New project を選択します。

  2. Create from template を選択し、Ruby on Rails、Spring、NodeJS Express プロジェクトから選択します。このガイドでは、Ruby on Railsテンプレートを使用します。

    Select project template

  3. プロジェクトに名前を付けます。この例では、ecs-demo と名付けます。GitLab Ultimate プランで利用できる機能を活用するために、プロジェクトを公開しましょう。

  4. Create projectを選択します。

デモ・プロジェクトを作成したので、アプリケーションをコンテナ化してコンテナ・レジストリにプッシュする必要があります。

コンテナ化したアプリケーションイメージを GitLab コンテナレジストリにプッシュします。

ECSはコンテナオーケストレーションサービスであるため、インフラ構築時にコンテナ化されたアプリケーションイメージを提供する必要があります。そのためには、GitLabAuto Buildと コンテナレジストリを使います。

  1. GitLabのecs-demoプロジェクトにアクセスしてください。
  2. Setup up CI/CDを選択します。.gitlab-ci.yml の作成フォームが表示されます。
  3. 空の.gitlab-ci.ymlに以下の内容をコピー&ペーストします。 これは、ECSへの継続的デプロイのパイプラインを定義します。

    include:
      - template: AWS/Deploy-ECS.gitlab-ci.yml
    
  4. 変更のコミット]を選択します。自動的に新しいパイプラインがトリガーされます。このパイプラインでは、build ジョブがアプリケーションをコンテナ化し、GitLab コンテナレジストリにイメージをプッシュします。

    Create project

  5. Deploy > Container Registry にアクセスしてください。アプリケーションイメージがプッシュされたことを確認します。

    Create project

これで、AWS からプルできるコンテナ化されたアプリケーションイメージができました。次に、このアプリケーションイメージを AWS でどのように使用するかの仕様を定義します。

ECSクラスタがまだ接続されていないため、production_ecs のジョブが失敗することに注意してください。これは後で修正します。

ECSタスク定義の作成

ECSタスク定義はECSサービスによるアプリケーション・イメージの起動方法に関する仕様です。

  1. AWSコンソールの ECS > Task Definitionsに移動します。
  2. Create new Task Definitionを選択します。

    Create project

  3. 起動タイプとしてEC2を選択します。Next Stepを選択します。
  4. ecs_demoタスク定義名に設定します。
  5. 512 を「タスクサイズ > タスクメモリと タスクCPU」に設定します。
  6. コンテナ定義]>[コンテナを追加]を選択します。コンテナ登録フォームが開きます。
  7. webコンテナ名に設定します。
  8. registry.gitlab.com/<your-namespace>/ecs-demo/master:latestImage に設定します。あるいは、GitLabコンテナレジストリページからイメージパスをコピー&ペーストすることもできます。

    Create project

  9. ポートマッピングを追加します。80ホストポートに、5000コンテナポートに設定します。

    Create project

  10. 作成を選択します。

これで初期タスクの定義ができました。次に、アプリケーション・イメージを実行する実際のインフラストラクチャを作成します。

ECSクラスターの作成

ECSクラスターはECSサービスの仮想グループです。また、計算リソースとしてEC2またはFargateに関連付けられています。

  1. AWSコンソールで ECS > クラスターに移動します。
  2. Create Clusterを選択します。
  3. クラスタテンプレートとしてEC2 Linux + Networkingを選択します。Next Stepを選択します。
  4. ecs-demoクラスター名に設定します。
  5. Networking]でデフォルトのVPCを選択します。既存のVPCがない場合は、そのままにして新しいVPCを作成できます。
  6. VPCの利用可能なすべてのサブネットを「サブネット」に設定します。
  7. 作成を選択します。
  8. ECSクラスターが正常に作成されたことを確認します。

    Create project

これで、次のステップでECSサービスをECSクラスターに登録できます。

以下に注意してください。

  • オプションで、作成フォームにSSHキーペアを設定できます。これにより、デバッグのためにEC2インスタンスにSSH接続できるようになります。
  • 既存のVPCを選択しない場合、デフォルトで新しいVPCが作成されます。そのため、アカウントのインターネットゲートウェイの最大許容数に達するとエラーが発生する可能性があります。
  • クラスターにはEC2インスタンスが必要で、インスタンスタイプに応じてコストがかかります。

ECSサービスの作成

ECSサービスは、ECSタスク定義に基づいてアプリケーションコンテナを作成するデーモンです。

  1. AWSコンソールで ECS > クラスター > ecs-demo > サービスに移動します。
  2. デプロイを選択します。サービス作成フォームが開きます。
  3. Launch TypeEC2 を選択します。
  4. ecs_demoタスク定義に設定します。これは上記で作成したタスク定義に対応します。
  5. ecs_demo 」を「サービス名」に設定します。
  6. 1 を「希望するタスク」に設定します。

    Create project

  7. デプロイを選択します。
  8. 作成したサービスがアクティビティになっていることを確認します。

    Create project

AWSのコンソールUIは時々変更されることに注意してください。説明の中に関連するコンポーネントが見つからない場合は、最も近いものを選択してください。

デモアプリケーションを見る

これで、インターネットからデモアプリケーションにアクセスできるようになりました。

  1. AWSコンソールで EC2 > インスタンスに移動します。
  2. ECS Instance で検索し、ECSクラスターが作成した対応するEC2インスタンスを探します。
  3. EC2インスタンスのIDを選択します。インスタンスの詳細ページが表示されます。
  4. 公開IPv4アドレスをコピーしてブラウザに貼り付けます。これでデモアプリケーションの実行が確認できます。

    Create project

このガイドでは、HTTPS/SSLは設定されていません。アプリケーションにはHTTPのみでアクセスできます(例:http://<ec2-ipv4-address>)。

GitLab からの継続的デプロイのセットアップ

ECS 上でアプリケーションを実行できるようになったので、GitLab から継続的デプロイを設定することができます。

新しい IAM ユーザーをデプロイ用に作成します。

上記で作成したECSクラスター、サービス、タスク定義にGitLabがアクセスするためには、AWS上にデプロイユーザーを作成する必要があります:

  1. AWSコンソールで IAM > Usersに移動します。
  2. Add userを選択します。
  3. ecs_demoユーザー名に設定します。
  4. プログラマティックアクセスを有効にするチェックボックスをオンにします。次へ」を選択します:権限
  5. 権限の設定] でAttach existing policies directly を選択します。
  6. ポリシーリストからAmazonECS_FullAccess を選択します。次へ」を選択します:タグ] と [次] を選択します:レビュアー」を選択します。

    Create project

  7. ユーザーの作成]を選択します。
  8. 作成したユーザーのアクセスキーIDとシークレットアクセスキーを控えておきます。
note
シークレットアクセスキーは公開しないでください。安全な場所に保存してください。

パイプラインジョブがECSにアクセスできるようにGitLabで認証情報を設定します。

GitLab CI/CD変数にアクセス情報を登録できます。これらの変数はパイプラインジョブに注入され、ECS APIにアクセスすることができます。

  1. GitLabのecs-demoプロジェクトにアクセスしてください。
  2. 設定 > CI/CD > 変数に移動します。
  3. Add Variableを選択し、以下のキーと値のペアを設定します。

    キーノート
    AWS_ACCESS_KEY_ID<Access key ID of the deployer> aws CLI の認証用。
    AWS_SECRET_ACCESS_KEY<Secret access key of the deployer> aws CLI の認証用。
    AWS_DEFAULT_REGIONus-east-2 aws CLI の認証用。
    CI_AWS_ECS_CLUSTERecs-demoECS クラスタにはproduction_ecs ジョブでアクセスします。
    CI_AWS_ECS_SERVICEecs_demoクラスタのECSサービスはproduction_ecs ジョブによって更新されます。この変数が適切な環境 (production,staging,review/*) にスコープされていることを確認してください。
    CI_AWS_ECS_TASK_DEFINITIONecs_demoECSタスク定義はproduction_ecs ジョブによって更新されます。

デモアプリケーションに変更を加えます

プロジェクト内のファイルを変更し、それがECS上のデモ・アプリケーションに反映されるか確認してください:

  1. GitLabのecs-demoプロジェクトにアクセスしてください。
  2. app > views > welcome >index.html.erbでファイルを開きます。
  3. 編集 を選択します。
  4. テキストをYou're on ECS! に変更します。
  5. 変更のコミット]を選択します。これで自動的に新しいパイプラインが起動します。終了するまで待ちます。
  6. ECSクラスターで実行中のアプリケーションにアクセスします。このように表示されるはずです:

    Create project

おめでとうございます!ECSへの継続的デプロイのセットアップに成功しました。

note
ECS デプロイジョブは、ロールアウトが完了するまで待機してから終了します。この動作を無効にするには、CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED を空でない値に設定します。

レビューアプリのセットアップ

ECSでレビュアーアプリを使用するには:

  1. 新しいサービスを設定します。
  2. CI_AWS_ECS_SERVICE 変数を使用して名前を設定します。
  3. 環境スコープをreview/* に設定します。

このサービスはすべてのレビューアプリで共有されるため、一度にデプロイできるレビューアプリは1つだけです。

セキュリティテストの設定

SASTの設定

ECS でSASTを使用するには、.gitlab-ci.yml ファイルに以下を追加します:

include:
   - template: Security/SAST.gitlab-ci.yml

詳細および設定オプションについては、SASTのドキュメントを参照してください。

DASTの設定

デフォルト以外のブランチでDASTを使用するには、レビューアプリを設定し、.gitlab-ci.yml ファイルに以下を追加してください:

include:
  - template: Security/DAST.gitlab-ci.yml

デフォルトブランチでDASTを使用するには

  1. 新しいサービスをセットアップします。このサービスは一時的なDAST環境のデプロイに使用されます。
  2. CI_AWS_ECS_SERVICE 変数を使用して名前を設定します。
  3. スコープをdast-default 環境に設定します。
  4. .gitlab-ci.yml ファイルに以下を追加します:
include:
  - template: Security/DAST.gitlab-ci.yml
  - template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml

詳細および設定オプションについては、DASTドキュメントを参照してください。

さらに読む

  • クラウドへの継続的なデプロイについてもっと知りたい方は、クラウド・デプロイをご覧ください。
  • プロジェクトで DevSecOps を素早くセットアップしたい場合は、Auto DevOps を参照してください。
  • 本番グレードの環境を素早くセットアップしたい場合は、5分本番アプリを参照してください。