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$程度かかりました。笑