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 プロジェクトのテンプレートを使って始めましょう。名前が示すように、これらのプロジェクトはいくつかの有名なフレームワーク上に構築されたベアボーンアプリケーションを提供します。
-
GitLab で、ナビゲーションバーの一番上にあるプラスアイコン({プラス四角}) を選択し、New project を選択します。
-
Create from template を選択し、Ruby on Rails、Spring、NodeJS Express プロジェクトから選択します。このガイドでは、Ruby on Railsテンプレートを使用します。
-
プロジェクトに名前を付けます。この例では、
ecs-demo
と名付けます。GitLab Ultimate プランで利用できる機能を活用するために、プロジェクトを公開しましょう。 -
Create projectを選択します。
デモ・プロジェクトを作成したので、アプリケーションをコンテナ化してコンテナ・レジストリにプッシュする必要があります。
コンテナ化したアプリケーションイメージを GitLab コンテナレジストリにプッシュします。
ECSはコンテナオーケストレーションサービスであるため、インフラ構築時にコンテナ化されたアプリケーションイメージを提供する必要があります。そのためには、GitLabAuto Buildと コンテナレジストリを使います。
- GitLabのecs-demoプロジェクトにアクセスしてください。
-
Setup up CI/CDを選択します。
.gitlab-ci.yml
の作成フォームが表示されます。 -
空の
.gitlab-ci.yml
に以下の内容をコピー&ペーストします。 これは、ECSへの継続的デプロイのパイプラインを定義します。include: - template: AWS/Deploy-ECS.gitlab-ci.yml
-
変更のコミット]を選択します。自動的に新しいパイプラインがトリガーされます。このパイプラインでは、
build
ジョブがアプリケーションをコンテナ化し、GitLab コンテナレジストリにイメージをプッシュします。 -
Deploy > Container Registry にアクセスしてください。アプリケーションイメージがプッシュされたことを確認します。
これで、AWS からプルできるコンテナ化されたアプリケーションイメージができました。次に、このアプリケーションイメージを AWS でどのように使用するかの仕様を定義します。
ECSクラスタがまだ接続されていないため、production_ecs
のジョブが失敗することに注意してください。これは後で修正します。
ECSタスク定義の作成
ECSタスク定義は、ECSサービスによるアプリケーション・イメージの起動方法に関する仕様です。
- AWSコンソールの ECS > Task Definitionsに移動します。
-
Create new Task Definitionを選択します。
- 起動タイプとしてEC2を選択します。Next Stepを選択します。
-
ecs_demo
をタスク定義名に設定します。 -
512
を「タスクサイズ > タスクメモリと タスクCPU」に設定します。 - コンテナ定義]>[コンテナを追加]を選択します。コンテナ登録フォームが開きます。
-
web
をコンテナ名に設定します。 -
registry.gitlab.com/<your-namespace>/ecs-demo/master:latest
をImage に設定します。あるいは、GitLabコンテナレジストリページからイメージパスをコピー&ペーストすることもできます。 -
ポートマッピングを追加します。
80
をホストポートに、5000
をコンテナポートに設定します。 - 作成を選択します。
これで初期タスクの定義ができました。次に、アプリケーション・イメージを実行する実際のインフラストラクチャを作成します。
ECSクラスターの作成
ECSクラスターは、ECSサービスの仮想グループです。また、計算リソースとしてEC2またはFargateに関連付けられています。
- AWSコンソールで ECS > クラスターに移動します。
- Create Clusterを選択します。
- クラスタテンプレートとしてEC2 Linux + Networkingを選択します。Next Stepを選択します。
-
ecs-demo
をクラスター名に設定します。 - Networking]でデフォルトのVPCを選択します。既存のVPCがない場合は、そのままにして新しいVPCを作成できます。
- VPCの利用可能なすべてのサブネットを「サブネット」に設定します。
- 作成を選択します。
-
ECSクラスターが正常に作成されたことを確認します。
これで、次のステップでECSサービスをECSクラスターに登録できます。
以下に注意してください。
- オプションで、作成フォームにSSHキーペアを設定できます。これにより、デバッグのためにEC2インスタンスにSSH接続できるようになります。
- 既存のVPCを選択しない場合、デフォルトで新しいVPCが作成されます。そのため、アカウントのインターネットゲートウェイの最大許容数に達するとエラーが発生する可能性があります。
- クラスターにはEC2インスタンスが必要で、インスタンスタイプに応じてコストがかかります。
ECSサービスの作成
ECSサービスは、ECSタスク定義に基づいてアプリケーションコンテナを作成するデーモンです。
- AWSコンソールで ECS > クラスター > ecs-demo > サービスに移動します。
- デプロイを選択します。サービス作成フォームが開きます。
-
Launch Type で
EC2
を選択します。 -
ecs_demo
をタスク定義に設定します。これは上記で作成したタスク定義に対応します。 -
ecs_demo
」を「サービス名」に設定します。 -
1
を「希望するタスク」に設定します。 - デプロイを選択します。
-
作成したサービスがアクティビティになっていることを確認します。
AWSのコンソールUIは時々変更されることに注意してください。説明の中に関連するコンポーネントが見つからない場合は、最も近いものを選択してください。
デモアプリケーションを見る
これで、インターネットからデモアプリケーションにアクセスできるようになりました。
- AWSコンソールで EC2 > インスタンスに移動します。
-
ECS Instance
で検索し、ECSクラスターが作成した対応するEC2インスタンスを探します。 - EC2インスタンスのIDを選択します。インスタンスの詳細ページが表示されます。
-
公開IPv4アドレスをコピーしてブラウザに貼り付けます。これでデモアプリケーションの実行が確認できます。
このガイドでは、HTTPS/SSLは設定されていません。アプリケーションにはHTTPのみでアクセスできます(例:http://<ec2-ipv4-address>
)。
GitLab からの継続的デプロイのセットアップ
ECS 上でアプリケーションを実行できるようになったので、GitLab から継続的デプロイを設定することができます。
新しい IAM ユーザーをデプロイ用に作成します。
上記で作成したECSクラスター、サービス、タスク定義にGitLabがアクセスするためには、AWS上にデプロイユーザーを作成する必要があります:
- AWSコンソールで IAM > Usersに移動します。
- Add userを選択します。
-
ecs_demo
をユーザー名に設定します。 - プログラマティックアクセスを有効にするチェックボックスをオンにします。次へ」を選択します:権限。
-
権限の設定] で
Attach existing policies directly
を選択します。 -
ポリシーリストから
AmazonECS_FullAccess
を選択します。次へ」を選択します:タグ] と [次へ] を選択します:レビュアー」を選択します。 - ユーザーの作成]を選択します。
- 作成したユーザーのアクセスキーIDとシークレットアクセスキーを控えておきます。
パイプラインジョブがECSにアクセスできるようにGitLabで認証情報を設定します。
GitLab CI/CD変数にアクセス情報を登録できます。これらの変数はパイプラインジョブに注入され、ECS APIにアクセスすることができます。
- GitLabのecs-demoプロジェクトにアクセスしてください。
- 設定 > CI/CD > 変数に移動します。
-
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_REGION
us-east-2
aws
CLI の認証用。CI_AWS_ECS_CLUSTER
ecs-demo
ECS クラスタには production_ecs
ジョブでアクセスします。CI_AWS_ECS_SERVICE
ecs_demo
クラスタのECSサービスは production_ecs
ジョブによって更新されます。この変数が適切な環境 (production
,staging
,review/*
) にスコープされていることを確認してください。CI_AWS_ECS_TASK_DEFINITION
ecs_demo
ECSタスク定義は production_ecs
ジョブによって更新されます。
デモアプリケーションに変更を加えます
プロジェクト内のファイルを変更し、それがECS上のデモ・アプリケーションに反映されるか確認してください:
- GitLabのecs-demoプロジェクトにアクセスしてください。
-
app > views > welcome >
index.html.erb
でファイルを開きます。 - 編集 を選択します。
- テキストを
You're on ECS!
に変更します。 - 変更のコミット]を選択します。これで自動的に新しいパイプラインが起動します。終了するまで待ちます。
-
ECSクラスターで実行中のアプリケーションにアクセスします。このように表示されるはずです:
おめでとうございます!ECSへの継続的デプロイのセットアップに成功しました。
CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED
を空でない値に設定します。レビューアプリのセットアップ
ECSでレビュアーアプリを使用するには:
- 新しいサービスを設定します。
-
CI_AWS_ECS_SERVICE
変数を使用して名前を設定します。 - 環境スコープを
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を使用するには
- 新しいサービスをセットアップします。このサービスは一時的なDAST環境のデプロイに使用されます。
-
CI_AWS_ECS_SERVICE
変数を使用して名前を設定します。 - スコープを
dast-default
環境に設定します。 -
.gitlab-ci.yml
ファイルに以下を追加します:
include:
- template: Security/DAST.gitlab-ci.yml
- template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
詳細および設定オプションについては、DASTドキュメントを参照してください。
さらに読む
- クラウドへの継続的なデプロイについてもっと知りたい方は、クラウド・デプロイをご覧ください。
- プロジェクトで DevSecOps を素早くセットアップしたい場合は、Auto DevOps を参照してください。
- 本番グレードの環境を素早くセットアップしたい場合は、5分本番アプリを参照してください。