For

2024.7.31

GitHub + CodeBuild + CodePipeline + ECR + ECSでコンテナをデプロイするCI/CDパイプラインを構築する

概要

GitHubの対象ブランチに更新があったとき、AWS環境にコンテナがデプロイされるCI/CDパイプラインを構築していきます。
この記事は以下の記事で作った環境をベースに進めます。

For - GitHub + CodeBuild + CodePipeline + Route 53 + CloudFront + S3でCI/CDパイプラインを構築する

構成

雑ですが構成イメージです。

構築

ターゲットグループ作成

ターゲットはIPにします。
ポートはデプロイするアプリケーションに合わせて設定します。今回は3000とします。
このとき、明示的にIPを指定する必要はなく、ターゲットを設定する必要もありません。
あとで作成するECSの設定画面でロードバランサーを選択し、ロードバランサーのターゲットグループとして選択するとターゲットは自動的に追加されます。




ALB作成

今回は、CloudFrontでS3から配信する静的WebサイトからのHTTPSリクエストをALBに送り、ECSコンテナへ転送するため、ポート443を先ほど作成したターゲットグループに転送するように設定します。
また、ALBはパブリックサブネットに配置します。



buildspec.ymlを追加

対象のGitHubリポジトリに buildspec.yml を追加しておきます。
post_buildでprintfしている cicd-test-backend は後ほど作成するタスク定義のコンテナ名です。

yaml_____buildspec.yml_____version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - export IMAGE_TAG
  build:
    commands:
      - echo Building the Docker image...
      - docker build -t $ECR_REPOSITORY_URI:$IMAGE_TAG -f Dockerfile.production .
  post_build:
    commands:
      - echo Pushing the Docker image...
      - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG
      - printf '[{"name":"%s","imageUri":"%s"}]' "cicd-test-backend" "$ECR_REPOSITORY_URI:$IMAGE_TAG" > image-definitions.json
artifacts:
  files: image-definitions.json


ECR作成

ECRにリポジトリを作成します。

CodeBuildでビルドプロジェクトを作成



ここでいったんビルドしてみます。


先ほど作成したECRリポジトリにDockerイメージが追加されました。

ECSクラスター作成


タスク定義作成

先ほどECRにプッシュされたDockerイメージのタグを付けてイメージURIを指定してタスク定義を作成します。

SG作成

ALBのSG(セキュリティグループ)からのインバウンドを許可するセキュリティグループを作成します。

サービス作成

先ほど作ったクラスターにサービスを作成します。
スクリーンショットを取り忘れてリビジョンがひとつ上がってしまってから撮影していますが気にしないでください。


タスクはプライベートサブネットに配置されるようにして、ALBからのインバウンドだけ許可したセキュリティグループを選択します。



先ほど作ったALB、リスナー、ターゲットグループ選択していきます。


CloudFrontを更新

CloudFrontディストリビューションにALBのオリジンを追加します。


続いて今作ったALBをオリジンとしてバックエンドへのパスルーティング用にビヘイビアを追加します。

CodePipeline作成




先ほど作ったCodeBuildのビルドプロジェクトを選択します。


クラスター名、サービス名を選択肢、イメージ定義ファイルはbuildspec.ymlで定義したファイル名を指定します。


パイプライン構築後にデプロイ成功を確認して構築完了です。

まとめ

これでCloudFrontでフロントエンドアプリケーションを配信しつつ、リクエストはバックエンドアプリケーションにパスルーティングする構成のCI/CDパイプラインが構築できました。
なんやかんや色々試し、ドメイン取得含めて45$程度かかりました。笑