Slide 1

Slide 1 text

Feature 環境の⾃動⽣成と Blue Green Deployment で効率的かつ 安全なリリースプロセスを構築 2022/11/01 CloudNative Days Tokyo 2022 プレイベント

Slide 2

Slide 2 text

⾃⼰紹介 猪熊 朔也 ( いのくま さくや ) / @sinocloudon - 株式会社 Red Frasco - インフラエンジニア u経歴 ⾦融系SIer -> リクルート -> ⾦融系スタートアップ -> Red Frasco uその他コメント - うどんが好きです - ラーメン⼆郎が好きです - うどん脳 をプロフィールアイコンにすることが多いです - 最初4年くらいは Java エンジニア - ここ5年くらいはインフラ・クラウド⼀⾊ 2

Slide 3

Slide 3 text

はじめに • AWS 上にデプロイしたコンテナの CI/CD に関するお話です • ALB / ECS / Fargate / CloudFormation / AWS CLI あたりが主に登場します • 各サービスに関する詳細な説明は割愛しますのでご了承ください • CI/CD ツールには CircleCI を採⽤しています • ただし、CircleCI の特定の機能に依存した仕組みではありません • 他ツールを使⽤されている場合は、適宜読み替えながらご参考いただ ければと思います 3

Slide 4

Slide 4 text

⽬次 1. はじめに 2. Blue Green Deployment 編 3. Feature 環境⾃動⽣成 編 4. まとめ

Slide 5

Slide 5 text

5 1. はじめに

Slide 6

Slide 6 text

とある不動産ポータルサイトのAWS移⾏を進めています 6 【物件情報がポータルサイトに掲載されるまでの流れ】 不動産会社 担当者 物件情報⼊⼒ 物件情報変換 物件情報表⽰ 物件管理 システム データ 連動 物件データ 画像データ 他システム 物件データ 画像データ ⼿⼊⼒ コンバータ 各種ポータルサイト データ 連動 デ ー タ 連 動 ⾃社ポータル 総合ポータル S 総合ポータル H 総合ポータル A データ 連動 データ 連動 データ 連動 カスタマー 物件探し ⼿⼊⼒またはシステム連携によって 物件情報を管理システムに登録する 登録された物件情報を各種ポータルサイトの 仕様に沿ったデータ形式に変換する 物件情報がポータルサイトに掲載される AWS に移⾏中 • とあるクライアント様の⾃社ポータルサイトを AWS に移⾏しています

Slide 7

Slide 7 text

現⾏サイト 新サイト とある不動産ポータルサイトのAWS移⾏を進めています 7 オンプレミス AWS 仮想サーバー コンテナ (ECS on Fargate) Java Node.js (Apollo) Java(JSP) Next.js プラットフォーム 実⾏環境 バックエンド フロントエンド • TypeScript ベースの構成に再構築

Slide 8

Slide 8 text

AWS アカウント全体構成 8 ここの話

Slide 9

Slide 9 text

ポータルサイトのインフラ構成 9 本番環境 開発・ステージング環境

Slide 10

Slide 10 text

ポータルサイトのインフラ構成 10 • 3つの ECS Service で成り⽴つ • 各 ECS Service の前段に ALB をはさむ • インフラコストは増えるが、Connection Draining など ALB の機能が使えるメリットを優先 Public subnet Private subnet ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server)

Slide 11

Slide 11 text

私たちの開発スタイル・リリースプロセス • JIRA 起票 -> PRレビュー -> ステージング反映 -> 本番反映 の流れ • 環境とブランチは 1:1 対応 • feature︓チケットごとに作成。各⾃機能開発を⾏う • stg1 〜 5︓ステージング環境⽤ブランチ(数字つきstg) • 利⽤者調整なくステージング環境を利⽤できるようにするために存在 • 本番環境とのかい離はある程度あっても許容 • stg︓ステージング環境⽤ブランチ(無印stg) • リリース前の動作確認に使⽤ • リリース案件がない限り、原則 main (本番環境) と同期 • main︓本番環境⽤ブランチ 11

Slide 12

Slide 12 text

