Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NewEngineering 2024 - 繋がっていくサービスを支える開発環境作り

Shia
October 10, 2024
10

NewEngineering 2024 - 繋がっていくサービスを支える開発環境作り

https://storesinc.tech/conf/2024

NewEngineering 2024 セッション資料です。

STORES では各サービスを繋げてもっと使いやすくする施策が多く進められています。 これにより各システムのエンジニアは複数のシステムを手元で動かす必要性が生じました。複数のサービスをいい感じに手元で連動するのは面倒くさい問題としてよく知られています。この発表では STORES ではこの課題に対してどのようなアプローチを取っているかを紹介します。

Shia

October 10, 2024
Tweet

Transcript

  1. サービスの裏側 - 一部紹介 5 API Gateway Event Repository STORES アカウント

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

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

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

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

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

    API やり取り 非同期イベントやり取り 認証・認可やり取り 詳細は「STORESのプロダクト一覧とシステム構成」というポスターにあります
  7. 開発環境の特徴 - 機能を軸にチームが作られており、一つのチームが複数のサービスと リポジトリを触る機会が多い - STORES アカウントや組織管理 API みたいなサービスを動かさないと 他のサービスの開発ができない

    - いくつかの会社が合併されてた経緯で STORES のインフラ環境・開発 言語がバラバラ - Google Cloud / Cloudflare Workers / AWS
 - Ruby / Go / JavaScript / Java
 - 開発サーバをコンテナ(docker compose)で動かすのが主流 12
  8. 開発環境の動かし方のバリエーションが多すぎる 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
  9. 課題:そのサービス起動してます? 22 reserve.local.example.com gateway 予約 Upstream timeout reserve.local.example.com gateway 予約

    fallback handler 通信成功 通信失敗 ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - 予約に異常はある? ローカル - どのサービスにリクエストしてる? - 予約は起動してる? - そのサービスに異常がある?
  10. before: - Nginx:upstream 追加、 server block 追加 - Envoy proxy:cluster、

    service 追加 - fallback handler:リクエストとリポジトリの紐づけ情報の追加 after: - 単一ファイルに設定を追加 - config-generator が STORES-compose 起動中に設定を生成する 課題:STORES-compose へのサービス登録が大変です 25
  11. 今までのまとめ 26 config generator .local.example.com への全リクエスト fallback handler 設定注入 gateway

    netshop 予約 STORES アカウント 正常リクエスト 失敗リクエスト 認証認可 ローカル
  12. 課題:サービス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
  13. 今までのまとめ 29 config generator ローカル netshop リモート .local.example.com への全リクエスト fallback

    handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway STORES アカウント
  14. 30 課題:API Gateway どうしよう(プロダクト開発編) 本番 ローカル api-gateway.prod .example.com netshop api-gateway.remote

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

    .example.com gateway netshop 本番 認証認可 組織管理 API api-gateway.prod .example.com netshop authorizer 通常リクエスト 認証認可は...? STORES アカウント
  16. 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
  17. 今までのまとめ(API Gateway 裏側開発編) 33 config generator 組織管理 API api gateway

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

    handler 予約 正常リクエスト 失敗リクエスト 認証認可 設定注入 STORES アカウント gateway 組織管理 API api gateway 組織管理
  19. 35 課題:Event Repository どうしよう ローカル 組織管理 API netshop 予約 リモート

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

    予約 netshop リモート リモート イベント送信 購読 イベント受信 イベント ブローカー Event Repository 組織管理 API
  21. 今までのまとめ 37 config generator 組織管理 API api gateway dummy authorizer

    ローカル netshop リモート .local.example.com への全リクエスト Fallback handler 予約 イベント ブローカー Event Repository 正常リクエスト 失敗リクエスト イベント送信 認証認可 設定注入 イベント受信 STORES アカウント gateway 組織管理 API 注:リモート環境の API Gateway を省略しています
  22. 課題:サービス間ルーティング(コンテナ 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
  23. 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 コンテナ)
  24. 課題:サービス間ルーティング(コンテナ 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}
  25. 今までのまとめ (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
  26. 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
  27. STORES-compose> make dev netshop> make dev 予約> make dev 終わり!!!

    組織管理 API> リモートに存在してるので繋ぎに行くだけ STORES アカウント> リモートに存在してるので繋ぎに行くだけ Event Repository> STORES-compose がなんとかしてくれる API Gateway > STORES-compose がなんとかしてくれる 予約とネットショップの連携機能を開発したい (now!) 43
  28. - 今後もマシンパワーは足りるんだろうか - 実は開発サーバ、コンテナじゃなくてホストのほうが良かったりしま せんか? - もしくは世の中の流れに合わせて dev container を活用するとか

    - リブートのたびに STORES-compose そのものを起動したくない、た まに更新しなきゃいけない、サービスを一気に起動したい、 etc… まだ課題はいろいろ 44