Share
Embed
Transcript
46 slides
-
1 Copyright(C) NRI Netcom, Ltd. All rights reserved. 話すこと・話さないこと
話すこと 話さないこと 本日の発表内容 ECSネイティブの Blue/Green デプロイとは Blue/Green デプロイとは デプロイフローを組むうえで使用したツール・機能の説明 CodeDeploy⇒ECSネイティブ方式への移行 CodeDeploy 方式との違い 持ち帰っていただきたいこと ECSネイティブ方式の Blue/Green デプロイ が推奨されている理由 デプロイフローを組むためのツールや機能 -
2 Copyright(C) NRI Netcom, Ltd. All rights reserved. 話すこと・話さないこと
話すこと 話さないこと 本日の発表内容 ECSネイティブの Blue/Green デプロイとは デプロイフローを組むうえで使用したツール・機能の説明 CodeDeployを使用したBlue/Green デプロイは↑を参照 CodeDeployからの移行は↑を参照 https://aws.amazon.com/jp/blogs/news/migrating-from-aws-codedeploy-to- amazon-ecs-for-blue-green-deployments/ https://tech.nri-net.com/entry/aws_ecs_deploy CodeDeploy 方式との違い Blue/Green デプロイとは CodeDeploy⇒ECSネイティブ方式への移行 -
3 Copyright(C) NRI Netcom, Ltd. All rights reserved. 自己紹介 自己紹介
基本情報 井手 亮太(いで りょうた) 大学時代は宇宙物理学を専攻 AWSを中心としたシステム運用・構築 サッカー観戦が生きがいのエンジニア 執筆ブログ 保有資格 好きなAWS サービス Amazon Bedrock Amazon ECS -
4 Copyright(C) NRI Netcom, Ltd. All rights reserved. ECS ネイティブの
Blue/Green デプロイとは -
5 Copyright(C) NRI Netcom, Ltd. All rights reserved. ECS ネイティブの
Blue/Green デプロイとは ECS ネイティブの Blue/Green デプロイとは Amazon ECS 内で完結してBlue/Green デプロイを可能とする機能 これまで、ECS上で動作するアプリケーションのBlue/Green デプロイを実施するには CodeDeployを介する必要があった Amazon ECS AWS CodeDeploy -
7 Copyright(C) NRI Netcom, Ltd. All rights reserved. CodeDeploy 方式の
Blue/Green デプロイ CodeDeploy 方式との比較 CodeDeploy で Blue/Green デプロイするために必要な設定 アプリケーション、デプロイグループ、appspec.yml 等を用意する必要があった ECS ネイティブ方式ではこれらのリソースが不要 AppSpec ファイルの例 - AWS CodeDeploy -
8 Copyright(C) NRI Netcom, Ltd. All rights reserved. ECS ネイティブの
Blue/Green デプロイを使用するべき理由 CodeDeploy 方式との比較 サーキットブレイカー機能 が使える CodeDeploy を介す必要がなくなった以外にも様々なメリットがある Service Connect に対応 Blue・Green の紐づけが リスナールール単位に -
9 Copyright(C) NRI Netcom, Ltd. All rights reserved. Service Connect
に対応 CodeDeploy 方式との比較 これまでは、ローリングアップデート のみの対応 Service Connect に対応 マイクロサービス化を実現する場合、機能ごとにECSサービスを分割することが考えられる ECSネイティブ方式では Blue/Green デプロイが可能に サービス間通信の一つとして、 Service Connect があった。 改めてECSサービス間通信を整理する - NRIネットコムBlog より引用 -
10 Copyright(C) NRI Netcom, Ltd. All rights reserved. サーキットブレイカー機能が使える CodeDeploy
方式との比較 v2 サーキットブレイカーとは デプロイ異常(コンテナ起動しない、ヘルスチェック失敗する等)あれば、自動ロールバックしてくれる機能 • CodeDeployによる Blue/Green デプロイ では、 サーキットブレイカーが使用不可 • 異常発生⇒即ロールバックを実現するには別途 CloudWatch アラーム、もしくはhook関数の実装が必要だった v1 v1 v1 -
11 Copyright(C) NRI Netcom, Ltd. All rights reserved. リスナー単位からリスナールール単位に CodeDeploy
方式との比較 ポートだけではなく、パスやヘッダーで本番・テストトラフィックが切り替えられるようになった。 -
13 Copyright(C) NRI Netcom, Ltd. All rights reserved. デプロイ前 ECS
ネイティブの Blue/Green デプロイの流れ Blue Target Group Green Target Group テストリスナールール 本番リスナールール / でアクセス /test でアクセス 100 100 0 0 ALB Amazon ECS 本番・テスト用リスナールール それぞれに Blue・Green両方の ターゲットグループが紐づいている トラフィックの向き先は、ターゲット グループの「重みづけ」に基づく -
14 Copyright(C) NRI Netcom, Ltd. All rights reserved. テストトラフィック移行 ECS
ネイティブの Blue/Green デプロイの流れ Blue Target Group Green Target Group テストリスナールール 本番リスナールール / でアクセス /test でアクセス 100 0 100 0 ALB Amazon ECS Green用ターゲットグループで タスクが起動 テスト用リスナールールの ターゲットグループの重みが変化 -
15 Copyright(C) NRI Netcom, Ltd. All rights reserved. 本番トラフィック移行 ECS
ネイティブの Blue/Green デプロイの流れ Blue Target Group Green Target Group テストリスナールール 本番リスナールール / でアクセス /test でアクセス 0 0 100 100 ALB Amazon ECS 本番用リスナールールの重みが変化 トラフィックがGreen環境に向く -
16 Copyright(C) NRI Netcom, Ltd. All rights reserved. Blue 環境のタスク削除
ECS ネイティブの Blue/Green デプロイの流れ Blue Target Group Green Target Group テストリスナールール 本番リスナールール / でアクセス /test でアクセス 0 0 100 100 ALB Amazon ECS ベイク時間経過後、Blue環境の タスクが削除される -
18 Copyright(C) NRI Netcom, Ltd. All rights reserved. 全体構成図 デプロイフローを組んでみる
ecspresso ALB Service Task tfstate tfstateを参照 …etc デプロイ ECS Cluster push Lambda • ECS サービス・タスクは ecspresso で管理 • それ以外のリソースは HCP Terraform で管理 • GitHub Actionsでデプロイ ECR -
19 Copyright(C) NRI Netcom, Ltd. All rights reserved. 全体構成図 デプロイフローを組んでみる
1. ecspresso とは 2. ecspresso とHCP Terraformの連携方法 3. Blue/Green デプロイ中のライフサイクル用 Lambda ecspresso ALB Service Task tfstate tfstateを参照 …etc デプロイ ECS Cluster push Lambda ECR ① ② ③ -
20 Copyright(C) NRI Netcom, Ltd. All rights reserved. ecspresso とは
デプロイフローを組んでみる ECS サービス・タスクのデプロイに特化したツール CI/CD ツールとの親和性 アプリ・インフラの責任範囲分離 AWS CloudFormation ecspresso アプリとインフラリソースでは更新サイクルが異なる ecspresso は IaC との連携が可能 CLI ベースで差分検出・デプロイ・ロールバックができるため、 自動化パイプラインとの統合が容易。 Github アイコン: Logo - Brand Toolkit Jenkins : Artwork Terraform : HashiCorp Brand Guidelines - Product Logos -
21 Copyright(C) NRI Netcom, Ltd. All rights reserved. ecspresso とは
デプロイフローを組んでみる ecspresso の設定ファイルは 3つ ecspresso.yml:どのECSサービス・タスクを管理するのかを記した設定ファイル ecs-service.json ECSサービスの設定値を定義するファイル ecs-task-def.json タスク定義を記すファイル デプロイ手法の設定 ネットワーク設定(どのVPC?どのサブネット?どのALB?) CPU、メモリなどのスペック設定 コンテナイメージ・IAMロールの設定 -
22 Copyright(C) NRI Netcom, Ltd. All rights reserved. ecspresso での
Blue/Green デプロイ ECS Blue/Green デプロイフローを組んでみる ecs-service.json 内の deploymentConfiguration で設定 Blue Target Group Green Target Group テストリスナールール 本番リスナールール / でアクセス /test でアクセス 100 100 0 0 ALB Amazon ECS -
23 Copyright(C) NRI Netcom, Ltd. All rights reserved. ecspresso と
HCP Terraform の連携 デプロイフローを組んでみる ecspresso と HCP Terraform の連携方法 2. ecspresso.yml 内で tfstate プラグインを使用する 1. HCP Terraform で API Tokenを発行し、環境変数に登録 Manage API tokens for HCP Terraform | Terraform | HashiCorp Developer Add support Terraform Cloud / Terraform Enterprise by cohalz · Pull Request #30 · fujiwara/tfstate-lookup · GitHub HCP Terraform 上の tfstate を参照できるようになる urlには、HCP Terraform の Organizations、ワークスペース を入力する -
24 Copyright(C) NRI Netcom, Ltd. All rights reserved. Blue/Green デプロイあるある
デプロイフローを組んでみる 本番トラフィックの向き先を変更する前に、十分な動作確認をしたい!! 本番リスナールールのトラフィックが Green環境に向く前に動作確認をしたい -
25 Copyright(C) NRI Netcom, Ltd. All rights reserved. Blue/Green デプロイあるある
デプロイフローを組んでみる 本番トラフィックの向き先を変更する前に、十分な動作確認をしたい!! トラフィックの切り替わりは、自動的に実施される。 ⇒ デプロイを一時停止する仕組みが必要 -
26 Copyright(C) NRI Netcom, Ltd. All rights reserved. 全体構成図(再掲) デプロイフローを組んでみる
そこで登場するのが。。。ライフサイクルフックのLambda ecspresso ALB Service Task tfstate tfstateを参照 …etc デプロイ ECS Cluster push Lambda ECR -
27 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルフックとは デプロイフローを組んでみる
デプロイのプロセスを制御できる仕組みのこと デプロイ中の各ライフサイクルステージでLambdaを実行 レスポンス値によってデプロイのロールバック・一時停止・進行を制御 -
28 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルフックとは デプロイフローを組んでみる
デプロイのプロセスを制御できる仕組みのこと デプロイ中の各ライフサイクルステージでLambdaを実行 レスポンス値によってデプロイのロールバック・一時停止・進行を制御 概要 hookstatus 30秒後にLambdaが再試行(秒数は変更可能) IN_POGRESS デプロイが次のライフサイクルステージに向かう SUCCEEDED ロールバックされる FAILED -
29 Copyright(C) NRI Netcom, Ltd. All rights reserved. ECS ネイティブの
Blue/Green デプロイの流れ(ライフサイクルフック有) -
30 Copyright(C) NRI Netcom, Ltd. All rights reserved. デプロイ前 ECS
ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) 本番・テスト用リスナールール それぞれに Blue・Green両方の ターゲットグループが紐づいている トラフィックの向き先は、ターゲット グループの「重みづけ」に基づく -
31 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルフック用のLambdaが起動し、 動作確認フェーズに入る
Green用ターゲットグループで タスクが起動 テスト用リスナールールの ターゲットグループの重みが変化 テストトラフィック移行 ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
32 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルフック用Lambdaは •
ターゲットグループのステータス確認 • 承認ファイルの有無 を確認 デプロイワークフロー内で承認ステージになる 承認ステージ ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
33 Copyright(C) NRI Netcom, Ltd. All rights reserved. Hookstatus は以下の条件に基づき決定されるように実装
概要 条件 hookstatus 30秒後にLambdaが再試行 ターゲットグループのステータス が200~300 IN_POGRESS デプロイが次のライフサイクルステー ジに向かう S3に承認ファイルがある& ターゲットグループのステータス が200~300 SUCCEEDED ロールバックされる それ以外 FAILED 承認ステージ ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
34 Copyright(C) NRI Netcom, Ltd. All rights reserved. S3バケットに承認ファイルが存在しない Lambda
は IN_PROGRESSを返し、 30秒後に Lambda が再試行 デプロイプロセスが一時中断され、 テストリスナールール経由の動作確認が可能 動作確認 ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
35 Copyright(C) NRI Netcom, Ltd. All rights reserved. 動作確認が終了次第、承認。 S3
バケットに承認ファイルアップロード Lambda が 承認ファイルを検知し、 SUCCEDED を返す デプロイプロセスが次のステージに移行 動作確認終了後 ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
36 Copyright(C) NRI Netcom, Ltd. All rights reserved. 本番用リスナールールの重みが変化 トラフィックがGreen環境に向く
本番トラフィック移行 ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
37 Copyright(C) NRI Netcom, Ltd. All rights reserved. ベイク時間経過後、Blue環境の タスクが削除される
Blue 環境のタスク削除 ECS ネイティブの Blue/Green デプロイの流れ(ライフサイクルフック有) -
39 Copyright(C) NRI Netcom, Ltd. All rights reserved. 必要な実装 GitHub
Actions でどう実装するの? 非同期でデプロイ開始 デプロイの状態がどうなっているか 承認機能 デプロイ開始!! 後は任せた!! 承認機能 そういえば デプロイ状況どう? 承認機能 他処理 echo “Hello ECS” echo “Hello Ryota” . . . とある ecspresso コマンド+GitHub の設定で実現可能 必要な実装を整理する -
40 Copyright(C) NRI Netcom, Ltd. All rights reserved. ecspresso のとあるコマンド
GitHub Actions でどう実装するの? 1. ecspreeso deploy --no-wait 2. ecspreeso wait –wait-until=“stable” 非同期でデプロイ開始 デプロイ開始!! 後は任せた!! 承認機能 デプロイの状態がどうなっているか そういえば デプロイ状況どう? 承認機能 他処理 echo “Hello ECS” echo “Hello Ryota” . . . --no-wait を指定することで 非同期でデプロイ可能 以下二つの状態を指定可能 stable:ECSサービスがstable状態になる deployed:デプロイが完了するまで -
41 Copyright(C) NRI Netcom, Ltd. All rights reserved. GitHub の設定
GitHub Actions でどう実装するの? GitHub Environments を設定する デプロイに環境の使用 - GitHub ドキュメント を参照 「環境」を作り、その「環境」に対して諸々ルールを適用することができる機能 例 「production」という環境を作り、その環境には「1人以上のレビューが必須」というルールを紐づける 環境は environment で設定する 承認が下りるまでジョブは実行されない -
43 Copyright(C) NRI Netcom, Ltd. All rights reserved. 発表内容のまとめ まとめ
CodeDeploy 方式との比較 • Service Connect 、サーキットブレイカーの使用、Blue/Greenの紐づけがリスナールール単位になったため、柔軟性が高い • ただし、本番トラフィックの切り替えに関しては、CodeDeploy の方が容易 デプロイワークフロー構築 • アプリ・インフラの更新ライフサイクルの違い・責任範囲の明確化のためには ecspresso を使用するべき • ecspresso は HCP Terraform をはじめとした IaC との連携が可能 • ライフサイクルフックを使用することで、本番トラフィック切り替え前に、動作確認が可能 • ecspresso の非同期デプロイと GitHub の Enviroment で承認フロー構築可能 -
44 Copyright(C) NRI Netcom, Ltd. All rights reserved. 発表内容のまとめ まとめ
ブログも書いています!! ECS Blue/Greenデプロイ攻略:ライフサイクルフックで本番切り替えを制御する (https://tech.nri-net.com/entry/ecsblue_green_deployment_strategy)