現⾏デプロイ基盤が抱えていた課題 • オンプレミス上でも⾃動リリースは導⼊済 • リリースのたびに、数10秒程度のダウンタイムが発⽣ • 2021年実績だと、約700チケット / 年くらいリリース実施 • 700 チケット × 10 秒 = 7,000秒 = 116.7 分 のダウンタイムが発⽣する計算 • リリースすればするほどダウンタイムが増える構造をなんとかしたい 12 Blue / Green Deployment 導⼊を決意

Slide 13

Slide 13 text

こうして、新しいデプロイパイプラインが⽣まれました 13 feature/xxx feature/yyy feature/zzz Developer Developer Developer JIRA xxx JIRA yyy JIRA zzz create create create ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 stg merge ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) Front Service (Next.js) ALB API Service (Apollo Server) リリース main merge ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) Front Service (Next.js) ALB API Service (Apollo Server) リリース ステージング環境 本番環境 ブランチが削除されたら 環境をすべて削除 Blue / Green Deployment

Slide 14

Slide 14 text

14 2. Blue Green Deployment 編

Slide 15

Slide 15 text

実際のデプロイパイプライン • CircleCI でワークフローを定義 • CloudFormation + AWS CLI のみで必要な処理を実装 15 ALB 更新 • アプリケーションビルド • Unit Test 実⾏ • ECS Cluster 更新 • ECS Task Definition 更新 ECS Service 更新 • 疎通確認 • 環境切り替え 後処理(キャッシュパージ) • Slack通知 • E2Eテスト

Slide 16

Slide 16 text

ECSのデプロイ⽅式 • 待機系をすべて更新し、疎通確認OKであればALBの向き先を切り替える 16 Public subnet Private subnet ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) CloudFormation ①待機系の更新 Main Listener Test Listener ②疎通確認 ③切り替え

Slide 17

Slide 17 text

17 2.1. 構築フェーズの振り返り

Slide 18

Slide 18 text

まずはとりうる構成パターンを整理 • 既存CI(CircleCI)との連携、マネージドの活⽤を念頭に構成を検討 18 No. 構成パターン 考えたこと 1 CodeDeploy(その他Codeシリーズ含む) • Codeシリーズを活⽤したマネージド構成 • https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userg uide/deployment-type-bluegreen.html • 役割分担次第ではあるが、⾒かけ上CI/CD 基 盤が重複するので、Codeシリーズがっつり 使ってしまって良いか悩んだ • マネージドであることは強⼒だが、逆に細 やかなカスタマイズがしづらい副作⽤はな いだろうか︖ 2 CloudFormation • CloudFormation から CodeDeploy の Blue / Green Deployment を実⾏ • https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/lat est/UserGuide/blue-green.html • 考慮事項が多く、時期尚早な印象を受けた • ネストスタック未サポート • Outputs の Import / Export 未サポート • Feature環境⾃動⽣成への流⽤を考えると、 スタック分割できないと環境のカスタマイ ズが必要になった際にしんどいかも 3 CircleCI(⾃前で頑張る) • CI 上に Blue / Green Deployment パイプラインを実装する • アプリケーションの CI/CD との連携が柔軟 • ⾃前実装なのでマネージドに⽐べると⼤変 • 要件に応じたカスタマイズがしやすい

Slide 19

Slide 19 text

当初案: CircleCI + CloudFormation + CodeDeploy による B/G Deployment • CircleCI でデプロイパイプラインを構築 • 必要な AWS リソースは CloudFormation 経由でデプロイ • ECS の Blue / Green Deployment 部分のみ、CodeDeploy に任せる 19 ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) Front Service (Next.js) API Service (Apollo Server) CloudFormation ①リソースの初期構築は CloudFormation で実施 CodeDeploy CodeDeploy CodeDeploy ②CodeDeployで 切り替え ②CodeDeployで 切り替え ②CodeDeployで 切り替え

Slide 20

Slide 20 text

実際にパイプラインを回して気づいた課題 • CodeDeploy でしかデプロイできない • ECS の仕様によるもの(デプロイタイプ=CodeDeploy) • 取り急ぎコンソールから設定を変えるといったことができない • 複数 ECS Service 間の整合性を本当に保つことができるか︖ • CodeDeploy によるデプロイ単位はあくまで ALB - ECS 1セットのみ • 複数サービスをデプロイしている場合、各サービス間の順序性や依存 性を考慮し、整合性を維持しながらデプロイする必要がある • 途中でデプロイ失敗したときはどうなる︖ 20

Slide 21

