Slide 1

Slide 1 text

ECSのCanaryリリースを Externalデプロイタイプで 実現する方法 2024-08-02 #FinaTech t-kikuc @PipeCD Team 1

Slide 2

Slide 2 text

アジェンダ 1. 自己紹介 2. PipeCDの紹介 3. 前提知識: Canary, Externalデプロイタイプ, TaskSet 4. ExternalでのCanaryリリースの流れ 5. 補足、おわりに 2

Slide 3

Slide 3 text

Tetsuya Kikuchi 3 @t-kikuc @t_kikuc ● PipeCDのメンテナ @ (株)サイバーエージェント ○ PipeCD: OSSのデプロイツール ○ 主にAWS関連機能(ECS,Lambda)の開発を担当 ● 関心領域: CI/CD、DevOps ● 今年度AWS認定10個ぐらい失効します

Slide 4

Slide 4 text

PipeCDとは ● PipeCD: OSSのデプロイツール ○ ECS, Lambda, Kubernetes, Terraform, CloudRunに対応 ○ CanaryやBlue/Greenが強み ○ Gitと実環境とで差分があった場合、自動で再デプロイ ● CNCFのSandboxプロジェクトの一つ ● 先月GitHubのStar⭐が 1,000到達 4

Slide 5

Slide 5 text

3. 前提知識 5

Slide 6

Slide 6 text

Canaryリリースとは ● リリースを安全にするための手法 ○ キャパシティを落とさず、かつ不具合時の影響を小さくできる ● リリース時に新バージョンのアプリを別途デプロイ →エラーなければ全体をバージョン更新 6 Task Task v1 Task Task v1 Task v2 Task Task v2 Task Task v2 Task v2

Slide 7

Slide 7 text

Externalデプロイタイプとは ● ECSのデプロイタイプの1つ ○ コンソールからは選択できない ● デプロイを外部から制御したい場合に用いる ○ 例)GitHub Actionsでデプロイしたい場合、 承認フェーズを挟みたい場合 ● 複数のAPIを操作して自前でデプロイを制御する https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-external.html 7

Slide 8

Slide 8 text

TaskSet-B ● Service配下で、同じTask定義を共有する論理的なグループ ○ Task数の調整も、TaskSet毎に行われる ○ TaskSet毎にTargetGroupをアタッチできる ● ※ ECSのコンソールを見ても、“TaskSet”は見当たらない... Service TaskSet-A Task Task Task v1 Task Task Task v2 TaskSetとは 8 TargetGroup-A TargetGroup-B

Slide 9

Slide 9 text

4. Canaryリリースの流れ 9

Slide 10

Slide 10 text

ECS Service-A 0. 初期状態 TaskSet-Primary ELBからTargetGroup経由で、Serviceにトラフィックが流れている Task Task Task v1 10 ELB Listener Rule port: XX

Slide 11

Slide 11 text

Service-A 1/5. CanaryのTaskSetを作成する (CreateTaskSet) TaskSet-Primary Task Task Task v1 11 TaskSet-Canary Task Task Task v2 ECS ELB Listener Rule port: XX

Slide 12

Slide 12 text

Service-A 2/5. 一部のトラフィックをCanaryに流す TaskSet-Primary Listener RuleのTargetGroupのWeightを変更する (例)100:0 →90:10 Task Task Task v1 12 TaskSet-Canary Task Task Task v2 ECS ELB Listener Rule port: XX

Slide 13

Slide 13 text

Service-A 3/5. Primaryをv2に更新する (UpdateTaskSet) TaskSet-Primary TaskSet内の更新は、RollingUpdateで行われる Task Task Task v2 13 TaskSet-Canary Task Task Task v2 ECS ELB Listener Rule port: XX

Slide 14

Slide 14 text

Service-A 4/5. トラフィックをPrimaryのみに戻す TaskSet-Primary Task Task Task v2 14 TaskSet-Canary Task Task Task v2 ECS ELB Listener Rule port: XX

Slide 15

Slide 15 text

Service-A 5/5. CanaryのTaskSetを削除する (DeleteTaskSet) TaskSet-Primary Task Task Task v2 15 ECS ELB Listener Rule port: XX

Slide 16

Slide 16 text

PipeCDではyaml定義すればCanaryを実現できる 16 Pipelineの定義 (.yaml) PipeCDのUI

Slide 17

Slide 17 text

5. 補足、おわりに 17

Slide 18

Slide 18 text

補足 ● Externalデプロイタイプには制約も多いので注意 ○ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-external.html#deployment -type-external-considerations ● PipeCDはService Discoveryでも一部異なる仕組みでCanary対応済 ○ 仕組み: https://qiita.com/t-kikuc/items/25bd032606d878229ed7 ○ 肝:ELBがいない ○ Service Connect、App Meshは未対応 ● PipeCDでの主な該当コード ○ https://github.com/pipe-cd/pipecd/blob/master/pkg/app/piped/executor/ecs/deploy.go ○ https://github.com/pipe-cd/pipecd/blob/master/pkg/app/piped/platformprovider/ecs/client.go 18

Slide 19

Slide 19 text

おわりに ● PipeCDの入門ハンズオン公開したので、是非トライしてください! ○ 30m~1hでPipeCDの構築からデプロイまで試せます ● 「俺はECS/Lambdaでこんなデプロイがしたい」 ご意見お待ちしてます 19 PipeCD Tutorial https://github.com/pipe-cd/tutorial