Github Actions に AWS ECR + AWS ECS を用いた自動デプロイを実装する
経緯
- Github で管理しているコードを、AWS EC2 で動作するアプリとして載せることになった
- k8s ほどではないけど、オートスケーリング + Docker が欲しく、マルチクラウド対応も特に考えてないため ECS を選択
- 管理はある程度自動化したいので Github Actions で CI/CD を組むことになった
記載すること
- Github Actions の yml を記載
- ECR、ECSの設定は済んでいるものとして、設定方法などはこの記事で記載しない
内容
全体図
このような流れを想定
Github Actions
詳細については後述
name: develop-cicd
on:
push:
branches: [develop]
jobs:
build-register:
if: github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-1
# AWS ECR への Docker ログイン
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
# Build 及び Push
- name: Build Docker And Push ECR
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: xxx-yyy-zzz-repository # Pushしたいリポジトリを指定
IMAGE_TAG: develop # タグ名
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
# ログアウト
- name: Logout of Amazon ECR
if: always()
run: docker logout ${{ steps.login-ecr.outputs.registry }}
# ジョブを分けなくても動く
deploy:
needs: build-register
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-1
- name: Deploy
env:
ECS_CLUSTER_ARN: arn:aws:ecs:ap-northeast-1:0123456789:cluster/my-cluster-name # ECS のクラスター名
ECS_SERVICE_NAME: my-service-name # ECS のサービス名
run: |
aws ecs update-service --cluster $ECS_CLUSTER_ARN --service $ECS_SERVICE_NAME --force-new-deployment
Github Actions の詳細
AWS ECR への ログインはこのようにする。前のステップで Credentials 認証を設定するのと併せて必須。
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
プッシュした Docker イメージを置き換えただけではサービスは反応してくれないので、強制デプロイを aws-cli で行う。
aws ecs update-service --cluster $ECS_CLUSTER_ARN --service $ECS_SERVICE_NAME --force-new-deployment