Slide 21 text

開発も佳境に差し掛かっていたところでしたが… 21 パイプライン書き直し︕

Slide 22

Slide 22 text

実際のデプロイパイプライン(再掲) 22 ALB 更新 • アプリケーションビルド • Unit Test 実⾏ • ECS Cluster 更新 • ECS Task Definition 更新 ECS Service 更新 • 疎通確認 • 環境切り替え 後処理(キャッシュクリア) • Slack通知 • E2Eテスト

Slide 23

Slide 23 text

ポイントその1︓依存関係のないジョブはなるべく並列で • 当たり前ですが、CI ツールの利点をなるべく活かす • ALB の更新や、ECS Cluster、ECS Task Definition の更新は並列 • ECS Service は、ALB、ECS Task Definition 更新完了後でなければ実⾏でき ないので、後続ステップとして定義 23

Slide 24

Slide 24 text

ポイントその2︓切り替え前に切り替え OK/NG 確認を⾏う • Webサービスとして正常に起動していない状 態でリリースされないように、環境を切り替 える前に最終確認を⾏う • テスト⽤のリスナー経由で以下を実施 • 確認⽤URL にアクセスする • 200 OK かつ レスポンス 1s 以下なら OK • 200 OK 以外 または レスポンス 10s以上なら NG • OK が 3回でジョブ成功 • NG が 3回でジョブ失敗(リリースされない) 24

Slide 25

Slide 25 text

ポイントその3︓毎回デプロイターゲットを確認する • ALB, ECS 更新ステップでは毎回デプ ロイ対象(Blue または Green)を確認 する • ジョブが途中で失敗した場合でも失 敗時点からリトライできるようにす る 25

Slide 26

Slide 26 text

26 2.2. 運⽤フェーズの振り返り

Slide 27

Slide 27 text

1 年間運⽤した実績︓よかったところ • 切り替え時のダウンタイムなし • Next.js のバージョンアップもダウンタイムなくリリースできた • Next.js 13もこの調⼦でアップデートするぞ︕ • Node.js のアップデート(Runtime, Library両⽅)も難なくできた • 切り戻しも⼀瞬でできる • ALB の向き先を変更するだけでOK • 1年間、本番リリース事故なし 27 リリースに対する⼼理的負荷がかなり減った

Slide 28

Slide 28 text

1 年間運⽤した実績︓今後の課題 • インフラコスト • 常に 2 ⾯保持するため、当然 1⾯ よりコストはかかってしまう • ビルド時間が⻑い( CI コスト) • 15分 〜 18分くらいを推移 • 継続的に速度改善をしていきたい • CloudFormation のデプロイ完了前に CircleCI のジョブがタイムア ウトすることがある 28

Slide 29

Slide 29 text

(余談) Datadog のダッシュボード 29

Slide 30

Slide 30 text

30 3. Feature 環境⾃動⽣成 編

Slide 31

Slide 31 text

Branch ⽣成をトリガーにテスト環境を⾃動構築 • Blue / Green Deployment で作成した CloudFormation を流⽤ • パラメータだけ変えれば動くようにしている 31 Public subnet Private subnet ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) CloudFormation

Slide 32

Slide 32 text

Feature 環境⾃動⽣成パイプライン • Blue / Green Deployment ワークフローとほぼ同じ • CDN のキャッシュパージ処理は不要のため、削除している 32

Slide 33

Slide 33 text

テスト環境は社内コンソールからアクセス • 社内⽤コンソールを⽤意 • 稼働確認⽤URL • Datadog ログ • ECS Exec コマンド • GraphQL コンソール • ALB DNS名 33

Slide 34

Slide 34 text

ブランチが削除されたら、テスト環境も削除する • ブランチ削除トリガーで構 築したテスト環境を削除 • GitHub Actions で実施 • 以下のリソースを削除 • ECS Service • ECS Task Definition • ECS Cluster • ECR • CloudWatch Logs • ALB 34

Slide 35

Slide 35 text

35 3.1. 構築フェーズの振り返り

Slide 36

Slide 36 text

Prefix を⽣成して AWS リソースの⽂字数制限を回避 • ALB の名前は最⼤32⽂字まで • ブランチ名やコミットハッシュを素直に⼊れられない • Prefix ⽣成処理を追加して⽂字数制限を回避 36 f [JIRA チケットNo.] - [ブランチ名のハッシュ先頭4⽂字] feature の「f」

