Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
API Gatewayによるマイクロサービスへのアクセス制御
Search
takenakaJ
November 05, 2020
Technology
4.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
API Gatewayによるマイクロサービスへのアクセス制御
takenakaJ
November 05, 2020
More Decks by takenakaJ
See All by takenakaJ
ZOZOTOWN のクラウドインフラ構築技術とその運用手法
takenakaj
0
1.1k
Other Decks in Technology
See All in Technology
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
1.5k
探して_入れて_作って_使う_Agent_Skills___LT.pdf
peintangos
2
160
Building applications in the Gemini API family.
line_developers_tw
PRO
0
1.5k
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
480
Claude code Orchestra
ozakiomumkj
3
960
もりもり新機能を一挙紹介! AgentCoreに入門して、AWS上にAIエージェントを構築しよう
minorun365
PRO
6
800
React、まだ楽しくて草
uhyo
7
4.1k
ブロックチェーン / Blockchain
ks91
PRO
0
110
Dynamic Workersについて
yusukebe
2
590
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.5k
GoとSIMDとWasmの今。
askua
3
510
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
4
1.1k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Chasing Engaging Ingredients in Design
codingconduct
0
210
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
250
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Documentation Writing (for coders)
carmenintech
77
5.4k
Raft: Consensus for Rubyists
vanstee
141
7.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Transcript
API Gatewayによる マイクロサービスへのアクセス 制御 株式会社ZOZOテクノロジーズ 技術開発本部 ECプラットフォーム部 API基盤チーム エンジニア 竹中達志
Copyright © ZOZO Technologies, Inc.
© ZOZO Technologies, Inc. 竹中 達志(たけなか たつじ) 2 2017年7月に株式会社スタートトゥデイ工務店(現 株式会
社ZOZOテクノロジーズ)に中途入社 2018年10月よりZOZOTOWNのリプレイスプロジェクトに従 事。クラウドインフラの構築・運用を経て、現在はマイクロ サービス基盤のバックエンドを中心に開発。 趣味はギターとバンドとゲーム。
© ZOZO Technologies, Inc. アジェンダ • API Gatewayとは何か? • API
Gatewayの機能と変遷 • 実装に関する話 3
© ZOZO Technologies, Inc. API Gatewayとは?
© ZOZO Technologies, Inc. IIS (Web) RO iOS Android ブラウザ
PC/SP リプレイス開始前: 〜2017年 ストアド ストアド ストアド 5 IIS (API) ロジックがDBに載ってい る(ストアド) 成功 • データの近くで処理を行うため高速(特に 2005年 当時はネットワークが細い ) • ロジックをDBに載せることでDRYにできる 課題 • ストアドプロシージャ(ストアド)をスケールさせづら い • ストアドのテストが書きづらい • レガシー VBScript • Windows Server の構築自動化が難しい • 現実問題、ASPレイヤーで2重管理になっている ロジックは存在する
© ZOZO Technologies, Inc. Java API Read Only SQL ストアドをは
がしてAPIに 移設 第1フェーズ: 2017年〜2020年 参照系ロジックのストアド剥がし 6 IIS (Web) RO iOS Android ブラウザ PC/SP ストアド ストアド ストアド Read Only IIS (API) DBレプリ 課題 • ASPレイヤーのロジックがそのまま • 更新系のリプレイスが未計画 • オンプレIISが入り口のままであるためオン プレを卒業できない設計 Read Only 成功 • ストアドロジックが減った • クラウドに移設したことでスケーラビリティ を手にいれた (ECサイトは参照リクエスト が圧倒的に多い) ZOZO DC クラウド
© ZOZO Technologies, Inc. 新フレームワーク ロジック (Web表示のみ) 商品 サービス RO
お気に入り サービス RW メンバー サービス RW ネイティブアプリはAPI 直呼び出し ブラウザ PC/SP iOS Android WebのUIに 新技術が使える ようになる それぞれのAPIが 独立したサービスに = マイクロサービス化 API Gateway ID認証 サービス RW 7 第2フェーズ: 目指す姿
© ZOZO Technologies, Inc. 新フレームワーク ロジック (Web表示のみ) 商品 サービス RO
お気に入り サービス RW メンバー サービス RW ブラウザ PC/SP iOS Android API Gateway ID認証 サービス RW 8 第2フェーズ: 目指す姿
© ZOZO Technologies, Inc. API Gateway • マイクロサービスの API の出入り口として機能するアプリケーション
9 新フレームワーク ロジック (Web表示のみ) ユーザー サービス RO お気に入り サービス RW 商品 サービス RW API Gateway ID認証 サービス RW これ
© ZOZO Technologies, Inc. API Gatewayのメリット • 各マイクロサービスに求められる共通機能を集約できる ◦
ルーティング ◦ SSL終端 ◦ 認証、認可 ◦ リトライ、タイムアウト設定 ◦ ロギング、トレース ◦ etc.
© ZOZO Technologies, Inc. API Gatewayの必要性 • 共通で必要となる処理を集約することで、マイクロサービス化を加速させたい ◦
加重ルーティングを利用した各マイクロサービスのカナリーリリース ◦ クライアント認証処理 ◦ リトライ、タイムアウトによるリクエスト制御 • マイクロサービスへのリクエストのエンドポイントを一元化 する ◦ 各マイクロサービスへの動的なルーティングを可能にする 段階的なサービス移行が可能
© ZOZO Technologies, Inc. iOS Android IIS (API) iOS Android
IIS (API) 商品 サービス API Gateway 段階的なサービス切り替え 1 2 /old-api/search /gateway/search /old-api/search 商品サービスへのリプレイスを考える
© ZOZO Technologies, Inc. iOS Android IIS (API) 商品 サービス
API Gateway iOS Android IIS (API) 商品 サービス API Gateway 段階的なサービス切り替え 3 4 /gateway/search /gateway/search /old-api/search 80% /search-api/search 20% /search-api/search 商品サービスへのリプレイスを考える
© ZOZO Technologies, Inc. API Gateway ID認証 サービス RW 14
IIS (Web) RO ブラウザ PC/SP ストアド ストアド ストアド IIS (API) ZOZO DC API Gatewayを通したマイクロサービスの追加 iOS Android 切り替え 切り替え クラウド 共通処理やルーティングを API Gateway に集約できる
© ZOZO Technologies, Inc. 商品 サービス RO API Gateway ID認証
サービス RW 15 IIS (Web) RO ブラウザ PC/SP ストアド ストアド IIS (API) ZOZO DC iOS Android 切り替え 切り替え クラウド API Gatewayを通したマイクロサービスの追加 共通処理やルーティングを API Gateway に集約できる
© ZOZO Technologies, Inc. 商品 サービス RO お気に入り サービス RW
API Gateway ID認証 サービス RW 16 IIS (Web) ブラウザ PC/SP ストアド IIS (API) ZOZO DC iOS Android 切り替え 切り替え クラウド API Gatewayを通したマイクロサービスの追加 共通処理やルーティングを API Gateway に集約できる
© ZOZO Technologies, Inc. 商品 サービス RO お気に入り サービス RW
メンバー サービス RW API Gateway ID認証 サービス RW 17 IIS (Web) ブラウザ PC/SP IIS (API) ZOZO DC iOS Android クラウド API Gatewayを通したマイクロサービスの追加 共通処理やルーティングを API Gateway に集約できる
© ZOZO Technologies, Inc. API Gatewayは自前で実装 • AWS にはマネージドサービスの API
Gateway がある • 複雑な要求に柔軟に対応するため に自前実装 ◦ エンドポイントを複数もつサービス (マルチクラスタ)に対し、 エラーやタイムアウト時に別エンドポイントへのリトライなど • AWS/EKS上に構築 • Goで実装 ◦ リバースプロキシとしての役割なので、応答時間の増加はできるだけ抑えたい ◦ 軽量(スケーラビリティ)
© ZOZO Technologies, Inc. API Gatewayの機能と変遷
© ZOZO Technologies, Inc. API Gatewayの変遷 • マイクロサービス化準備 ◦ 内部APIのAPI
Gateway経由化 ◦ 加重ルーティング、リトライ機能、IP制限 • 共通機能の実装 ◦ ID認証サービスとの連動、分散トレーシング • 追加機能 ◦ パートナー向けにAPI公開 ◦ ルーティング、クライアント認証
© ZOZO Technologies, Inc. API Gatewayの変遷 • マイクロサービス化準備 ◦ 内部APIのAPI
Gateway経由化 ◦ 加重ルーティング、リトライ機能、IP制限 • 共通機能の実装 ◦ ID認証サービスとの連動、分散トレーシング • 追加機能 ◦ パートナー向けにAPI公開 ◦ ルーティング、クライアント認証
© ZOZO Technologies, Inc. 内部APIのAPI Gateway化 内部からの商品情報API利用をAPI Gateway経由化する 商品
サービス RO IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway
© ZOZO Technologies, Inc. 内部APIのAPI Gateway化 • リトライ ◦ 別系統への即時リトライ。元々商品サービス呼び出し元サーバーサイド(IIS)に実装さ
れていた機能をAPI Gatewayに実装。 リトライ先、リトライ条件(ステータスコード等)を指定 • 加重ルーティング ◦ ルーティング先の複数のホストに対しラウンドロビンでリクエストする • IP制限 ◦ 特定のIPレンジからのアクセスのみ許可
© ZOZO Technologies, Inc. リトライ仕様 商品 サービス RO IIS (Web)
商品 サービス RO 商品 サービス RO A B C ① 商品サービスの複数hostに対するリトライ
© ZOZO Technologies, Inc. リトライ仕様 商品 サービス RO IIS (Web)
商品 サービス RO 商品 サービス RO A B C ②HTTP 5xx or timeout N sec ① リトライ条件を指定できる
© ZOZO Technologies, Inc. リトライ仕様 商品 サービス RO IIS (Web)
商品 サービス RO 商品 サービス RO A B C ① ③ リトライ先は選択できる ②HTTP 5xx or timeout N sec
© ZOZO Technologies, Inc. リトライ仕様 商品 サービス RO IIS (Web)
商品 サービス RO 商品 サービス RO A B C ① ③ リトライ先は選択できる ②HTTP 5xx or timeout N sec
© ZOZO Technologies, Inc. 加重ルーティング IIS (Web) 商品 サービス RO
A B 商品 サービス RO 商品 サービス RO C 70% 20% 10% 10回のリクエストで、AAAAAABABC となる
© ZOZO Technologies, Inc. 内部APIのAPI Gateway化 特定のIPレンジからのリクエストのみ許可 商品 サービス
RO IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway 商品 サービス RO 商品 サービス RO A B C ①IP制限 ip: - 172.31.0.0/24 172.31.0.0/24
© ZOZO Technologies, Inc. 内部APIのAPI Gateway化 ルーティング先の各hostへの重み付け 商品 サービス
RO IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway 商品 サービス RO 商品 サービス RO A B C ①IP制限 ②加重ルーティング ip: - 172.31.0.0/24 hosts: - host: searchA weight: 80 - host: searchB weight: 20 80% 20% 172.31.0.0/24
© ZOZO Technologies, Inc. 内部APIのAPI Gateway化 リトライ先を指定できる 商品 サービス RO
IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway 172.31.0.0/24 商品 サービス RO 商品 サービス RO A B C ①IP制限 ②加重ルーティング ③リトライ ip: - 172.31.0.0/24 hosts: - host: searchA weight: 80 - host: searchB weight: 20 retry: status: - 500 - 503 to: searchC
© ZOZO Technologies, Inc. API Gatewayの変遷 • マイクロサービス化準備 ◦ 内部APIのAPI
Gateway経由化 ◦ 加重ルーティング、リトライ機能、IP制限 • 共通機能の実装 ◦ ID認証サービスとの連動、分散トレーシング • 追加機能 ◦ パートナー向けにAPI公開 ◦ ルーティング、クライアント認証
© ZOZO Technologies, Inc. ID認証サービスとinternal token ID認証サービスで発行されたトークン(JWT)をAPI Gatewayで検証。 検証後にトークンからinternal
tokenを発行し、各マイクロサービスへ送る 他 サービス API Gateway ID認証 サービス RW ③ internal token: internal1234 IIS (Web) ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ID認証サービスへのリクエスト マイクロサービスへのリクエスト ② token: idaaa.bbb.1234
© ZOZO Technologies, Inc. ID認証サービスとinternal token 他 サービス API Gateway
ID認証 サービス RW IIS (Web) ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ①ID認証サービスでトークン(JWT)を発行
© ZOZO Technologies, Inc. ID認証サービスとinternal token 他 サービス API Gateway
ID認証 サービス RW IIS (Web) ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ② token: idaaa.bbb.1234 ①ID認証サービスでトークン(JWT)を発行 ②クライアントからトークンとともにリクエスト
© ZOZO Technologies, Inc. ID認証サービスとinternal token 他 サービス API Gateway
ID認証 サービス RW ①ID認証サービスでトークン(JWT)を発行 ②クライアントからトークンとともにリクエスト ③送られたトークンをAPI Gateway上で検証 後、internal tokenに変換し各サービスに送信 IIS (Web) ③ internal token: internal1234 ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ② token: idaaa.bbb.1234
© ZOZO Technologies, Inc. 分散トレーシング 各マイクロサービスのパフォーマンスをトレーシングするため、リクエストに一意のIDを付与 商品 サービス RO
クライアント API Gateway /search trace-id: abcd1234 ①API Gatewayでtrace ID発行 ②各マイクロサービスへのリクエスト にtrace ID付与
© ZOZO Technologies, Inc. 分散トレーシング ① API Gatewayに来た 最初のリクエスト
© ZOZO Technologies, Inc. 分散トレーシング ② API Gateway内で作成し た、マイクロサービスへの リクエスト
(trace ID付与) ③ マイクロサービス内の処 理
© ZOZO Technologies, Inc. API Gatewayの変遷 • マイクロサービス化準備 ◦ 内部APIのAPI
Gateway経由化 ◦ 加重ルーティング、リトライ機能、IP制限 • 共通機能の実装 ◦ ID認証サービスとの連動、分散トレーシング • 追加機能 ◦ パートナー向けにAPI公開 ◦ ルーティング、クライアント認証
© ZOZO Technologies, Inc. パートナー向けにAPI公開 内部向けにも使用している商品情報APIをヤフーに公開 IIS (Web) iOS
Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ヤフー 商品 サービス RO
© ZOZO Technologies, Inc. パートナー向けにAPI公開 • ルーティング ◦ 外部・内部から叩くエンドポイントをそれぞれ変えることで、外部からのリクエストを特 定のhostに向けることができる
• クライアント認証 ◦ クライアント認証用のヘッダーを用意。特定のエンドポイントとの組み合わせのみ許 可
© ZOZO Technologies, Inc. パートナー向けにAPI公開 ルーティングとクライアント認証を組み込むため、 API Gateway経由でリクエスト 商品 サービス
RO iOS Android ブラウザ PC/SP ZOZO DC クラウド API Gateway client: yahoo /external-service/search /search IIS (Web) IIS (API) ヤフー
© ZOZO Technologies, Inc. パートナー向けにAPIの公開 商品 サービス RO iOS Android
ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ①client tokenの検証 client: yahoo /external-service/search クライアントトークンをヘッダーに追加してリクエストしてもらう IIS (Web) IIS (API) ヤフー
© ZOZO Technologies, Inc. パートナー向けにAPIの公開 商品 サービス RO iOS Android
ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ①client tokenの検証 ②URLのルーティング /external-service/(.+) -> /$1 client: yahoo /external-service/search API Gateway上でクライアントトークンを検証 IIS (Web) IIS (API) ヤフー
© ZOZO Technologies, Inc. パートナー向けにAPIの公開 商品 サービス RO iOS Android
ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ①client tokenの検証 ②URLのルーティング /external-service/(.+) -> /$1 client: yahoo /external-service/search /search IIS (Web) IIS (API) ヤフー
© ZOZO Technologies, Inc. API Gatewayの現状 • マイクロサービス化を加速していくのに必要な機能を実装 ◦
加重ルーティング ◦ リトライ ◦ IP制限 ◦ 分散トレーシング ◦ クライアント認証 etc. • いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 ◦ ID認証サービス ◦ 商品サービス
© ZOZO Technologies, Inc. 実装に関する話
© ZOZO Technologies, Inc. yamlによる設定 • API Gatewayの各種設定はyamlファイルに記述する ◦
ファイルの更新、デプロイはSREチーム • 設定ファイルのバリデーション、仕様書作成は自動化されている ◦ https://techblog.zozo.com/entry/json-schema-documents-and-validation • 実装 ◦ yamlファイルを読み込み → 設定をもとに新規リクエスト作成・送信
© ZOZO Technologies, Inc. yamlによる設定 search: targets: - host: search
port: 4010 frontapi: targets: - id: frontapi-a host: frontapiA port: 4011 retry_to: frontapi-b - id: frontapi-b host: frontapiB port: 4011 retry_to: frontapi-a Json Schema 設定ファイル
© ZOZO Technologies, Inc. 実装上の注意 • HTTP 2 の仕様に合わせ、ヘッダーをあらかじめ小文字に統一しようとした
◦ サービス側で4xxエラー ◦ http.Client ライブラリがリクエスト時にContent-Lengthヘッダーを自動的に挿入する ため、元々のリクエストのヘッダーを小文字に変換して送信すると、content-lengthと Content-Lengthで2重に送ってしまっていた ◦ HTTP 1.1でのみ発生 • サービス側で大文字小文字の区別なく受け取るように • POSTでのテストコードを追加
© ZOZO Technologies, Inc. テストコードひと工夫 services: mock: image: nginx:mainline-alpine volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/test.conf:/etc/nginx/conf.d/default.conf - ./nginx/sleep.js:/etc/nginx/js/sleep.js networks: backend: aliases: - slow networks: backend: 各サービスのモックとしてnginxを利用。タイムアウトなどを表現 function sleep(r) { setTimeout(function() { r.return(200, ""); }, 10000) } export default {sleep}; sleep.js hosts: - host: slow
© ZOZO Technologies, Inc. まとめ • マイクロサービス化を加速していくのに必要なAPI Gatewayを実装
• いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 • ドキュメント生成やバリデーションの自動化、テストコードにより品質を担保している
None