No.5【AWS】ECS Fargate+CodePipeline - CI/CD環境構築編

2023/04/04に公開

はじめに

この記事は以下の続きとなる。

https://zenn.dev/omizunomitaro/articles/8fc2a612a1199b
https://zenn.dev/omizunomitaro/articles/d9d360a15cc7f4
https://zenn.dev/omizunomitaro/articles/f3b24a954d67c9
https://zenn.dev/omizunomitaro/articles/8f40f1d9ec4629

つまづきポイント

構築する環境

  • 今回はリポジトリに更新があったらECSのタスクをローリングアップデートをするCI/CD環境を構築する。

構築手順

SecretManager設定

  1. Secrets Manager新しいシークレットを保存するをクリックし新規作成画面に遷移する。

  2. その他のシークレットのタイプを選択する。

  3. キー/値のペアにdockerHubのログインユーザー名とパスワードを設定する。

  • dockerHubユーザー名設定
    キー:username
    値:<dockerHubログインユーザー名>
  • dockerHubパスワード設定
    キー:password
    値:<dockerHubログインパスワード>
  1. シークレットキーの名前は任意のものを設定する。

  2. 今回はローテーション設定はしない。必要な場合は状況に応じて設定する。

コンテンツの準備

CodePipelineを動かすためのファイルを用意してCodeCommitにpushする。

ファイル構成一覧

リポジトリ
 - buildspec.yml
  - Dockerfile (※) 
  - server.js (※)
buildspec.yml
version: 0.2

env:
  secrets-manager:
    DOCKERHUB_USER: <SecretManagerのarn>:username
    DOCKERHUB_PASS: <SecretManagerのarn>:password

phases:
    pre_build:
        commands:
            - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
            - REPOSITORY_URI=<ECRリポジトリURL/イメージ名>
            - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
            
            - echo Logging in to Docker Hub...
            - echo $DOCKERHUB_PASS | docker login -u $DOCKERHUB_USER --password-stdin
    build:
        commands:
            - docker build -t $REPOSITORY_URI:latest .
            - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
    post_build:
        commands:
            - docker push $REPOSITORY_URI:latest
            - docker push $REPOSITORY_URI:$IMAGE_TAG
            - printf '[{"name":"node-sample","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json

artifacts:
    files: 
        - imagedefinitions.json

パイプライン作成

パイプライン設定

パイプライン名やロールなどの基本設定をする。

  1. CodePipelineパイプラインを作成するからCodePipeline新規作成画面に遷移する。
  2. パイプライン名は任意の名前を設定する。
  3. サービスロール新しいサービスロールを選択する。
    ロール名はパイプライン名から自動的に命名される。

ソースステージ設定

pullしてくるソースの指定する。

  1. ソースプロバイダーはAWS CodeCommitを選択する。
  2. リポジトリ名はコンテンツ準備で準備したリポジトリを指定する。
  3. ブランチ名はCodePipeline実行時にビルド環境にCloneする対象のブランチを選択する。

ビルドステージ設定

CodeBuildの設定をする。

  1. プロバイダーを構築するAWS CodeBuildを選択する。
  2. リージョンを選択する。
  3. プロジェクトを作成するをクリックする。
    CodeBuildの設定する画面が別ウィンドウで表示される。
  4. プロジェクト名は任意の名前を設定する。
  5. 環境イメージはマネージド型イメージを選択する。
  6. オペレーティングシステムはCodeBuild上でDockerイメージをビルドする環境を選択する。

    今回、Cloud9環境にあわせてAmazon Linux 2を指定した。
  7. 環境タイプやイメージはECSを実行するときに選択した環境にあわせる。
  8. 特権付与にチェックを入れる。

デプロイステージ設定

  1. デプロイプロバイダーはAmazon ECSを選択する。

  2. リージョンを選択する。

  3. ECSクラスターおよびサービス名を選択する。

エラー

一通り、設定が完了すると自動でCodePipelineのジョブが動いてしまう。
CodeBuildで以下エラーによりジョブ実行に失敗する。
これは付与するべき権限をCodeBuildに付与していないためである。

ロール権限付与

CodePipelineを設定する行程で新規作成されたCodeBuild実行用ロールに対し以下ポリシーを付与する。

  • SecretsManagerReadWrite
  • AmazonEC2ContainerRegistryPowerUser

動作確認

  • 上記、設定の場合、masterブランチにコミットされた場合自動でジョブが動く。
  • ジョブを手動で動かす時はCodePipeline→対象のpipelineを選択→変更をリリースするをクリックする。
  • ジョブがうまく動いた場合ECSのタスクリビジョンが上書きされ、
    新たなタスクがECS上で動く。

Discussion