Slide 1

Slide 1 text

WEARフロントエンドにおける
 Pull Request毎のPreview環境導入とその効果
 株式会社ZOZO
 ブランドソリューション開発本部
 WEARバックエンド部 SREブロック
 山岡 朋樹 Copyright © ZOZO, Inc. ZOZO Kubernetes Night


Slide 2

Slide 2 text

© ZOZO, Inc. 2 自己紹介


Slide 3

Slide 3 text

© ZOZO, Inc. 株式会社ZOZO
 ブランドソリューション開発本部 WEARバックエンド部
 SREブロック
 山岡 朋樹
 ● 2023年4月 新卒入社
 ● WEARやFAANSのクラウド運用、リプレイスに従事
 ● Developer Experience向上が好き
 3

Slide 4

Slide 4 text

© ZOZO, Inc. ● WEAR Webにおける現状と課題 ● WEAR Webチームにヒアリング ● Pull Request毎のPreview環境について考える ● 技術選定 ● Pull Request毎のPreview環境の仕組み ● 導入後の効果 目次
 4

Slide 5

Slide 5 text

© ZOZO, Inc. 5 WEAR Webにおける現状と課題

Slide 6

Slide 6 text

© ZOZO, Inc. WEAR Webにおける現状と課題
 現状
 ● 約10年間の技術負債を解消するべく、レガシー技術脱却のた めインフラとアプリケーションのリプレイス中
 
 ● インフラはオンプレミスからAWSクラウドへ
 
 ● アプリケーションはFastlyを使用してパスベースルーティングで VBScript + jQueryの構成からRuby on Rails + Next.jsへ
 Fastlyのパスベースルーティングで実現する WEARのゆるやかなクラウド移行 : https://techblog.zozo.com/entry/cloud-migration-of-wear-with-fastly WEAR Webフロントエンドリプレイスのアーキテクチャ選定と Next.jsへの移行: https://techblog.zozo.com/entry/wear-web-frontend-replace-with-next-js 6

Slide 7

Slide 7 text

© ZOZO, Inc. WEAR Webにおける現状と課題
 課題
 ● レガシー技術が残っているためエンジニア採用や仕様のキャッ チアップが難しい
 
 ● 古いシステムはCI/CDの環境が整備されておらず非効率な部 分がある
 7

Slide 8

Slide 8 text

© ZOZO, Inc. WEAR Webにおける現状と課題
 リプレイスの進行を妨げる要因となっていることはない か?SREが何か協力できないか?
 課題
 ● レガシー技術が残っているためエンジニア採用や仕様のキャッ チアップが難しい
 
 ● 古いシステムはCI/CDの環境が整備されておらず非効率な部 分がある
 8

Slide 9

Slide 9 text

© ZOZO, Inc. 9 WEAR Webチームにヒアリング

Slide 10

Slide 10 text

© ZOZO, Inc. WEAR Webチームにヒアリング
 ヒアリング結果
 ● Storybookをデザイナーも確認できるようにしたい
 
 ● Fastlyでカナリアリリースできるようにしたい
 
 ● オンプレミスのみ確認できる環境が欲しい
 
 ● Pull Request毎のPreview環境が欲しい
 10

Slide 11

Slide 11 text

© ZOZO, Inc. WEAR Webチームにヒアリング
 UIレビューの負担を軽減する
 独立したQA環境として活用できるため他の案件に干渉しない etc.
 ヒアリング結果
 ● Storybookをデザイナーも確認できるようにしたい
 
 ● Fastlyでカナリアリリースできるようにしたい
 
 ● オンプレミスのみ確認できる環境が欲しい
 
 ● Pull Request毎のPreview環境が欲しい
 11

Slide 12

Slide 12 text

© ZOZO, Inc. 12 よし、Preview環境を作ろう!

Slide 13

Slide 13 text

© ZOZO, Inc. 13 Pull Request毎のPreview環境について考える

Slide 14

Slide 14 text

© ZOZO, Inc. KubernetesにおけるPull Request毎のPreview環境について考える ● 私たちのチームではコンピューティングサービスにEKSを使用 している
 
 ● どうやってKubernetes上でPull Request毎のPreview環境を実 現するか
 
            
 
 GitHubのPull Requestの検知をして、それ毎に「ServiceとPod」の セットを用意する?
 
 どうやって外部からPull Request用Podへアクセス可能にするの か?
 14

Slide 15

Slide 15 text

© ZOZO, Inc. Pull Request毎のPreview環境提供フローについて考える ● Pull Requestが作成されたら、Docker Imageのビルド、デプロイおよびルーティングを設定する
 
 ● Pull Request毎のPreview環境へアクセス可能なURLが発行される
 
 ● 各Preview環境へセキュアかつ容易にアクセスできる
 15

Slide 16

Slide 16 text

© ZOZO, Inc. 16 Pull Request毎のPreview環境について考える (まとめ) ● Pull Requestが作成されたら、Docker ImageのBuild
 
 ● Pull Requestが作成されたら、Kubernetesリソースのデプロイ
 ○ デプロイ方式はPush or Pull型どちらでも良く、Pull Requestをもとに
 Kubernetesリソースが作成できれば良い
 
 ● Pull Request毎のPreview環境へアクセス可能なURLが発行される
 ○ pr100.preview.wear.jpのような形式のイメージ
 
 ● 各Preview環境へセキュアかつ容易にアクセスできる
 ○ 特定の人しかアクセスできない
 ■ IP制限、Basic認証、SSO etc.


