Share
Embed
NewEngineering 2024 - 繋がっていくサービスを支える開発環境作り
https://storesinc.tech/conf/2024
NewEngineering 2024 セッション資料です。
STORES では各サービスを繋げてもっと使いやすくする施策が多く進められています。 これにより各システムのエンジニアは複数のシステムを手元で動かす必要性が生じました。複数のサービスをいい感じに手元で連動するのは面倒くさい問題としてよく知られています。この発表では STORES ではこの課題に対してどのようなアプローチを取っているかを紹介します。
Shia
October 10, 2024
Transcript
46 slides
-
シム サンヨン@技術基盤グループ - インフラの運用サポート - 開発環境のサポート Shia@Internet - riseshia@x -
riseshia@github 自己紹介 2 -
サービスの裏側 - 一部紹介 5 API Gateway Event Repository STORES アカウント
組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
サービスの裏側 - 一部紹介 6 API Gateway Event Repository STORES アカウント
組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
サービスの裏側 - 一部紹介 7 API Gateway Event Repository STORES アカウント
組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
サービスの裏側 - 一部紹介 8 API Gateway Event Repository STORES アカウント
組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
サービスの裏側 - 一部紹介 9 API Gateway Event Repository STORES アカウント
組織管理 API API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
開発のためにこれらを全部動かすんですよみなさん 11 API Gateway Event Repository STORES アカウント 組織管理 API
API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります -
開発環境の特徴 - 機能を軸にチームが作られており、一つのチームが複数のサービスと リポジトリを触る機会が多い - STORES アカウントや組織管理 API みたいなサービスを動かさないと 他のサービスの開発ができない
- いくつかの会社が合併されてた経緯で STORES のインフラ環境・開発 言語がバラバラ - Google Cloud / Cloudflare Workers / AWS - Ruby / Go / JavaScript / Java - 開発サーバをコンテナ(docker compose)で動かすのが主流 12 -
- 開発環境がバラバラでセットアップを含め、複数のサービスを動かす のが大変 - 複数のサービスを手元で動かすためにはローカルホストに向いている 複数ドメインが必要 - 一部サービスの制約として localhost が使えない、もあった
- 手元の開発で TLS 証明書が必要でこの管理を楽にしたい - サービスごとに TLS 証明書作りたくない 繋がる予定ができた時からわかっていた課題 13 -
開発環境の動かし方のバリエーションが多すぎる 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 -
複数のサービスを複数のドメインに紐づける 16 - 社内向けのループバックドメインを用意 - e.g. local.example.com - このドメインで待ち受けする単一エンドポイントを用意し、サブドメ インやパスをみてリクエストを適切なサービスにルーティングする
- e.g. reserve.local.example.com -> STORES 予約の Rails - 単一エンドポイントなのでここで TLS 終端すれば証明書管理もここだ けすれば良いはず -
この単一エンドポイントと開発に必要なものをいろいろ提供する箱 - 各サービスは STORES-compose に自分の情報を登録する - 使いたいドメイン、接続先、リポジトリ名... - STORES-compose を起動する
- *.local.example.com で gateway が起動 - リクエストが来たら TLS 終端 - 適切なサービスへルーティング STORES-compose 17 -
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 -
課題:そのサービス起動してます? 22 reserve.local.example.com gateway 予約 Upstream timeout reserve.local.example.com gateway 予約
fallback handler 通信成功 通信失敗 ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - 予約に異常はある? ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - そのサービスに異常がある? -
今までのまとめ 23 netshop .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト
認証認可 STORES アカウント gateway ローカル -
before: - Nginx:upstream 追加、 server block 追加 - Envoy proxy:cluster、
service 追加 - fallback handler:リクエストとリポジトリの紐づけ情報の追加 after: - 単一ファイルに設定を追加 - config-generator が STORES-compose 起動中に設定を生成する 課題:STORES-compose へのサービス登録が大変です 25 -
今までのまとめ 26 config generator .local.example.com への全リクエスト fallback handler 設定注入 gateway
netshop 予約 STORES アカウント 正常リクエスト 失敗リクエスト 認証認可 ローカル -
課題:サービスA 開発にはサービスB が必要なんです 27 STORES アカウント ローカル gateway service-a.local .example.com
account.local .example.com netshop -
課題:サービス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 -
今までのまとめ 29 config generator ローカル netshop リモート .local.example.com への全リクエスト fallback
handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway STORES アカウント -
30 課題:API Gateway どうしよう(プロダクト開発編) 本番 ローカル api-gateway.prod .example.com netshop api-gateway.remote
.example.com netshop authorizer 認証認可 通常リクエスト リモート 組織管理 API authorizer STORES アカウント STORES アカウント 組織管理 API -
31 課題:API Gateway どうしよう(API Gateway 裏側編) 組織管理 API ローカル api-gateway.local
.example.com gateway netshop 本番 認証認可 組織管理 API api-gateway.prod .example.com netshop authorizer 通常リクエスト 認証認可は...? STORES アカウント -
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 -
今までのまとめ(API Gateway 裏側開発編) 33 config generator 組織管理 API api gateway
dummy authorizer ローカル netshop リモート .local.example.com への全リクエスト fallback handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway -
今までのまとめ(プロダクト開発編) 34 config generator ローカル netshop リモート .local.example.com への全リクエスト fallback
handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway 組織管理 API api gateway 組織管理 -
35 課題:Event Repository どうしよう ローカル 組織管理 API netshop 予約 リモート
予約 組織管理 API ローカル netshop リモート Event Repository イベント送信 イベント受信 購読 購読方法的に ちょっと無理 -
36 課題:Event Repository どうしよう 予約 ローカル 組織管理 API ローカル netshop
予約 netshop リモート リモート イベント送信 購読 イベント受信 イベント ブローカー Event Repository 組織管理 API -
今までのまとめ 37 config generator 組織管理 API api gateway dummy authorizer
ローカル netshop リモート .local.example.com への全リクエスト Fallback handler 予約 イベント ブローカー Event Repository 正常リクエスト 失敗リクエスト イベント送信 認証認可 設定注入 イベント受信 STORES アカウント gateway 組織管理 API 注:リモート環境の API Gateway を省略しています -
課題:サービス間ルーティング(コンテナ 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 -
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 コンテナ) -
課題:サービス間ルーティング(コンテナ 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} -
今までのまとめ (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 -
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 -
STORES-compose> make dev netshop> make dev 予約> make dev 終わり!!!
組織管理 API> リモートに存在してるので繋ぎに行くだけ STORES アカウント> リモートに存在してるので繋ぎに行くだけ Event Repository> STORES-compose がなんとかしてくれる API Gateway > STORES-compose がなんとかしてくれる 予約とネットショップの連携機能を開発したい (now!) 43 -
- 今後もマシンパワーは足りるんだろうか - 実は開発サーバ、コンテナじゃなくてホストのほうが良かったりしま せんか? - もしくは世の中の流れに合わせて dev container を活用するとか
- リブートのたびに STORES-compose そのものを起動したくない、た まに更新しなきゃいけない、サービスを一気に起動したい、 etc… まだ課題はいろいろ 44