Slide 1

Slide 1 text

API Gatewayによる
 マイクロサービスへのアクセス
 制御
 
 株式会社ZOZOテクノロジーズ
 技術開発本部 ECプラットフォーム部 API基盤チーム
 エンジニア 竹中達志
 Copyright © ZOZO Technologies, Inc.

Slide 2

Slide 2 text

© ZOZO Technologies, Inc. 竹中 達志(たけなか たつじ)
 2 2017年7月に株式会社スタートトゥデイ工務店(現 株式会 社ZOZOテクノロジーズ)に中途入社 
 
 2018年10月よりZOZOTOWNのリプレイスプロジェクトに従 事。クラウドインフラの構築・運用を経て、現在はマイクロ サービス基盤のバックエンドを中心に開発。 
 
 趣味はギターとバンドとゲーム。 


Slide 3

Slide 3 text

© ZOZO Technologies, Inc. アジェンダ
 ● API Gatewayとは何か?
 ● API Gatewayの機能と変遷
 ● 実装に関する話
 3

Slide 4

Slide 4 text

© ZOZO Technologies, Inc. API Gatewayとは?

Slide 5

Slide 5 text

© ZOZO Technologies, Inc. IIS (Web) RO iOS Android ブラウザ PC/SP リプレイス開始前: 〜2017年 ストアド ストアド ストアド 5 IIS (API) ロジックがDBに載ってい る(ストアド) 成功 ● データの近くで処理を行うため高速(特に 2005年 当時はネットワークが細い ) ● ロジックをDBに載せることでDRYにできる 課題 ● ストアドプロシージャ(ストアド)をスケールさせづら い ● ストアドのテストが書きづらい ● レガシー VBScript ● Windows Server の構築自動化が難しい ● 現実問題、ASPレイヤーで2重管理になっている ロジックは存在する

Slide 6

Slide 6 text

© 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 クラウド

Slide 7

Slide 7 text

© ZOZO Technologies, Inc. 新フレームワーク ロジック (Web表示のみ) 商品 サービス RO お気に入り サービス RW メンバー サービス RW ネイティブアプリはAPI 直呼び出し ブラウザ PC/SP iOS Android WebのUIに 新技術が使える ようになる それぞれのAPIが 独立したサービスに = マイクロサービス化 API Gateway ID認証 サービス RW 7 第2フェーズ: 目指す姿

Slide 8

Slide 8 text

© ZOZO Technologies, Inc. 新フレームワーク ロジック (Web表示のみ) 商品 サービス RO お気に入り サービス RW メンバー サービス RW ブラウザ PC/SP iOS Android API Gateway ID認証 サービス RW 8 第2フェーズ: 目指す姿

Slide 9

Slide 9 text

© ZOZO Technologies, Inc. API Gateway
 ● マイクロサービスの API の出入り口として機能するアプリケーション 
 9 新フレームワーク ロジック (Web表示のみ) ユーザー サービス RO お気に入り サービス RW 商品 サービス RW API Gateway ID認証 サービス RW これ

Slide 10

Slide 10 text

© ZOZO Technologies, Inc. API Gatewayのメリット
 ● 各マイクロサービスに求められる共通機能を集約できる 
 ○ ルーティング
 ○ SSL終端
 ○ 認証、認可
 ○ リトライ、タイムアウト設定
 ○ ロギング、トレース
 ○ etc.
 


Slide 11

Slide 11 text

© ZOZO Technologies, Inc. API Gatewayの必要性
 ● 共通で必要となる処理を集約することで、マイクロサービス化を加速させたい 
 ○ 加重ルーティングを利用した各マイクロサービスのカナリーリリース 
 ○ クライアント認証処理
 ○ リトライ、タイムアウトによるリクエスト制御 
 
 ● マイクロサービスへのリクエストのエンドポイントを一元化 する
 ○ 各マイクロサービスへの動的なルーティングを可能にする 
 
 段階的なサービス移行が可能


Slide 12

Slide 12 text

© ZOZO Technologies, Inc. iOS Android IIS (API) iOS Android IIS (API) 商品 サービス API Gateway 段階的なサービス切り替え 1 2 /old-api/search /gateway/search /old-api/search 商品サービスへのリプレイスを考える 


Slide 13

Slide 13 text

© 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 商品サービスへのリプレイスを考える 


Slide 14

Slide 14 text

© ZOZO Technologies, Inc. API Gateway ID認証 サービス RW 14 IIS (Web) RO ブラウザ PC/SP ストアド ストアド ストアド IIS (API) ZOZO DC API Gatewayを通したマイクロサービスの追加 iOS Android 切り替え 切り替え クラウド 共通処理やルーティングを API Gateway に集約できる 
 


Slide 15