Slide 17

Slide 17 text

© ZOZO, Inc. 17 技術選定

Slide 18

Slide 18 text

© ZOZO, Inc. 18 Pull Requestが作成されたら、Docker Imageのビルドを行う
 ● GitHub Actions
 ○ 私たちのチームで皆が最も使い慣れているCI/CDプラットフォーム
 ○ Docker ImageのBuildなら、GitHub Actions一択


Slide 19

Slide 19 text

© ZOZO, Inc. 19 Pull Requestが作成されたら、Kubernetesリソースのデプロイを行う
 ● Argo CD Pull Request Generator
 ○ 主にGitHub APIを使用してリポジトリ内のOpenなPull Requestを検知し、任意のKubernetesリソース をArgo CD Applicationとして作成
 ○ 検知するPull Requestを特定のLabelに限定できる
 ○ 「ApplicationSet」というCustom Resourceを扱う
 ○ KustomizeやHelmを使うことで、生成するArgo CD Applicationのパラメータのオーバーライドが可能 (imageなど)
 Argo CD Pull Request Generator公式ドキュメント: https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Pull-Request

Slide 20

Slide 20 text

© ZOZO, Inc. 20 Pull Request毎のPreview環境へアクセス可能なURLが発行される
 ● Istio VirtualServiceのホストアドレスルーティング
 
 ● ワイルドカードドメイン
 ○ pr100.preview.wear.jpにアクセスするとpr100のPodに接続できる
 ○ ワイルドカードドメインとし、任意のサブドメインでアクセスした場合、Istioを介してホストヘッダーを 判別し、特定のPodへアクセスできる


Slide 21

Slide 21 text

© ZOZO, Inc. 21 各Preview環境へセキュアかつ容易にアクセスできる
 ● IP制限
 ○ CloudFront FunctionsでIP制限
 ○ 弊社の開発ガイドラインでは、IP制限によるアクセス制御で問題ない
 ○ Basic認証はサブドメインが変わるごとにid/pass認証が必要
 ○ SSOは外部の認可サーバーにリダイレクトURLを都度変更が必要


Slide 22

Slide 22 text

© ZOZO, Inc. 22 Pull Request毎のPreview環境の仕組み

Slide 23

Slide 23 text

© ZOZO, Inc. 23 Pull Request毎のPreview環境の仕組み
 〜 開発者視点 〜


Slide 24

Slide 24 text

© ZOZO, Inc. 24 Pull Request毎のPreview環境のアーキテクチャ Helm icon from: https://helm.sh

Slide 25

Slide 25 text

© ZOZO, Inc. 25 Pull Request作成によるDocker ImageのBuild 任意のPull RequestのみPreview環境を構築する
 ● 「preview」というLabelが貼られている時のみworkflowを実行する
 
 Preview環境は常に新しい状態を保ち続けなければならない
 ● 「preview」というLabelが貼られているPull Requestのソースブランチに対してPushなどを行った場合に workflowを実行する


Slide 26

Slide 26 text

© ZOZO, Inc. 26 動的に生成するK8sリソースのHelm Template化 ● VirtualService, Service, Deploymentなど、Pull Request毎に必要なKubernetesリソースに関し てはHelm Template化
 
 ● {{ .Values.name }}と設定しておくことで動的にパ ラメータを適用できる
 
 Argo CD Pull Request Generatorが values.yamlの値をオーバーライドして適用する
 Helm テンプレート: https://helm.sh/ja/docs/chart_best_practices/templates Istio VirtualServiceドキュメント: https://istio.io/latest/docs/reference/config/networking/virtual-service

Slide 27

Slide 27 text

© ZOZO, Inc. 27 Argo CD Pull Request GeneratorによるPull Requestの検知 ● requeueAfterSecondsでGitHub APIを使って Pull Requestを取得するポーリング間隔を設定
 
 ● 「preview」というLabelが貼られたPull Request のみ抽出
 
 ● Helm Templateが存在するGitHubリポジトリと そのパスを指定
 
 条件に合ったPull Requestがあれば、Argo CD Pull Request GeneratorがArgo CD Application としてKubernetesリソースをPull Request毎に 生成!
 


Slide 28

Slide 28 text

© ZOZO, Inc. 28 Pull Request毎のPreview環境の仕組み
 〜 ユーザー視点 〜


Slide 29

Slide 29 text

© ZOZO, Inc. Pull Request毎のPreview環境のアーキテクチャ S3 29

Slide 30

Slide 30 text

© ZOZO, Inc. 30 導入後の効果

Slide 31

Slide 31 text

© ZOZO, Inc. 導入後の効果 WEAR Webチームの生の声
 31

Slide 32

Slide 32 text

© ZOZO, Inc. 32 結論

Slide 33

Slide 33 text

© ZOZO, Inc. 33 Developer Experience向上は皆を幸せにする

Slide 34

Slide 34 text

© ZOZO, Inc. 34 ご清聴ありがとうございました!

Slide 35

Slide 35 text

No content