CodeBuildでECR Push&ECS Deploy


こんにちわ。Patheeの廣瀬です

ECSのデプロイ、CodePipeline+CodeBuildのパターンはよく見るのですが、
コネヒトさんのCodeBuildを使ったECSへのコンテナデプロイで、
ecs-deployを使えばCodeBuildだけで完結できるのが良さげだなと思って取り入れてみました

環境

  • Github
  • AWS
    • ECS (Fargate)
    • ECR
    • CodeBuild

CodeBuild設定

  • イメージ: aws/codebuild/amazonlinux2-x86_64-standard:1.0
  • ウェブフックイベント: PUSH
    • 条件: タグ (^refs/tags/releaseなど)

buildspec.yml

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
    commands:
      ## ecs-deployのインストール
      - yum install -y jq which
      - curl -OL https://raw.githubusercontent.com/silinternational/ecs-deploy/master/ecs-deploy
      - chmod +x ecs-deploy
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}

  pre_build:
    commands:
      ## ECRにログイン
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)

  build:
    commands:
      ## Dockerイメージのビルド
      - docker build -t $IMAGE_REPOSITORY_NAME:latest .
      - docker tag $IMAGE_REPOSITORY_NAME:latest $IMAGE_REPOSITORY_NAME:$IMAGE_TAG

      ## DockerイメージのECRへのプッシュ
      - docker push $IMAGE_REPOSITORY_NAME:latest
      - docker push $IMAGE_REPOSITORY_NAME:$IMAGE_TAG

      ## ECSへのデプロイ
      - ./ecs-deploy -n $ESC_SERVICE_NAME -c $ESC_CLUSTER_NAME -i $IMAGE_REPOSITORY_NAME:latest -r $AWS_DEFAULT_REGION -t 1200

ポイント

  • 環境変数として以下を設定
    • ESC_SERVICE_NAME
    • ESC_CLUSTER_NAME
    • IMAGE_REPOSITORY_NAME
  • ecs-deployを動かすのにjqwhichが必要なのでyumでインストール
    ※イメージがubuntuだったりすると微妙に違ってくるかも
  • ecs-deployのタイムアウトを長めに
    イメージサイズだったり設定で変わってくると思いますが

Pros/Cons

元の記事でCodeBuildの良さに触れられていますが、その他の部分での良し悪しをあげてみました

Pros

  • CodeBuildだけで完結する
    • 簡単
      • メンテが1箇所だけなので見通しが良い
      • タグ名をCodePiplineに渡すところでアーティファクトでつまずいたり、、、
    • CodePiplineの料金がかからない
      • 一つにつき固定で1$

Cons

  • ECSデプロイ部分に時間がかかる場合、高頻度に実施するとCodePipline使うよりも高くなるかも
    https://aws.amazon.com/jp/codebuild/pricing/
  • AWSコマンドで全部書けそう
    • とはいえ1行で済む簡便さ

あと書き

既存プロジェクトはサクッとデプロイできるようになりましたが、
一方、新規に作る場合はGithubActionで済ませれば、CodeBuildはいらないかもです、、、
GitHub ActionsからサクッとFargateにデプロイしてみた