Slide 15 text

© ZOZO Technologies, Inc. 商品 サービス RO API Gateway ID認証 サービス RW 15 IIS (Web) RO ブラウザ PC/SP ストアド ストアド IIS (API) ZOZO DC iOS Android 切り替え 切り替え クラウド API Gatewayを通したマイクロサービスの追加 共通処理やルーティングを API Gateway に集約できる 
 


Slide 16

Slide 16 text

© ZOZO Technologies, Inc. 商品 サービス RO お気に入り サービス RW API Gateway ID認証 サービス RW 16 IIS (Web) ブラウザ PC/SP ストアド IIS (API) ZOZO DC iOS Android 切り替え 切り替え クラウド API Gatewayを通したマイクロサービスの追加 共通処理やルーティングを API Gateway に集約できる 
 


Slide 17

Slide 17 text

© 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 に集約できる 
 


Slide 18

Slide 18 text

© ZOZO Technologies, Inc. API Gatewayは自前で実装
 ● AWS にはマネージドサービスの API Gateway がある 
 ● 複雑な要求に柔軟に対応するため に自前実装
 ○ エンドポイントを複数もつサービス (マルチクラスタ)に対し、
 エラーやタイムアウト時に別エンドポイントへのリトライなど 
 ● AWS/EKS上に構築
 ● Goで実装
 ○ リバースプロキシとしての役割なので、応答時間の増加はできるだけ抑えたい 
 ○ 軽量(スケーラビリティ)


Slide 19

Slide 19 text

© ZOZO Technologies, Inc. API Gatewayの機能と変遷

Slide 20

Slide 20 text

© ZOZO Technologies, Inc. API Gatewayの変遷
 ● マイクロサービス化準備
 ○ 内部APIのAPI Gateway経由化
 ○ 加重ルーティング、リトライ機能、IP制限
 
 ● 共通機能の実装
 ○ ID認証サービスとの連動、分散トレーシング
 
 ● 追加機能
 ○ パートナー向けにAPI公開
 ○ ルーティング、クライアント認証
 


Slide 21

Slide 21 text

© ZOZO Technologies, Inc. API Gatewayの変遷
 ● マイクロサービス化準備
 ○ 内部APIのAPI Gateway経由化
 ○ 加重ルーティング、リトライ機能、IP制限
 
 ● 共通機能の実装
 ○ ID認証サービスとの連動、分散トレーシング
 
 ● 追加機能
 ○ パートナー向けにAPI公開
 ○ ルーティング、クライアント認証
 


Slide 22

Slide 22 text

© ZOZO Technologies, Inc. 内部APIのAPI Gateway化
 内部からの商品情報API利用をAPI Gateway経由化する 
 商品 サービス RO IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway

Slide 23

Slide 23 text

© ZOZO Technologies, Inc. 内部APIのAPI Gateway化
 ● リトライ
 ○ 別系統への即時リトライ。元々商品サービス呼び出し元サーバーサイド(IIS)に実装さ れていた機能をAPI Gatewayに実装。 
 リトライ先、リトライ条件(ステータスコード等)を指定 
 
 ● 加重ルーティング
 ○ ルーティング先の複数のホストに対しラウンドロビンでリクエストする 
 
 ● IP制限
 ○ 特定のIPレンジからのアクセスのみ許可 


Slide 24

Slide 24 text

© ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web) 商品 サービス RO 商品 サービス RO A B C ① 商品サービスの複数hostに対するリトライ 


Slide 25

Slide 25 text

© ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web) 商品 サービス RO 商品 サービス RO A B C ②HTTP 5xx or timeout N sec ① リトライ条件を指定できる


Slide 26

Slide 26 text

© ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web) 商品 サービス RO 商品 サービス RO A B C ① ③ リトライ先は選択できる
 ②HTTP 5xx or timeout N sec

Slide 27

Slide 27 text

© ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web) 商品 サービス RO 商品 サービス RO A B C ① ③ リトライ先は選択できる
 ②HTTP 5xx or timeout N sec

Slide 28

Slide 28 text

© ZOZO Technologies, Inc. 加重ルーティング
 IIS (Web) 商品 サービス RO A B 商品 サービス RO 商品 サービス RO C 70% 20% 10% 10回のリクエストで、AAAAAABABC となる 


Slide 29

Slide 29 text

© 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

Slide 30

Slide 30 text

© 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

Slide 31

Slide 31 text

© 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

Slide 32

Slide 32 text

© ZOZO Technologies, Inc. API Gatewayの変遷
 ● マイクロサービス化準備
 ○ 内部APIのAPI Gateway経由化
 ○ 加重ルーティング、リトライ機能、IP制限
 
 ● 共通機能の実装
 ○ ID認証サービスとの連動、分散トレーシング
 
 ● 追加機能
 ○ パートナー向けにAPI公開
 ○ ルーティング、クライアント認証
 


