Slide 1

Slide 1 text

繋がっていくサービスを支える 開発環境作り shia@STORES

Slide 2

Slide 2 text

シム サンヨン@技術基盤グループ - インフラの運用サポート - 開発環境のサポート Shia@Internet - riseshia@x - riseshia@github 自己紹介 2

Slide 3

Slide 3 text

プロダクトの全体像 - 大きいプロダクトが5つ - 複数利用したらシナジーが出せる機能が増えている 3

Slide 4

Slide 4 text

プロダクトの全体像 - 大きいプロダクトが5つ - 複数利用したらシナジーが出せる機能が増えている 4

Slide 5

Slide 5 text

サービスの裏側 - 一部紹介 5 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 6

Slide 6 text

サービスの裏側 - 一部紹介 6 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 7

Slide 7 text

サービスの裏側 - 一部紹介 7 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 8

Slide 8 text

サービスの裏側 - 一部紹介 8 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 9

Slide 9 text

サービスの裏側 - 一部紹介 9 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 10

Slide 10 text

- STORES 株式会社は複数のプロダクトを提供しており、それらが 徐々に繋がり始めています - 連携機能の開発には複数のサービスを手元で動かす必要があり、大 変です - 100人以上のエンジニアの開発を支えている開発環境をどう作って きてきたかの事例を、実際あった課題を交えて紹介します このセッションは 10

Slide 11

Slide 11 text

開発のためにこれらを全部動かすんですよみなさん 11 API Gateway Event Repository STORES アカウント 組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります

Slide 12

Slide 12 text

開発環境の特徴 - 機能を軸にチームが作られており、一つのチームが複数のサービスと リポジトリを触る機会が多い - STORES アカウントや組織管理 API みたいなサービスを動かさないと 他のサービスの開発ができない - いくつかの会社が合併されてた経緯で STORES のインフラ環境・開発 言語がバラバラ - Google Cloud / Cloudflare Workers / AWS
 - Ruby / Go / JavaScript / Java
 - 開発サーバをコンテナ(docker compose)で動かすのが主流 12

Slide 13

Slide 13 text

- 開発環境がバラバラでセットアップを含め、複数のサービスを動かす のが大変 - 複数のサービスを手元で動かすためにはローカルホストに向いている 複数ドメインが必要 - 一部サービスの制約として localhost が使えない、もあった - 手元の開発で TLS 証明書が必要でこの管理を楽にしたい - サービスごとに TLS 証明書作りたくない 繋がる予定ができた時からわかっていた課題 13

Slide 14

Slide 14 text

とりあえずこれらを何とかする! 繋がる予定ができた時からわかっていた課題 14

Slide 15

Slide 15 text

開発環境の動かし方のバリエーションが多すぎる 15 対策:開発環境の定番作業のインターフェースを決める。みんなの手元に 入っている make を採用 開発環境セットアップ - サービスA: bin/setup - サービスB: setup.sh - サービスC: docker compose build 開発サーバ起動 - サービスA: bundle exec rails server - サービスB: yarn run dev - サービスC: docker compose up make setup make dev

Slide 16

Slide 16 text

複数のサービスを複数のドメインに紐づける 16 - 社内向けのループバックドメインを用意 - e.g. local.example.com - このドメインで待ち受けする単一エンドポイントを用意し、サブドメ インやパスをみてリクエストを適切なサービスにルーティングする - e.g. reserve.local.example.com -> STORES 予約の Rails - 単一エンドポイントなのでここで TLS 終端すれば証明書管理もここだ けすれば良いはず

Slide 17

Slide 17 text

この単一エンドポイントと開発に必要なものをいろいろ提供する箱 - 各サービスは STORES-compose に自分の情報を登録する - 使いたいドメイン、接続先、リポジトリ名... - STORES-compose を起動する - *.local.example.com で gateway が起動 - リクエストが来たら TLS 終端 - 適切なサービスへルーティング STORES-compose 17

Slide 18

Slide 18 text

STORES-compose 18 service-a.local.example.com:443 localhost:9292 service-c.lvh.me:443 service-a.local.example.com:4 43 service-b.local.example.com:4 43 service-c.local.example.com:4 43 gateway サービスA サービスB サービスC サービスA サービスB サービスC HTTPS HTTP

