私は Gradle を使用して Scala ベースの SlackBot プロジェクトに取り組んでおり、AWS EC2 にデプロイするために Gitlab-CI を活用する方法を検討してきました。
Gitlab-CI を使用してアプリケーションを完全にビルドおよびテストできます。
CodeDeploy と CodePipeline を使用して Gitlab-CI から Amazon EC2 へのデプロイを実行するにはどうすればよいですか?
これを行うためのガイドとして従うべき回答。
ベストアンサー1
以下のガイドに付随するサンプル ファイルのセットを作成しました。これらのファイルは、次のリンクから入手できます。サンプルガイド
範囲
このガイドでは、以下のことを前提としています。
- Gitlab EE ホスト プロジェクト - プライベート CE/EE インスタンスで動作する可能性があります (テストされていません)
- GITバージョン管理リポジトリとしてのGitlab
- 継続的インテグレーションエンジンとしての Gitlab-CI
- 既存のAWSアカウント
- デプロイメントのターゲット本番環境またはステージングシステムとしての AWS EC2
- Amazon Linux AMI を実行する AWS EC2 インスタンス
- デプロイメントファイルの保存場所としての AWS S3
- プロジェクトのデプロイメントエンジンとしてのAWS CodeDeploy
- デプロイメントのパイプラインとしてのAWS CodePipeline
提供されている.gitlab-ci.yml
サンプルは、Java/Scala + Gradle プロジェクトに基づいています。スクリプトは一般的な例として提供されており、この方法で継続的デリバリーを実装する場合は、特定のニーズに合わせて調整する必要があります。
このガイドでは、ユーザーが AWS サービスに関する基本的な知識と必要なタスクの実行方法を理解していることを前提としています。
注記: このサンプルで提供されるガイドでは、AWS コンソールを使用してタスクを実行します。ここで実行されるタスクに相当する CLI が存在する可能性はありますが、ガイド全体では取り上げません。
モチベーション
これらのスクリプトとデプロイメント ガイドを作成する動機は、Gitlab と AWS EC2 を使用して継続的デリバリーを実装する方法を示す適切なチュートリアルが利用できなかったことです。Gitlab は Digital Ocean と提携して無料で利用できる CI エンジンを導入しました。これにより、ユーザー リポジトリは高品質の CI を無料で利用できます。
Gitlab を使用する主な利点の 1 つは、さまざまなステップを実行してビルドを検証するための組み込みの継続的インテグレーション コンテナが提供されていることです。残念ながら、Gitblab も AWS も、ビルドに合格した後に継続的デリバリーを実行できる統合を提供していません。
このガイドとスクリプト(サンプルガイド) は、Gitlab と AWS EC2 の両方を使用して CI と CD を成功させるために私が実行した手順の簡略版を提供しており、このタイプの実装を開始する他の人にも役立ちます。
AWS での環境設定
継続的デリバリー プロセスを成功させるための最初のステップは、デプロイメント プロセスを成功させるために必要なオブジェクトを AWS 上にセットアップすることです。
AWS IAM ユーザー
最初の要件は、IAM ユーザーを設定することです。
https://console.aws.amazon.com/iam/home#ユーザー
- ユーザーを作成する
次の権限を添付します。
- コードパイプラインフルアクセス
- AmazonEC2フルアクセス
- AmazonS3フルアクセス
- AWSCodeDeployフルアクセス
インラインポリシー:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:*", "codedeploy:*", "ec2:*", "elasticloadbalancing:*", "iam:AddRoleToInstanceProfile", "iam:CreateInstanceProfile", "iam:CreateRole", "iam:DeleteInstanceProfile", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:GetInstanceProfile", "iam:GetRole", "iam:GetRolePolicy", "iam:ListInstanceProfilesForRole", "iam:ListRolePolicies", "iam:ListRoles", "iam:PassRole", "iam:PutRolePolicy", "iam:RemoveRoleFromInstanceProfile", "s3:*" ], "Resource": "*" } ] }
セキュリティ資格情報を生成する
注記: 上記のポリシーの範囲は非常に広範囲です。特定のリソースへのアクセスのみを制限するカスタム ポリシーを作成することで、要件に合わせて調整できます。
注記: これらの資格情報は安全な場所に保管してください。後の手順で必要になります。
AWS EC2 インスタンスとロール
CodeDeploy のインスタンスロール
https://console.aws.amazon.com/iam/home#roles
S3にアクセスするためにEC2インスタンスに割り当てられる新しいロールを作成します。
- 命名規則に従って名前を設定します (例:
MyDeploymentAppRole
) Amazon EC2
EC2インスタンスが他のAWSサービスを実行できるようにするには選択します- 以下のポリシーを添付します。
- AmazonEC2フルアクセス
- AmazonS3フルアクセス
- AWSコードデプロイロール
注記: 上記のポリシーの範囲は非常に広範囲です。特定のリソースへのアクセスのみを制限するカスタム ポリシーを作成することで、要件に合わせて調整できます。
インスタンスを起動する
amazon.com/ec2/v2/home にログインします。
クリックしてLaunch Instance
、次の手順に従ってください。
- 選択する
Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type
- 必要なインスタンスタイプを選択します(デフォルトではt2.micro)
- 次
- 選択
IAM Role
するMyDeploymentAppRole
(前のセクションで作成した名前に基づいて)- 次
- 適切なストレージを選択する
- 次
- インスタンスに適切な名前を付けてタグ付けします (例:
MyApp-Production-Instance
)- 必要に応じてタグを追加する
- 次
- 必要に応じてセキュリティグループを構成する
- 次
- インスタンスを確認して起動する
SSH キーを生成するか、使用するかを選択できます。適切な方法を選択してください。
インスタンス環境の設定
CodeDeployエージェントをインストールする
新しく作成した EC2 インスタンスにログインし、指示に従います。
CodeDeploy の重要なパス:
- CodeDeploy デプロイメント ベース ディレクトリ:
/opt/codedeploy-agent/deployment-root/
- CodeDeploy ログファイル:
/var/log/aws/codedeploy-agent/codedeploy-agent.log
ヒント:tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
デプロイメントをリアルタイムで追跡するために実行します。
プロジェクトの前提条件をインストールするプロジェクトを実行するための前提条件がある場合は、デプロイメントを実行する前にそれらをインストールしてください。そうしないと、起動スクリプトが失敗する可能性があります。
AWS S3 リポジトリ
https://console.aws.amazon.com/s3/home
このステップでは、デプロイメント ファイルを保持する S3 バケットを作成する必要があります。
以下の手順に従ってください:
- 選ぶ
Create Bucket
- バケット名を選択します(例
my-app-codepipeline-deployment
:) - 地域を選択
- バケット名を選択します(例
- バケットのコンソールで選択
Properties
Versioning
メニューを展開- 選ぶ
Enable Versioning
AWS コードデプロイ
https://console.aws.amazon.com/codedeploy/home#/applications
基本的な要素が設定されたので、CodeDeployでデプロイメントアプリケーションを作成する準備が整いました。
CodeDeploy デプロイメント アプリケーションを作成するには、次の手順に従います。
- 選択する
Create New Application
- アプリケーション名を選択します(例
MyApp-Production
:) - 展開グループ名を選択します(例
MyApp-Production-Fleet
:) - このデプロイメントの影響を受けるEC2インスタンスを選択します -
Search by Tags
Key
選択の下Name
Value
選択の下MyApp-Production-Instance
- の下で
Service Role
、選択MyDeploymentAppRole
- クリック
Create Application
注記: デプロイメントの対象となる目的のインスタンスに適用された任意の関連タグにデプロイメントを割り当てることができます。 簡単にするために、以前に定義したインスタンスを選択するために名前タグのみが使用されています。
AWS コードパイプライン
https://console.aws.amazon.com/codepipeline/home#/dashboard
次のステップでは、S3 バケットと CodeDeploy プロセス間の接続を実行する CodePipeline の作成に進みます。
CodePipeline を作成するには、次の手順に従います。
- クリック
Create Pipeline
- パイプラインに名前を付けます (例:
MyAppDeploymentPipeline
)- 次
Source Provider
に設定するAmazon S3
Amazon S3 location
バケットとターゲットデプロイメントファイルのアドレスに設定します(つまりs3://my-app-codepipeline-deployment/myapp.zip
)- 次
- 設定- これは、後で説明するように、Gitlab-CIによってすでに処理されています
Build Provider
。None
- 次
Deployment Provider
に設定AWS CodeDeploy
Application Name
CodeDeploy アプリケーションの名前に設定します(例:MyApp-Production
)Deployment Group
CodeDeploy デプロイメント グループの名前に設定します(例:MyApp-Production-Fleet
)- 次
- パイプラインサービスロールを作成または選択する
- 次
- 確認してクリック
Create Pipeline
Gitlabでの環境設定
AWS 環境がアプリケーションのデプロイメントを受け入れる準備ができたので、CI 環境と設定のセットアップに進み、S3、CodeDeploy、および CodePipeline を使用してコードがビルドされ、EC2 インスタンスにデプロイされるようにすることができます。
Gitlab 変数
デプロイメントを機能させるには、プロジェクト リポジトリにいくつかの環境変数を設定する必要があります。
Gitlab プロジェクトで、Variables
プロジェクトの領域に移動し、次の変数を設定します。
AWS_DEFAULT_REGION
=> AWS リージョンAWS_SECRET_ACCESS_KEY
=> AWS ユーザー認証情報の秘密キー(ユーザーの認証情報を生成したときに取得)AWS_ACCESS_KEY_ID
=> AWS ユーザーの認証情報キー ID (ユーザーの認証情報を生成したときに取得)AWS_S3_LOCATION
=> デプロイメント zip ファイルの場所 (つまりs3://my-app-codepipeline-deployment/my_app.zip
)
これらの変数は、Gitlab-CI コンテナによって実行されるスクリプトからアクセスできるようになります。
起動スクリプト
簡単な起動スクリプトが用意されています(https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/blob/master/deploy/extras/my_app.sh) を使用すると、デプロイメントで次のタスクを実行できるようになります。
- アプリケーションを起動し、PIDファイルを作成します
- PIDファイルを通じてアプリケーションのステータスを確認する
- アプリケーションを停止する
このスクリプトは以下にありますdeploy/extras/my_app.sh
gitlab-ci.yml の作成
このgitlab-ci.yml
ファイルは、特定のコミットに関連付けられた継続的インテグレーション タスクの実行を担当します。継続的インテグレーション ステップのさまざまなフェーズに対応するステージに編成された、簡略化されたシェル スクリプトのグループとして機能します。
詳細と参考資料については、以下の2つのリンクをご参照ください。
gitlab-ci.yml
次のツールを使用して、いつでもファイルの構文を検証できます。gitlab.com/ci/lint より
展開の目的で、このガイドに付属するサンプルの最後の部分のみを取り上げます。
deploy-job:
# Script to run for deploying application to AWS
script:
- apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default
- pip install -U pip # pip update
- pip install awscli # AWS CLI installation
- $G build -x test -x distTar # # Build the project with Gradle
- $G distZip # creates distribution zip for deployment
- aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick up
# requires previous CI stages to succeed in order to execute
when: on_success
stage: deploy
environment: production
cache:
key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME"
untracked: true
paths:
- build/
# Applies only to tags matching the regex: ie: v1.0.0-My-App-Release
only:
- /^v\d+\.\d+\.\d+-.*$/
except:
- branches
- triggers
この部分は、以前の CI ステージ (存在する場合) に続くデプロイメントに関連付けられたジョブ全体を表します。
展開に関連する関連部分は次のとおりです。
# Script to run for deploying application to AWS
script:
- apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default
- pip install -U pip # pip update
- pip install awscli # AWS CLI installation
- $G build -x test -x distTar # # Build the project with Gradle
- $G distZip # creates distribution zip for deployment
- aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick up
最初のステップは、Pythonパッケージ管理システムをインストールすることです。AWS CLIをインストールする必要がありますpip
。pip
これは、デプロイメントファイルをAWS S3にアップロードするために必要です。
この例では、Gradle (環境変数 で定義$G
) を使用しています。Gradle は、デプロイメント ファイルを自動的に Zip するモジュールを提供します。デプロイするプロジェクトのタイプに応じて、配布 Zip ファイルを生成するためのこの方法は異なりますmy_app.zip
。
このaws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION
コマンドは、先ほど定義した Amazon S3 の場所に配布用 zip ファイルをアップロードします。その後、このファイルは CodePipeline によって自動的に検出され、処理されて CodeDeploy に送信されます。最後に、CodeDeploy はファイルで指定されたとおりに CodeDeploy エージェントを通じて必要なタスクを実行しますappspec.yml
。
appspec.yml の作成
appspec.yml
デプロイメント ファイルを受信した後の CodeDeploy の動作を定義します。
このガイドには、展開のさまざまなフェーズで実行されるサンプル スクリプトとともにサンプル ファイルが提供されています。
ファイルのビルド方法の詳細については、CodeDeploy AppSpec の仕様を参照してくださいappspec.yml
。http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html
デプロイメント ZipFile の生成
CodeDeploy が適切に機能するためには、アプリケーションの適切に生成された zip ファイルを作成する必要があります。
zip ファイルには以下が含まれている必要があります:
- Zipルート
appspec.yml
=> CodeDeploy のデプロイ手順- デプロイメントステージスクリプト
- 提供されたサンプルは zip ファイル内のディレクトリに配置されるため
scripts
、プレゼンスmy_app.sh
スクリプトをアプリケーション ディレクトリのルート (つまり、my_app
zip 内のディレクトリ)に追加する必要があります。 my_app
配布コード - この例ではディレクトリの下になります
Gradle や Maven などのツールは、zip 生成プロセスに特定の変更を加えることで、配布用 zip ファイルを生成することができます。このようなツールを使用しない場合は、Gitlab-CI に別の方法でこの zip ファイルを生成するように指示する必要があります。この方法は、このガイドの範囲外です。
アプリケーションを EC2 にデプロイする
このガイドの最後のステップは、実際に正常なデプロイメントを実行することです。
継続的インテグレーションのステージは、 で設定されたルールによって定義されますgitlab-ci.yml
。このガイドで提供される例では、次の正規表現に一致するすべての参照に対してデプロイを開始します/^v\d+\.\d+\.\d+-.*$/
。
この場合、v1.0.0-My-App-Alpha-Release
git を介してタグをリモート Gitlab にプッシュすると、デプロイメント プロセスが開始されます。プロジェクトの要件に応じて、これらのルールを調整できます。
提供された例gitlab-ci.yml
では、タグを検出するときに次のジョブを実行しますv1.0.0-My-App-Alpha-Release
。
- ビルドジョブ - ソースをコンパイルする
- テストジョブ - ユニットテストを実行する
- deploy-job - ソースをコンパイルし、配布用 zip を生成し、zip を Amazon S3 にアップロードします。
ディストリビューション zip が Amazon S3 にアップロードされると、次の手順が実行されます。
- CodePipelineはS3 zipファイルのリビジョンの変更を検出します
- CodePipelineはファイルを検証します
- CodePipelineはCodeDeployのバンドルが準備できたことを知らせる信号を送信します
- CodeDeployはデプロイメント手順を実行します
- 開始 - デプロイメントの初期化
- アプリケーション停止 - フックに定義されたスクリプトを実行します
- DownloadBundle - CodePipeline を介して S3 リポジトリからバンドル ファイルを取得します。
- BeforeInstall - フックに定義されたスクリプトを実行します
files
インストール -セクションで定義された展開場所にコンテンツをコピーします。appspec.yml
- AfterInstall - フック用に定義されたスクリプトを実行します
- ApplicationStart - フックに定義されたスクリプトを実行します
- ValidateService - フックに定義されたスクリプトを実行します
- 終了 - デプロイメントが正常に完了したことを CodePipeline に通知します
成功した展開のスクリーンショット:
参考文献
- Gitlab-CI クイックスタート:http://docs.gitlab.com/ce/ci/quick_start/README.html
- Gitlab-CI .gitlab-ci.yml:http://docs.gitlab.com/ce/ci/yaml/README.html
- AWS CodePipeline ウォークスルー:http://docs.aws.amazon.com/codepipeline/latest/userguide/getting-started-w.html
- AWS CodeDeploy エージェントをインストールまたは再インストールします。http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html
- AWS CLI 入門 - Env:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment
- AppSpec リファレンス:http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html