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

API Gatewayによるマイクロサービスへのアクセス制御

takenakaJ
November 05, 2020

API Gatewayによるマイクロサービスへのアクセス制御

takenakaJ

November 05, 2020
Tweet

More Decks by takenakaJ

Other Decks in Technology

Transcript

  1. © ZOZO Technologies, Inc. 竹中 達志(たけなか たつじ)
 2 2017年7月に株式会社スタートトゥデイ工務店(現 株式会

    社ZOZOテクノロジーズ)に中途入社 
 
 2018年10月よりZOZOTOWNのリプレイスプロジェクトに従 事。クラウドインフラの構築・運用を経て、現在はマイクロ サービス基盤のバックエンドを中心に開発。 
 
 趣味はギターとバンドとゲーム。 

  2. © ZOZO Technologies, Inc. アジェンダ
 • API Gatewayとは何か?
 • API

    Gatewayの機能と変遷
 • 実装に関する話
 3
  3. © ZOZO Technologies, Inc. IIS (Web) RO iOS Android ブラウザ

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

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

    お気に入り サービス RW メンバー サービス RW ブラウザ PC/SP iOS Android API Gateway ID認証 サービス RW 8 第2フェーズ: 目指す姿
  7. © ZOZO Technologies, Inc. API Gateway
 • マイクロサービスの API の出入り口として機能するアプリケーション

    
 9 新フレームワーク ロジック (Web表示のみ) ユーザー サービス RO お気に入り サービス RW 商品 サービス RW API Gateway ID認証 サービス RW これ
  8. © ZOZO Technologies, Inc. API Gatewayのメリット
 • 各マイクロサービスに求められる共通機能を集約できる 
 ◦

    ルーティング
 ◦ SSL終端
 ◦ 認証、認可
 ◦ リトライ、タイムアウト設定
 ◦ ロギング、トレース
 ◦ etc.
 

  9. © ZOZO Technologies, Inc. API Gatewayの必要性
 • 共通で必要となる処理を集約することで、マイクロサービス化を加速させたい 
 ◦

    加重ルーティングを利用した各マイクロサービスのカナリーリリース 
 ◦ クライアント認証処理
 ◦ リトライ、タイムアウトによるリクエスト制御 
 
 • マイクロサービスへのリクエストのエンドポイントを一元化 する
 ◦ 各マイクロサービスへの動的なルーティングを可能にする 
 
 段階的なサービス移行が可能

  10. © ZOZO Technologies, Inc. iOS Android IIS (API) iOS Android

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

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

  12. © ZOZO Technologies, Inc. API Gateway ID認証 サービス RW 14

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

  13. © ZOZO Technologies, Inc. 商品 サービス RO API Gateway ID認証

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

  14. © ZOZO Technologies, Inc. 商品 サービス RO お気に入り サービス RW

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

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

  16. © ZOZO Technologies, Inc. API Gatewayは自前で実装
 • AWS にはマネージドサービスの API

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

  17. © ZOZO Technologies, Inc. API Gatewayの変遷
 • マイクロサービス化準備
 ◦ 内部APIのAPI

    Gateway経由化
 ◦ 加重ルーティング、リトライ機能、IP制限
 
 • 共通機能の実装
 ◦ ID認証サービスとの連動、分散トレーシング
 
 • 追加機能
 ◦ パートナー向けにAPI公開
 ◦ ルーティング、クライアント認証
 

  18. © ZOZO Technologies, Inc. API Gatewayの変遷
 • マイクロサービス化準備
 ◦ 内部APIのAPI

    Gateway経由化
 ◦ 加重ルーティング、リトライ機能、IP制限
 
 • 共通機能の実装
 ◦ ID認証サービスとの連動、分散トレーシング
 
 • 追加機能
 ◦ パートナー向けにAPI公開
 ◦ ルーティング、クライアント認証
 

  19. © ZOZO Technologies, Inc. 内部APIのAPI Gateway化
 内部からの商品情報API利用をAPI Gateway経由化する 
 商品

    サービス RO IIS (Web) iOS Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway
  20. © ZOZO Technologies, Inc. 内部APIのAPI Gateway化
 • リトライ
 ◦ 別系統への即時リトライ。元々商品サービス呼び出し元サーバーサイド(IIS)に実装さ

    れていた機能をAPI Gatewayに実装。 
 リトライ先、リトライ条件(ステータスコード等)を指定 
 
 • 加重ルーティング
 ◦ ルーティング先の複数のホストに対しラウンドロビンでリクエストする 
 
 • IP制限
 ◦ 特定のIPレンジからのアクセスのみ許可 

  21. © ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web)

    商品 サービス RO 商品 サービス RO A B C ① 商品サービスの複数hostに対するリトライ 

  22. © ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web)

    商品 サービス RO 商品 サービス RO A B C ②HTTP 5xx or timeout N sec ① リトライ条件を指定できる

  23. © ZOZO Technologies, Inc. リトライ仕様
 商品 サービス RO IIS (Web)

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

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

    A B 商品 サービス RO 商品 サービス RO C 70% 20% 10% 10回のリクエストで、AAAAAABABC となる 

  26. © 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
  27. © 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
  28. © 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
  29. © ZOZO Technologies, Inc. API Gatewayの変遷
 • マイクロサービス化準備
 ◦ 内部APIのAPI

    Gateway経由化
 ◦ 加重ルーティング、リトライ機能、IP制限
 
 • 共通機能の実装
 ◦ ID認証サービスとの連動、分散トレーシング
 
 • 追加機能
 ◦ パートナー向けにAPI公開
 ◦ ルーティング、クライアント認証
 

  30. © 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
  31. © ZOZO Technologies, Inc. ID認証サービスとinternal token
 他 サービス API Gateway

    ID認証 サービス RW IIS (Web) ① token: idaaa.bbb.1234 ① token: idaaa.bbb.1234 ①ID認証サービスでトークン(JWT)を発行
  32. © 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)を発行 ②クライアントからトークンとともにリクエスト
  33. © 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
  34. © ZOZO Technologies, Inc. 分散トレーシング
 各マイクロサービスのパフォーマンスをトレーシングするため、リクエストに一意のIDを付与 
 商品 サービス RO

    クライアント API Gateway /search trace-id: abcd1234 ①API Gatewayでtrace ID発行 ②各マイクロサービスへのリクエスト にtrace ID付与
  35. © ZOZO Technologies, Inc. API Gatewayの変遷
 • マイクロサービス化準備
 ◦ 内部APIのAPI

    Gateway経由化
 ◦ 加重ルーティング、リトライ機能、IP制限
 
 • 共通機能の実装
 ◦ ID認証サービスとの連動、分散トレーシング
 
 • 追加機能
 ◦ パートナー向けにAPI公開
 ◦ ルーティング、クライアント認証
 

  36. © ZOZO Technologies, Inc. パートナー向けにAPI公開
 内部向けにも使用している商品情報APIをヤフーに公開 
 IIS (Web) iOS

    Android ブラウザ PC/SP IIS (API) ZOZO DC クラウド API Gateway ヤフー 商品 サービス RO
  37. © 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) ヤフー
  38. © 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) ヤフー
  39. © 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) ヤフー
  40. © 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) ヤフー
  41. © ZOZO Technologies, Inc. API Gatewayの現状
 • マイクロサービス化を加速していくのに必要な機能を実装 
 ◦

    加重ルーティング
 ◦ リトライ
 ◦ IP制限
 ◦ 分散トレーシング
 ◦ クライアント認証 etc.
 
 • いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 
 ◦ ID認証サービス
 ◦ 商品サービス

  42. © ZOZO Technologies, Inc. yamlによる設定
 • API Gatewayの各種設定はyamlファイルに記述する 
 ◦

    ファイルの更新、デプロイはSREチーム 
 
 • 設定ファイルのバリデーション、仕様書作成は自動化されている 
 ◦ https://techblog.zozo.com/entry/json-schema-documents-and-validation • 実装 ◦ yamlファイルを読み込み → 設定をもとに新規リクエスト作成・送信
  43. © 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 設定ファイル
  44. © ZOZO Technologies, Inc. 実装上の注意
 • HTTP 2 の仕様に合わせ、ヘッダーをあらかじめ小文字に統一しようとした 


    ◦ サービス側で4xxエラー
 ◦ http.Client ライブラリがリクエスト時にContent-Lengthヘッダーを自動的に挿入する ため、元々のリクエストのヘッダーを小文字に変換して送信すると、content-lengthと Content-Lengthで2重に送ってしまっていた
 ◦ HTTP 1.1でのみ発生
 
 • サービス側で大文字小文字の区別なく受け取るように 
 • POSTでのテストコードを追加

  45. © 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
  46. © ZOZO Technologies, Inc. まとめ
 • マイクロサービス化を加速していくのに必要なAPI Gatewayを実装 
 


    • いくつかのサービスをAPI Gateway経由での呼び出しに切り替え完了 
 
 • ドキュメント生成やバリデーションの自動化、テストコードにより品質を担保している