AWS CodeDeploy/CodePipeline/S3 を使用して Gitlab-Ci を EC2 にデプロイする方法 質問する

AWS CodeDeploy/CodePipeline/S3 を使用して Gitlab-Ci を EC2 にデプロイする方法 質問する

私は 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#ユーザー

  1. ユーザーを作成する
  2. 次の権限を添付します。

    • コードパイプラインフルアクセス
    • 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": "*"
            }
          ]
        }
      
  3. セキュリティ資格情報を生成する

注記: 上記のポリシーの範囲は非常に広範囲です。特定のリソースへのアクセスのみを制限するカスタム ポリシーを作成することで、要件に合わせて調整できます。

注記: これらの資格情報は安全な場所に保管してください。後の手順で必要になります。

AWS EC2 インスタンスとロール

CodeDeploy のインスタンスロール

https://console.aws.amazon.com/iam/home#roles

S3にアクセスするためにEC2インスタンスに割り当てられる新しいロールを作成します。

  1. 命名規則に従って名前を設定します (例: MyDeploymentAppRole)
  2. Amazon EC2EC2インスタンスが他のAWSサービスを実行できるようにするには選択します
  3. 以下のポリシーを添付します。
    • 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 バケットを作成する必要があります。

以下の手順に従ってください:

  1. 選ぶCreate Bucket
    • バケット名を選択します(例my-app-codepipeline-deployment:)
    • 地域を選択
  2. バケットのコンソールで選択Properties
    • Versioningメニューを展開
    • 選ぶEnable Versioning

AWS コードデプロイ

https://console.aws.amazon.com/codedeploy/home#/applications

基本的な要素が設定されたので、CodeDeployでデプロイメントアプリケーションを作成する準備が整いました。

CodeDeploy デプロイメント アプリケーションを作成するには、次の手順に従います。

  1. 選択するCreate New Application
  2. アプリケーション名を選択します(例MyApp-Production:)
  3. 展開グループ名を選択します(例MyApp-Production-Fleet:)
  4. このデプロイメントの影響を受けるEC2インスタンスを選択します -Search by Tags
    • Key選択の下Name
    • Value選択の下MyApp-Production-Instance
  5. の下でService Role、選択MyDeploymentAppRole
  6. クリックCreate Application

注記: デプロイメントの対象となる目的のインスタンスに適用された任意の関連タグにデプロイメントを割り当てることができます。 簡単にするために、以前に定義したインスタンスを選択するために名前タグのみが使用されています。

AWS コードパイプライン

https://console.aws.amazon.com/codepipeline/home#/dashboard

次のステップでは、S3 バケットと CodeDeploy プロセス間の接続を実行する CodePipeline の作成に進みます。

CodePipeline を作成するには、次の手順に従います。

  1. クリックCreate Pipeline
  2. パイプラインに名前を付けます (例: MyAppDeploymentPipeline)
  3. Source Providerに設定するAmazon S3
    • Amazon S3 locationバケットとターゲットデプロイメントファイルのアドレスに設定します(つまりs3://my-app-codepipeline-deployment/myapp.zip)
  4. 設定- これは、後で説明するように、Gitlab-CIによってすでに処理されています Build ProviderNone
  5. Deployment Providerに設定AWS CodeDeploy
    • Application NameCodeDeploy アプリケーションの名前に設定します(例: MyApp-Production)
    • Deployment GroupCodeDeploy デプロイメント グループの名前に設定します(例: MyApp-Production-Fleet)
  6. パイプラインサービスロールを作成または選択する
  7. 確認してクリック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をインストールする必要がありますpippipこれは、デプロイメントファイルを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.ymlhttp://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_appzip 内のディレクトリ)に追加する必要があります。
    • my_app配布コード - この例ではディレクトリの下になります

Gradle や Maven などのツールは、zip 生成プロセスに特定の変更を加えることで、配布用 zip ファイルを生成することができます。このようなツールを使用しない場合は、Gitlab-CI に別の方法でこの zip ファイルを生成するように指示する必要があります。この方法は、このガイドの範囲外です。

アプリケーションを EC2 にデプロイする

このガイドの最後のステップは、実際に正常なデプロイメントを実行することです。

継続的インテグレーションのステージは、 で設定されたルールによって定義されますgitlab-ci.yml。このガイドで提供される例では、次の正規表現に一致するすべての参照に対してデプロイを開始します/^v\d+\.\d+\.\d+-.*$/

この場合、v1.0.0-My-App-Alpha-Releasegit を介してタグをリモート 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 デプロイジョブ

コードパイプラインデプロイ

CodeDeploy フック スクリプト ログ

参考文献

おすすめ記事