Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Amazon CloudFrontを活用したゼロダウンタイム実現する安定的なデプロイメント /...

Amazon CloudFrontを活用したゼロダウンタイム実現する安定的なデプロイメント / 20241129 Yoshiki Shinagawa

2024/11/29 CloudNative Days Winter 2024
https://event.cloudnativedays.jp/
https://event.cloudnativedays.jp/cndw2024/talks/2451
株式会社SHIFT ソリューション本部 エンジニア 品川 慶樹

SHIFT EVOLVE

November 28, 2024
Tweet

More Decks by SHIFT EVOLVE

Other Decks in Technology

Transcript

  1. 1 登壇者紹介 名前: 品川 慶樹 所属: 株式会社SHIFT ソリューション本部ソリューション事業部 ITソリューション部アプリケーション開発テクノロジーグループ 役割:

    エンジニア 略歴: 新卒でSIerに入社しエンジニアとして 様々な業種のWebシステム系のソリューションの設計/開発/運用を経験 (金融/出版/製造業/広告/BPO、等) 2022年にSHIFT入社後はソリューション案件や自社プロダクトの開発に従事 GitHub: @s-yoshiki
  2. 5 サービス説明: 技術構成 フロントエンド: React, Next.js バックエンド: NestJS + Prisma

    DB: MySQL 8.0 プラットフォーム: AWS (CloudFront/ECS/Fargate/RDS 等) その他: AWS CDK, GitHub, GitHub Actions pnpm + Turborepo 特徴として、複数のアプリケーション/ツールを Monorepo 方式で管理 バックエンドはモノリシックアーキテクチャで構成され部分的にモジュラモノリス要素も取り入れている BF/FE間はRESTful APIで連携し、SSRも活用している
  3. 変更後の構成: 構成の全体像 10 通常のリクエスト 開発者のリクエスト Staging Distribution Production Distribution A環境

    B環境 ポイントはALB/DB共有する2つの環境を用意 HTTPヘッダの種別・有無でリクエストを振り分ける ※ 詳細な説明は後述 Policy
  4. 変更後の構成: CloudFront Continuous Deploymentの仕組みと特徴 12 • プロダクションとステージングの2つのディストリビューションで構成される • 2つのディストリビューション同一ドメインで参照できる •

    ステージングはプロダクションの設定をベースにオリジンやビヘイビアの調整が可能 • プロダクションにステージングの設定を反映(プロモート)することでリリースを行う ※マネジメントコンソールのCloudFrontのディストリビューションのページから参照することができる
  5. 変更後の構成: デプロイ時の動き 13 ALB/DB共有する同じ構成の2つの環境を用意 HTTPヘッダの種別・有無でリクエストを振り分け 通常のリクエスト 開発者のリクエスト Staging Distribution Production

    Distribution header=B headerなし header=B A環境 B環境 header=B header=A ★アクティブ環境 ALBのリスナールールでヘッダに基づいて A/B環境へのリクエストを振り分ける CloudFrontのオリジンの機能を利用し ヘッダが存在しない場合ヘッダをセットする 通常運用時は非アクティブ環境のサーバは落としている デプロイ前の状態 if (header!=B) header=A 通常運用時に一般ユーザが参照している環境 リクエスト振り分け判定は実際にはヘッダだけでなく Policyの有効/無効の条件にも影響されるが 便宜上省略する 開発者はWebページへのリクエストに 細工を施して特殊なヘッダを付与して参照する この資料では header=A/Bとしているが、 実際には特殊なヘッダ名/トークンを採用している
  6. 変更後の構成: デプロイ時の動き 14 通常のリクエスト 開発者のリクエスト Staging Distribution Production Distribution header=B

    headerなし header=B A環境 B環境 header=B header=A ★アクティブ環境 デプロイのワークフローを実行し、 ECRに新イメージをpushし、B環境のタスクを更新する コンテナイメージ if (header!=B) header=A ECSの更新は ローリングアップデート
  7. 変更後の構成: デプロイ時の動き 15 通常のリクエスト 開発者のリクエスト Staging Distribution Production Distribution header=B

    headerなし header=B A環境 B環境 header=B header=A ★アクティブ環境 Promote実行 B環境で動作確認を行い、問題がないことを確認できたらProduction Distributionに Staging Distributionの設定を反映する ヘッダ周りの挙動が変更される if (header!=B) header=A ↓ if (header!=A) header=B
  8. 変更後の構成: デプロイ時のワークフロー 17 build deploy ECR ECS コンテナ イメージ GitHub

    Actionsの Workflowをキック 本番化検証 CloudFront 開発者 Deployment pipeline CDK Promoteを行う スクリプトの実行 1 2 3 4 5
  9. 18 メリット メリット • 既存のアプリケーションを稼働しながら新アプリケーションの本番環境テストが可能 • APIのインタフェースに破壊的な変更が発生しても考慮を必要としない • ロールバックが容易 •

    任意のリソースを並行稼働することができる 既存の運用を維持しつつ無停止のデプロイを実現 デメリット • 2環境を並列稼働するのでコスト増
  10. 20 Q&A Q1. ECS で Blue/Green Deploy をやれば良いのでは? A 様々な経緯によりCloudFrontに紐つく複数のリソースが依存し合っている状態のため難しい。

    加えて本番環境で検証を行うというワークフローを実現するのも難しい。 (技術的な問題+人的な問題) アーキテクチャがシンプルで綺麗に構築されており、ワークフロー等の制約がなければ、 ECS の Blue/Green Deploy という選択をしたと考えられる。