Slide 33

Slide 33 text

© 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

Slide 34

Slide 34 text

© ZOZO Technologies, Inc. ID認証サービスとinternal token
 他 サービス API Gateway ID認証 サービス RW IIS (Web) ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ①ID認証サービスでトークン(JWT)を発行

Slide 35

Slide 35 text

© 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)を発行 ②クライアントからトークンとともにリクエスト

Slide 36

Slide 36 text

© 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

Slide 37

Slide 37 text

© ZOZO Technologies, Inc. 分散トレーシング
 各マイクロサービスのパフォーマンスをトレーシングするため、リクエストに一意のIDを付与 
 商品 サービス RO クライアント API Gateway /search trace-id: abcd1234 ①API Gatewayでtrace ID発行 ②各マイクロサービスへのリクエスト にtrace ID付与

Slide 38

Slide 38 text

© ZOZO Technologies, Inc. 分散トレーシング ① API Gatewayに来た 最初のリクエスト

Slide 39

Slide 39 text

© ZOZO Technologies, Inc. 分散トレーシング ② API Gateway内で作成し た、マイクロサービスへの リクエスト (trace ID付与) ③ マイクロサービス内の処 理

Slide 40

Slide 40 text

© ZOZO Technologies, Inc. API Gatewayの変遷
 ● マイクロサービス化準備
 ○ 内部APIのAPI Gateway経由化
 ○ 加重ルーティング、リトライ機能、IP制限
 
 ● 共通機能の実装
 ○ ID認証サービスとの連動、分散トレーシング
 
 ● 追加機能
 ○ パートナー向けにAPI公開
 ○ ルーティング、クライアント認証
 


Slide 41

Slide 41 text

© ZOZO Technologies, Inc. パートナー向けにAPI公開
 内部向けにも使用している商品情報APIをヤフーに公開 
 IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ヤフー 商品 サービス RO

Slide 42

Slide 42 text

© ZOZO Technologies, Inc. パートナー向けにAPI公開
 ● ルーティング
 ○ 外部・内部から叩くエンドポイントをそれぞれ変えることで、外部からのリクエストを特 定のhostに向けることができる
 
 ● クライアント認証
 ○ クライアント認証用のヘッダーを用意。特定のエンドポイントとの組み合わせのみ許 可


Slide 43

Slide 43 text

© 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) ヤフー

Slide 44

Slide 44 text

© 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) ヤフー

Slide 45

Slide 45 text

© 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) ヤフー

Slide 46

Slide 46 text

© 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) ヤフー

Slide 47

Slide 47 text

© ZOZO Technologies, Inc. API Gatewayの現状
 ● マイクロサービス化を加速していくのに必要な機能を実装 
 ○ 加重ルーティング
 ○ リトライ
 ○ IP制限
 ○ 分散トレーシング
 ○ クライアント認証 etc.
 
 ● いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 
 ○ ID認証サービス
 ○ 商品サービス


Slide 48

Slide 48 text

© ZOZO Technologies, Inc. 実装に関する話

Slide 49

Slide 49 text

© ZOZO Technologies, Inc. yamlによる設定
 ● API Gatewayの各種設定はyamlファイルに記述する 
 ○ ファイルの更新、デプロイはSREチーム 
 
 ● 設定ファイルのバリデーション、仕様書作成は自動化されている 
 ○ https://techblog.zozo.com/entry/json-schema-documents-and-validation ● 実装 ○ yamlファイルを読み込み → 設定をもとに新規リクエスト作成・送信

Slide 50

Slide 50 text

© 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 設定ファイル

Slide 51

Slide 51 text

© ZOZO Technologies, Inc. 実装上の注意
 ● HTTP 2 の仕様に合わせ、ヘッダーをあらかじめ小文字に統一しようとした 
 ○ サービス側で4xxエラー
 ○ http.Client ライブラリがリクエスト時にContent-Lengthヘッダーを自動的に挿入する ため、元々のリクエストのヘッダーを小文字に変換して送信すると、content-lengthと Content-Lengthで2重に送ってしまっていた
 ○ HTTP 1.1でのみ発生
 
 ● サービス側で大文字小文字の区別なく受け取るように 
 ● POSTでのテストコードを追加


Slide 52

Slide 52 text

© 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

Slide 53

Slide 53 text

© ZOZO Technologies, Inc. まとめ
 ● マイクロサービス化を加速していくのに必要なAPI Gatewayを実装 
 
 ● いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 
 
 ● ドキュメント生成やバリデーションの自動化、テストコードにより品質を担保している 


Slide 54

Slide 54 text

No content