Slide 37

Slide 37 text

CloudFormation は Condition で環境差分をコントロール • Feature 環境⽤の設定は CloudFormation の Condition で制御 • テンプレートを分けることもできるが、どの環境もなるべく同じテンプ レートから⽣成できることを優先 37

Slide 38

Slide 38 text

38 3.2. 運⽤フェーズの振り返り

Slide 39

Slide 39 text

Dependabot 対応をあとから実施 • Dependabot が⽣成するブランチを考慮できていなかった • あとで Dependabot 対応を実施 • Dependabot や renovate などが⽣成するブランチについても、最初から⾒越 して Prefix ⽣成処理を実装しておいた⽅がよかった 39 dep - [ブランチ名のハッシュ先頭4⽂字] dependabot の「dep」

Slide 40

Slide 40 text

VPC の CIDR が枯渇 • ALB をはさむ構成にしたため、CIDR 消費が激しい • ALB 1つにつき 8 IP を消費 • 1 環境構築すると、ALB × 3、ECS Service × 3 = 27 IP 消費 • 当初 /23 (IP数:512) で VPC を構築してしまったため、IP 枯渇が頻発 • 結局 VPC ごと再構築し、/20 (IP数: 4,096) に拡張 • VPC 再構築と同時に ALB 上限数も 50 から 200 に拡張 40

Slide 41

Slide 41 text

コストの問題 41 予算作成時 いま

Slide 42

Slide 42 text

⽌まらない円安

Slide 43

Slide 43 text

コスト削減策その1︓Feature は⽚⾯構成かつ最低スペックに • 最初は、Feature 環境も Blue / Green 両⾯構成 • コスト削減、リソース消費の抑制のため最⼩構成に変更 43 Public subnet Private subnet ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) CloudFormation

Slide 44

Slide 44 text

コスト削減策その2︓週末お掃除ジョブ追加 • 毎週⼟曜⽇に、すべての Feature 環境を削除するジョブを追加 • リソース削除には aws-nuke (https://github.com/rebuy-de/aws-nuke) を使⽤ • CircleCI のジョブをリランすることで、環境を復元 44

Slide 45

Slide 45 text

45 まとめ

Slide 46

Slide 46 text

Blue / Green Deployment , Feature 環境⾃動⽣成パイプラインを紹介 46 feature/xxx feature/yyy feature/zzz Developer Developer Developer JIRA xxx JIRA yyy JIRA zzz create create create ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) 環境構築 stg merge ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) Front Service (Next.js) ALB API Service (Apollo Server) リリース main merge ALB Proxy Service (Nginx) ALB Front Service (Next.js) ALB API Service (Apollo Server) Proxy Service (Nginx) Front Service (Next.js) ALB API Service (Apollo Server) リリース ステージング環境 本番環境 ブランチが削除されたら 環境をすべて削除 Blue / Green Deployment Feature 環境⾃動⽣成 Blue / Green Deployment

Slide 47

Slide 47 text

本セッション全体をとおしてのポイント • シンプルな切り替え⽅式 • 待機系の環境をすべて更新してから、先頭のALBの向き先だけ変える • 技術的な取り⼊れやすさ • 今回は、CircleCI + CloudFormation + AWS CLI で実装 • 何らかのCI ツール + 何らかの IaC ツール + CLI があれば基本導⼊できるはず • ⾃前実装なので労⼒はそれなりにかかったが、それに⾒合う恩恵を受けている • ただし、コスト抑制やビルド速度抑制を継続的に⾏わないと従量課⾦が… 47

Slide 48

Slide 48 text

⼤切な基盤は⾃分たちで管理・運⽤する覚悟をもって愚直にやる • スピーディかつ安定したリリース基盤 = 成果に結びつく基盤 • 成果 =安定的にたくさんリリースすることで事業の成⻑をもたらす • CI/CD基盤はそういう意味合いで⾮常に⼤切な基盤だと考えています • 難しいことをしているわけではないですが、たくさんのマネージドサービ スがある中で、あえて⾃前実装を選択しました 48 ⾃分たちで正解を探しながら 今後も運⽤していきます︕

Slide 49

Slide 49 text

END OF PRESENTATION ご清聴ありがとうございました