💐
GitHub Actionsを用いたECSへのデプロイ
はじめに
ポートのSREを担当している @taiki.noda です。
EC2の既存システムをECSに移行しました。そのタイミングでデプロイ周りもリプレイスしたので、
今回はそのデプロイフローについて解説していこうと思います。
構成の解説
デプロイはGitHub Actionsから実行しています。
workflowの構成について
workflow_call
という機能でworkflow fileの共通化をしています。
具体的にはデプロイを実行するworkflowの中で、
デプロイ実行に共通で使用しているworkflowを呼び出しています。
-
caller_prod_ecs-deploy.yml
の中で、ecs-deploy.yml
を呼び出している。
デプロイの流れ
以下のような流れです。
- AWSの認証
- イメージチェック
- タスク定義の更新
- migrationの実行
- WebのECSへのdeploy
- SidekiqのECSへのdeploy
- airbrake deploy
- slackへの通知
構成図
AWSの認証
- GitHub ActionsではOpenID Connectがサポートされています。
- AWS側でロールを作成して、aws-actions/configure-aws-credentialsアクションを使用してAWS認証をしています。
イメージチェック
- デプロイしたいイメージがECRに存在するかを確認しています。
- イメージビルドが終わってなくて、まだイメージがpushされていない場合はここがエラーになります。
タスク定義の更新
- aws-actions/amazon-ecs-render-task-definitionアクションを使用して、デプロイするイメージを使用したタスク定義のjsonファイルを新たに作成しています。
- 作成のベースとなるjsonファイルは
./.github/task_definitions/
配下にあります。
migrationの実行
- 先程作成したRun task用のタスク定義jsonをaws-actions/amazon-ecs-deploy-task-definitionアクションで登録し、migrationコマンドを実行しています。
-
./run_task.sh
の詳細は省きますが、Step FunctionsのStartExecutionを実行して、ECSのタスクを実行しています。- 以前書いたStep FunctionsとECS fargateを使ってバッチ処理を構成した#タスクの単発実行で解説しているものとイメージ的には同じです。
WebのECSへのdeploy
- aws-actions/amazon-ecs-deploy-task-definitionアクションとcodedeployを使って、Blue/Green Deployをしています。
-
appspec.yml
はプロジェクトのルートにあり以下のような内容です。
appspec.yml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: ""
LoadBalancerInfo:
ContainerName: "nginx"
ContainerPort: "80"
PlatformVersion: "LATEST"
-
TaskDefinition
は実行時に自動で設定されます。
SidekiqのECSへのdeploy
- sidekiqはローリングアップデートでデプロイしています。
airbrake deploy
- このプロジェクトでは、エラー管理にairbrakeを使っています。
- ここでは、Deploy Trackingをmtchavez/airbrake-deploy-github-actionアクションで行っています。
slackへの通知
- 最後に、8398a7/action-slack@v3アクションでslackにデプロイ成功・失敗通知を送っています。
- 成功すると以下のように通知がきます。
Discussion