Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Blue / Green デプロイと安全性と複雑性と #AWSDevDay

Blue / Green デプロイと安全性と複雑性と #AWSDevDay

Talked at AWS Dev Day Japan 2022.

はまーん

November 09, 2022
Tweet

Video


Resources

More Decks by はまーん

Other Decks in Programming

Transcript

  1. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. Blue / Green デプロイと 安全性と複雑性と C - 3 Shinichi Hama(はまーん) / track3jyo Startup Solutions Architect, West Japan Amazon Web Services Japan G.K.
  2. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Shinichi Hama / track3jyo Startup Solutions Architect Amazon Web Service Japan --- work: - ⻄⽇本のスタートアップ⽀援 - コンテナ技術のあれこれ 過去のスライド: https://speakerdeck.com/track3jyo 趣味︓家のアーキテクチャを考えること
  3. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. セッション対象者とゴール 想定聴講者 • ソフトウェアのデプロイフローやアーキテクチャを普段から考えている • デプロイ関連の問題がなにかと多く、⽇々悩まされている開発者の⽅ • アプリケーションコードを安全にデプロイするための考え⽅やプラクティスが 知りたい ゴール • 「安全な」デプロイとはどんなデプロイなのかを改めて理解し、 ⾃分達のデプロイの安全性を阻害する原因は何かと改めて考えるきっかけにする • 必要⼗分なデプロイフロー/アーキテクチャをデザインし続ける必要性を知り、 実践できるようになる 前提︓2022/11/09 時点の Amazon Elastic Container Service(Amazon ECS) のデプロイを題材に話していきます
  4. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ⼀般的なソフトウェアのリリースプロセス Source Build Test Production • ソースコードの チェックイン • コードの ピアレビュー • コードのコンパイル • ユニットテスト • スタイルチェッカー • コンテナイメージ、 関数デプロイ パッケージの作成 • 周辺システムとの 統合テスト • 負荷テスト • UI テスト • セキュリティ テスト • 本番環境への デプロイ • エラーを素早く検知 するための本番環境 のモニタリング
  5. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ⼀般的なソフトウェアのリリースプロセス Source Build Test Production
  6. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Amazon ECS におけるデプロイ戦略 ローリングアップデート CodeDeploy による Blue / Green デプロイ (+Canary デプロイ、線形デプロイ) External デプロイ
  7. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  8. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster Example service v2 • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  9. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster Example service v2 • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  10. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster Example service v2 • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  11. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster Example service v2 • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  12. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデート Example service v1 Amazon ECS cluster Example service v2 • Amazon ECS でコントロール • タスクを指定した数ずつ順番に更新していく
  13. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイ • AWS CodeDeploy, ALB でコントロール • Green タスク群に本番トラフィックを流す前にテストを実施 Blue tasks: v1 code ALB 100% Prod traffic
  14. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイ • AWS CodeDeploy, ALB でコントロール • Green タスク群に本番トラフィックを流す前にテストを実施 Blue tasks: v1 code Green tasks: v2 code ALB 100% Prod traffic 100% Test traffic
  15. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイ • AWS CodeDeploy, ALB でコントロール • Green タスク群に本番トラフィックを流す前にテストを実施 Green tasks: v2 code ALB 100% Test traffic Blue tasks: v1 code
  16. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイ • AWS CodeDeploy, ALB でコントロール • Green タスク群に本番トラフィックを流す前にテストを実施 Green tasks: v2 code ALB 100% Test traffic
  17. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. こういった話を⽿にすることがあります リリース時の起きる障害が多く、⼼配なので 安全な Blue / Green デプロイを採⽤します︕ 破壊的変更とかビッグバンリリースをしやすいので とりあえず Blue / Green デプロイにします︕
  18. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. こういった話を⽿にすることがあります リリース時の起きる障害が多く、⼼配なので 安全な Blue / Green デプロイを採⽤します︕ 破壊的変更を⼊れやすいので、 とりあえず Blue / Green デプロイにします︕ 安全性を損ねている問題の本質と 本当に向き合えているのでしょうか︖ デプロイフロー/プロセスの複雑化が進み、 安全性を損ねる結果につながっていないでしょうか︖
  19. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. 安全なデプロイとは何か︖
  20. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. “安全な” デプロイとは︖ !
  21. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイにおける “安全” を考える • 意図した変更が本番環境にデプロイされること Ø 「意図した変更が、きちんと反映される」整備されたデリバリープロセスがある • 意図しない状況が発⽣した場合の影響を最⼩限にできること Ø 意図しない状況を絶対に起こさない、全ての状況を事前に想定するのは現実不可能 Ø 意図しない状況が発⽣した場合のユーザーや関連サービスへの影響をできるだけ⼩さくする
  22. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 開発者の意図した変更をデプロイするには デプロイ前の検証や動作確認を充実させる
  23. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 意図しない状況を最⼩限にするには ロールバックの導⼊
  24. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデートのロールバック [バージョン情報] アーティファクトのラベルで管理 [ロールバックの実施] 稼働中のバージョンを新しい コンポーネントにデプロイして置き換え v2 v2 v1 v1 v2 v2 v1 v1 v2 v2
  25. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ローリングアップデートのロールバック [バージョン情報] アーティファクトのラベルで管理 [ロールバックの実施] 稼働中のバージョンを新しい コンポーネントにデプロイして置き換え v1 v1 v1 v1 v2 v2 v1 v1 v2 v2
  26. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイのロールバック [バージョン情報] Blue 環境として保持 [ロールバックの実施] Green 環境のトラフィックを Blue 環境に切り替える バージョン 1 v1 v2
  27. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイのロールバック [バージョン情報] Blue 環境として保持 [ロールバックの実施] Green 環境のトラフィックを Blue 環境に切り替える バージョン 1 v1 v2
  28. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 安全性が保たれていないデプロイでは • サービスを利⽤するエンドユーザーへの影響 Ø Error Rate 上昇、レイテンシーの増加、サービス中断 • リリース時に⼈を介した確認作業が増えていく Ø e.g. ⼿動でのテスト、⽬視確認、ダブルチェック、段階的な承認プロセス..etc Ø 本来集中したいビジネスロジックの開発にかける時間が減っていく • デプロイにおける⼼理的安全性の低下により、⽣産性が著しく低下 Ø 「また⾃分の書いたコードで問題になるのではないか」と億劫になる
  29. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイ関連の問題の⼤半は、 複雑で不安定なデプロイである 1. そもそもソフトウェアを作る段階でデプロイの容易性を 念頭に置いていない 2. ⼿作業による本番環境への変更・追加が デプロイプロセスの⼀部になっている 3. デプロイが複雑なため、 チーム間の作業の引き継ぎが多くなる - 「 L E A N と D E V O P S の 科 学 」 よ り -
  30. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. Blue / Green デプロイと 安全性と複雑性と
  31. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイと安全性 • ⼀度新しい環境でテスト/動作確認をした上で切り替えができ、 安全を確認した上で切り替えが可能 • 問題が発⽣した際も、トラフィックを元のバージョンの環境に切り 替えるだけなので、迅速にトラフィックの切り戻しが可能
  32. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Blue / Green デプロイと複雑性 Health checks ・何をトリガーに切 り替えを⾏うのか︖ ・何をトリガーに 切り戻すのか ・どうやって切り替 えを⾃動化するか︖ ・どんなメトリクス で判断するのか︖
  33. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 安全性を求めて Blue / Green デプロイを進めた結果、 複雑性だけが増し安全性も失うケース1 シチュエーション︓ • 本番リリース時の障害が多く、安全な Blue/Green デプロイを採⽤したい 何が問題か︖︓ • そもそも問題となっているのは 「意図した変更が本番環境にデプロイできないこと」 どうなるか︖︓ • そもそもの不具合が減るわけではないので、 結果的に⼿動での確認作業が増えていき、結果安全性も保てていない
  34. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 安全性を求めて Blue / Green デプロイを進めた結果、 複雑性だけが増し安全性も失うケース2 シチュエーション︓ • 破壊的変更とかビッグバンリリースをしやすいので、 とりあえず Blue/Green デプロイを採⽤したい 何が問題か︖︓ • ソフトウェアとしてのデプロイ容易性が低く、他のアプリケーションや コンポーネントに依存したデプロイが必要で、⼤きな単位でのリリースしか できない構造になっている どうなるか︖︓ • ⾃律性のないデプロイプロセスや、Blue/Green デプロイ⾃体が 複雑化しがちで、結果安全性も保てなくなってくる
  35. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 「とりあえず Blue /Green にしておきたい」という思考 • Blue / Green デプロイは安全性が⾼く、多機能なデプロイ戦略 • 「とりあえず Blue /Green にしておきたい」というメンタルモデル に課題がある • 多機能がゆえに、いろんなことをやりたくなり、 結果フローやプロセスの複雑性が増しがち • 今ある課題は本当にデプロイ戦略で解決すべき課題なのか
  36. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Amazon ECS ローリングアップデートの デプロイサーキットブレーカー v1 v2 v2 ... v1 v1 v1 ... New Deployment Rollback v1 v1 v1 ... • ECS サービスのデプロイで異常が発⽣した際、 以前のバージョンへの⾃動ロールバックが可能 • ⾃動ロールバックの実装を ECS に委ねて、 マネージドな⾃動化が可能 • 異常が発⽣したタスクの起動によるコストの発⽣や コンピューティングリソースの消費を抑える
  37. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイ失敗の判定 • ステージ 1、ステージ 2 の⼆段階で評価される • ステージ 1 Ø RUNNING 状態に遷移することなく、 タスクの起動が “しきい値” まで連続して失敗する • ステージ 2 Ø ヘルスチェック #1 の失敗により リプレースされたタスク数が “しきい値” に到達する #1: ELB / Cloud Map / コンテナ のヘルスチェック
  38. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Primary) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター
  39. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Active) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター container 1 container 2 ver2 (Primary) タスク定義 ver2 参照 flask_app_ver3.py
  40. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Active) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター container 1 container 2 ver2 (Primary) タスク定義 ver2 参照 Running
  41. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Active) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター container 1 container 2 ver2 (Primary) タスク定義 ver2 参照 Health Chek 500 Internal Server Error
  42. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Active) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター container 1 container 2 ver2 (Primary) タスク定義 ver2 参照 Health Chek FAILED としてマーク
  43. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイサーキットブレーカーの挙動 container 1 container 2 ver1 (Primary) ALB End User Developer ECS サービス タスク定義 ver1 参照 ECS クラスター タスク定義 ver2 ロールバック
  44. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. 複雑なデプロイ
  45. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. 複雑なデプロイ 「必要以上に」 (+アーキテクチャ、プロセス、実装 ...and more)
  46. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 本当に最初からその⾼度な仕組みが必要ですか 例えば、まだまだ成熟していないプロダクトやチームにおいて… • 本当に最初からその⾼度な仕組みが必要か • 複雑なデプロイプロセスやフローを導⼊することで満⾜していないか • チームやプロダクトに沿わない、わたしの考えた最強デプロイフローや アーキテクチャになっていないか 安全性を⽬指して設計したはずの仕組みが、結果安全性を損なうのは、多くの場合 チーム/プロダクトに沿わない、必要以上な仕組みを導⼊したことに起因します 他の例)Blue/ Green デプロイ、DB のライブマイグレーション、派⼿なピタゴラスイッチアーキテクチャ
  47. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Keep it simple, stupid. Kelly Johnson American aeronautical and systems engineer KISS の原則 設計の単純性(簡潔性)は成功への鍵である、「不必要な複雑性」は避けるべきだ
  48. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. シンプルとは何か︖ • 無駄がない Ø 「やるべきことに対して」無駄がない • 理解しやすい Ø 誰が⾒てもわかるということ Ø 「可読性が⾼い」「再利⽤しやすい」「変更しやすい」
  49. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. Invent and Simplify リーダーはチームにイノベーション(⾰新)とインベンション(創造)を求め、 同時に常にシンプルな⽅法を模索します。リーダーは状況の変化に注意を払い、 あらゆる場から新しいアイデアを探しだします。 それは、⾃分たちが⽣み出したものだけに限りません。私たちは新しいアイデアを実⾏に移す時、 ⻑期間にわたり外部に誤解される可能性があることも受け⼊れます。 シンプルな仕組みを⽬指しながら「常に思考を放棄しない」 「リスクや要件と向き合う」ことが重要
  50. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 「必要⼗分な」デプロイフロー/アーキテクチャを デザインし続ける • デプロイフローやアーキテクチャはその時々で無駄なく、 理解しやすい設計を⽬指す • ⽬の前にある課題から、少し視座を⾼く持って全体に⽬をむけ続ける Ø 少し要件を整理・⼯夫すればシンプルな仕組みにできないか︖
  51. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. デプロイにおける安全性と複雑性は 必ずしもトレードオフか︖
  52. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デプロイにおける安全性と複雑性は 必ずしもトレードオフか︖ • 少なくても最初のうちは安全性を保つことと複雑な仕組みというのは 必ずしもトレードオフではない • シンプルなデプロイフローを保ち続けることが 安全性を保つことにつながる • デプロイ戦略以外にも必ず向き合い整理することが近道 Ø デプロイ容易性・テスト容易性のあるソフトウェアを書く Ø 簡単にロールバックできるように、⼩さくデプロイを繰り返す Ø チーム内で⾃律してデプロイが⾏えるような疎結合な設計
  53. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. デプロイにおける安全性と複雑性は 必ずしもトレードオフか︖
  54. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. デプロイにおける安全性と複雑性は 必ずしもトレードオフか︖
  55. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. まとめ • 安全なデプロイとは • 「意図した変更が本番環境にデプロイされること」 • 「意図しない状況が発⽣した場合の影響を最⼩限にできること」 • デプロイにおける安全性と複雑性は必ずしもトレードオフではない • デプロイ関連の問題の⼤半は、複雑で不安定なデプロイが原因 • むしろシンプルなデプロイメントフローを保ち続けることが安全性を保つ • 必要⼗分なデプロイフロー/アーキテクチャをデザインし続ける • 複雑な仕組みが悪いわけではなく、「必要以上に」複雑になっていることが問題 • デプロイフローやアーキテクチャは変更可能な余⽩を持つ。常にその時々の最適を⽬指す
  56. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Thank you! © 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. Shinichi Hama(はまーん) track3jyo