Slide 19

Slide 19 text

できた? 複数のサービスをいい感じに起動できるようになったし、できた? 19

Slide 20

Slide 20 text

複数のサービスをいい感じに起動できるようになったし、できた? 20 いいえ

Slide 21

Slide 21 text

課題:そのサービス起動してます? 21 reserve.local.example.com gateway 予約 知りたいこと: - どのサービスへリクエストしてる? - 予約は起動してる? - 予約に異常がある? ローカル

Slide 22

Slide 22 text

課題:そのサービス起動してます? 22 reserve.local.example.com gateway 予約 Upstream timeout reserve.local.example.com gateway 予約 fallback handler 通信成功 通信失敗 ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - 予約に異常はある? ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - そのサービスに異常がある?

Slide 23

Slide 23 text

今までのまとめ 23 netshop .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト 認証認可 STORES アカウント gateway ローカル

Slide 24

Slide 24 text

背景:構成要素が多く、新規サービスの追加時に設定を書き間違えるとデ バッグが大変 対策:抽象化された設定を用意し、起動時に適切な設定を生成するように 課題:STORES-compose へのサービス登録が大変です 24

Slide 25

Slide 25 text

before: - Nginx:upstream 追加、 server block 追加 - Envoy proxy:cluster、 service 追加 - fallback handler:リクエストとリポジトリの紐づけ情報の追加 after: - 単一ファイルに設定を追加 - config-generator が STORES-compose 起動中に設定を生成する 課題:STORES-compose へのサービス登録が大変です 25

Slide 26

Slide 26 text

今までのまとめ 26 config generator .local.example.com への全リクエスト fallback handler 設定注入 gateway netshop 予約 STORES アカウント 正常リクエスト 失敗リクエスト 認証認可 ローカル

Slide 27

Slide 27 text

課題:サービスA 開発にはサービスB が必要なんです 27 STORES アカウント ローカル gateway service-a.local .example.com account.local .example.com netshop

Slide 28

Slide 28 text

課題:サービスA 開発にはサービスB が必要なんです 28 STORES アカウント STORES アカウント ローカル リモート gateway netshop gateway STORES アカウント STORES アカウント service-a.local .example.com account.local .example.com service-a.local .example.com account.remote .example.com リモート ローカル netshop

Slide 29

Slide 29 text

今までのまとめ 29 config generator ローカル netshop リモート .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway STORES アカウント

Slide 30

Slide 30 text

30 課題:API Gateway どうしよう(プロダクト開発編) 本番 ローカル api-gateway.prod .example.com netshop api-gateway.remote .example.com netshop authorizer 認証認可 通常リクエスト リモート 組織管理 API authorizer STORES アカウント STORES アカウント 組織管理 API

Slide 31

Slide 31 text

31 課題:API Gateway どうしよう(API Gateway 裏側編) 組織管理 API ローカル api-gateway.local .example.com gateway netshop 本番 認証認可 組織管理 API api-gateway.prod .example.com netshop authorizer 通常リクエスト 認証認可は...? STORES アカウント

Slide 32

Slide 32 text

32 課題:API Gateway どうしよう(API Gateway 裏側編) 本番 ローカル api-gateway.local .example.com gateway netshop api-gateway.prod .example.com netshop dummy authorizer 認証認可 通常リクエスト authorizer STORES アカウント リモート STORES アカウント 組織管理 API 組織管理 API

Slide 33

Slide 33 text

今までのまとめ(API Gateway 裏側開発編) 33 config generator 組織管理 API api gateway dummy authorizer ローカル netshop リモート .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway

Slide 34

Slide 34 text

今までのまとめ(プロダクト開発編) 34 config generator ローカル netshop リモート .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway 組織管理 API api gateway 組織管理

Slide 35

Slide 35 text

35 課題:Event Repository どうしよう ローカル 組織管理 API netshop 予約 リモート 予約 組織管理 API ローカル netshop リモート Event Repository イベント送信 イベント受信 購読 購読方法的に ちょっと無理

Slide 36

Slide 36 text

36 課題:Event Repository どうしよう 予約 ローカル 組織管理 API ローカル netshop 予約 netshop リモート リモート イベント送信 購読 イベント受信 イベント ブローカー Event Repository 組織管理 API

