こんにちわ。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
を動かすのにjq
・which
が必要なので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にデプロイしてみた