💐

GitHub Actionsを用いたECSへのデプロイ

2023/03/09に公開

はじめに

ポートのSREを担当している @taiki.noda です。

EC2の既存システムをECSに移行しました。そのタイミングでデプロイ周りもリプレイスしたので、
今回はそのデプロイフローについて解説していこうと思います。

構成の解説

デプロイはGitHub Actionsから実行しています。

workflowの構成について

workflow_callという機能でworkflow fileの共通化をしています。
https://docs.github.com/ja/actions/using-workflows/reusing-workflows

具体的にはデプロイを実行するworkflowの中で、
デプロイ実行に共通で使用しているworkflowを呼び出しています。

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/caller_prod_ecs-deploy.yml#L10-L25

  • caller_prod_ecs-deploy.ymlの中で、ecs-deploy.ymlを呼び出している。

デプロイの流れ

以下のような流れです。

  • AWSの認証
  • イメージチェック
  • タスク定義の更新
  • migrationの実行
  • WebのECSへのdeploy
  • SidekiqのECSへのdeploy
  • airbrake deploy
  • slackへの通知

構成図

AWSの認証

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L80-L85

  • GitHub ActionsではOpenID Connectがサポートされています。
  • AWS側でロールを作成して、aws-actions/configure-aws-credentialsアクションを使用してAWS認証をしています。

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

イメージチェック

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L87-L94

  • デプロイしたいイメージがECRに存在するかを確認しています。
  • イメージビルドが終わってなくて、まだイメージがpushされていない場合はここがエラーになります。

タスク定義の更新

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L96-L138

  • aws-actions/amazon-ecs-render-task-definitionアクションを使用して、デプロイするイメージを使用したタスク定義のjsonファイルを新たに作成しています。
  • 作成のベースとなるjsonファイルは ./.github/task_definitions/配下にあります。

migrationの実行

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L149-L165

WebのECSへのdeploy

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L167-L178

appspec.yml
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: ""
        LoadBalancerInfo:
          ContainerName: "nginx"
          ContainerPort: "80"
        PlatformVersion: "LATEST"
  • TaskDefinitionは実行時に自動で設定されます。

SidekiqのECSへのdeploy

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L180-L188

  • sidekiqはローリングアップデートでデプロイしています。

airbrake deploy

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L190-L210

  • このプロジェクトでは、エラー管理にairbrakeを使っています。
  • ここでは、Deploy Trackingをmtchavez/airbrake-deploy-github-actionアクションで行っています。

https://docs.airbrake.io/docs/features/deploy-tracking/

slackへの通知

https://github.com/taikinoda/ecs-deploy-sample/blob/main/.github/workflows/ecs-deploy.yml#L212-L219

  • 最後に、8398a7/action-slack@v3アクションでslackにデプロイ成功・失敗通知を送っています。
  • 成功すると以下のように通知がきます。

Discussion