Slide 37

Slide 37 text

今までのまとめ 37 config generator 組織管理 API api gateway dummy authorizer ローカル netshop リモート .local.example.com への全リクエスト Fallback handler 予約 イベント ブローカー Event Repository 正常リクエスト 失敗リクエスト イベント送信 認証認可 設定注入 イベント受信 STORES アカウント gateway 組織管理 API 注:リモート環境の API Gateway を省略しています

Slide 38

Slide 38 text

課題:サービス間ルーティング(コンテナ to コンテナ) 38 パターン1: reserve.local.example.com へリクエスト投げたい 予約 gateway レジ ホスト ネットワークA ネットワークA reserve.local.example.com -> 127.0.0.1 予約 gateway レジ ホスト ネットワークA ネットワークA reserve.local.example.com -> 127.0.0.1 extra_hosts: - reserve.local.example.com:host-gateway

Slide 39

Slide 39 text

39 パターン2: *.netshop.local.example.com へリクエスト投げたい netshop gateway *.netshop.local.example.com -> 127.0.0.1 extra_hosts: - *.netshop.local.example.com:host-gateway ??? サービスA ホスト ネットワークA ネットワークA *.netshop.local.example.com -> 127.0.0.1 netshop gateway サービスA ホスト ネットワークA ネットワークA ? 課題:サービス間ルーティング(コンテナ to コンテナ)

Slide 40

Slide 40 text

課題:サービス間ルーティング(コンテナ to コンテナ) 40 パターン2: *.netshop.local.example.com へリクエスト投げたい netshop gateway サービスA ホスト ネットワークA ネットワークA *.netshop.local.example.com -> 127.0.0.1 netshop gateway サービスA ホスト ネットワークA *.netshop.local.example.com -> 127.0.0.1 custom DNS server: /.local.example.com/{gateway ip}

Slide 41

Slide 41 text

今までのまとめ (now!) 41 config generator api gateway dummy authorizer ローカル netshop custom DNS server リモート .local.example.com への全リクエスト イベント ブローカー Event Repository fallback handler 予約 正常リクエスト 失敗リクエスト イベント送信 認証認可 設定注入 DNS 解決 組織管理 API イベント受信 STORES アカウント gateway 注:リモート環境の API Gateway を省略しています 組織管理 API

Slide 42

Slide 42 text

netshop> setup-certificate.sh && docker compose up && bin/setup && bundle exec rails server 予約> setup-certificate.sh && docker compose up --build 組織管理 API> setup-certificate.sh && docker compose up --build STORES アカウント> setup-certificate.sh && docker compose up --build イベントのやり取りはスクリプトか curl で API Gateway は直接つなげて、認証認可は組織管理 API 側でなんとかする 予約とネットショップの連携機能を開発したい (before のイメージ) 42

Slide 43

Slide 43 text

STORES-compose> make dev netshop> make dev 予約> make dev 終わり!!! 組織管理 API> リモートに存在してるので繋ぎに行くだけ STORES アカウント> リモートに存在してるので繋ぎに行くだけ Event Repository> STORES-compose がなんとかしてくれる API Gateway > STORES-compose がなんとかしてくれる 予約とネットショップの連携機能を開発したい (now!) 43

Slide 44

Slide 44 text

- 今後もマシンパワーは足りるんだろうか - 実は開発サーバ、コンテナじゃなくてホストのほうが良かったりしま せんか? - もしくは世の中の流れに合わせて dev container を活用するとか - リブートのたびに STORES-compose そのものを起動したくない、た まに更新しなきゃいけない、サービスを一気に起動したい、 etc… まだ課題はいろいろ 44

Slide 45

Slide 45 text

複数のサービスが必要な開発環境をいい感じにするため、利用方法を揃え たり、それらのリクエストを受け取って適切にルーティングしてくれるシ ステムの導入したり、そのシステムにどういう要素を追加してきたかの紹 介をしました まとめ 45

Slide 46

Slide 46 text

〜終〜 46 いろいろ省略してますので技術詳細などが気になる、もっと良くできる!というアイデ アがある方はぜひお話しましょう Ask the speaker / 懇親会でお待ちしております ご清聴ありがとうございました