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

ソフトバンクでのシステム開発におけるKongの活用

Naoto Tanaka
June 26, 2024
50

 ソフトバンクでのシステム開発におけるKongの活用

Kong Community, Japan MeetUP #4(2024/6/19開催)のイベントでの発表資料

Naoto Tanaka

June 26, 2024
Tweet

Transcript

  1. 2 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API

    Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
  2. 3 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API

    Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
  3. 6 モノリスからマイクロサービスへ モノリスシステムをAPIに切り出し、共通化を段階的に進める APIの組み合わせでシステムを構成していく マイクロ サービス API ユーザ インターフェース マイクロ

    サービス ・・・ API API モノリシックシステム 機能同士が密結合し 単一で巨大なシステム マイクロサービスアーキテクチャ 複数の小さなサービスが 連携して動くシステム API API API モノリシックシステム ユーザ インターフェース マイクロ サービス API API API データ データ データ ビジネスロジック データアクセス © 2024 Softbank Corp.
  4. 7 生じる課題 マイクロ サービス API システムA システムB システムC マイクロ サービス

    マイクロ サービス ・・・ API API API API API マイクロ サービス API API API API API API ②各サービスの通信プロトコルを意識する必要あり マイクロサービスに分解することで以下のような課題が生じる ①各マイクロサービスを個別に呼び出すのは非効率 ③各サービスでは業務とは関係のない認証/認可や 流量制御等の機能をそれぞれで実装する必要あり 上記課題の解決策として API Gatewayを導入 © 2024 Softbank Corp.
  5. 8 API Gatewayパターンの採用 API Gatewayを用いることで UIはマイクロサービスを意識することが不要に フロント マイクロ サービス 群

    Monolithic System APIs データ APIs データ APIs データ システムA システムB APIGateway UI APIGateway APIs UI 以下の観点から独立したAPI Gatewayを設ける • 改修に柔軟に対応できるようにするため • 共通化したBL機能を用いたシステム個別の処 理を行えるようにするため © 2024 Softbank Corp.
  6. 9 API Gatewayに求められること リクエストルーティング リクエストを適切なAPIにルーティングする API合成 複数のAPIのレスポンスを合成する プロトコル変換 様々なプロトコルのAPIをRESTful APIで提供する

    エッジ機能 認証/認可・流量制御・キャッシュ・フォーマット変換などの横断的機能 マイクロサービスパターン(Chris Richardson著)より API Gatewayには以下の内容が求められる © 2024 Softbank Corp.
  7. 10 API Gatewayの実装 OSSのAPI GatewayであるKongをベースに カスタムプラグイン等を活用しAPI Gatewayを構成する APIs APIGateway UI

    APIs 必要に応じて 適切な言語/FWで実装 Kong OSSで実装 プロトコル変換 カスタムプラグイン作成(REST↔SOAPのみ) リクエストルーティング Kong機能を用いる エッジ機能 kong提供プラグイン+カスタムプラグイン作成 API合成 共通機能に分解した各BLを要件に応じて合成 フロント マイクロ サービス 群 etc. © 2024 Softbank Corp.
  8. 11 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API

    Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
  9. 14 エッジ機能の追加 エッジ機能 エッジ機能 kong OSS Enterprise 詳細 流量制御 ◦

    ◦ Rate Limitingプラグインで可能 認証/認可(JWT検証) △ △ Jwtプラグインで検証は可能 検証した項目をボディにマッピングはできない IN/OUTマッピング △ ◦ request transformer advanced/response transformer advanced で柔軟にin/outマッピング可能 レスポンスキャッシュ ◦ ◦ Proxy Cacheプラグインで可能 リトライ制御 ◦ ◦ kong設定のretriesで設定可能 トレーシング ◦ ◦ Correlation IDプラグインで可能 フォーマット変換 × ◦ jqプラグインで可能 バージョン管理 ◦ ◦ kong設定でpathを分けることで可能 必要なエッジ機能のうち一部はKong機能では足りない部分あり © 2024 Softbank Corp.
  10. 15 プロトコル変換 プロトコル変換 SOAP通信のレガシーシステムと通信する要件があるが RESTから変換する方法はない エッジ機能 kong OSS Enterprise 詳細

    REST ↔ gRPC ◦ ◦ gRPC-gatewayプラグインで可能(現状は要件なし) REST ↔ SOAP × × REST-SOAPの変換はEnterpriseも含めなし GraphQL ↔ REST × ◦ DeGraphQLプラグインで可能(現状は要件なし) © 2024 Softbank Corp.
  11. 16 カスタムプラグインでの機能追加 エッジ機能 機能 OSS/ Enterprise 詳細 エッジ 機能 認証/認可

    (JWT検証) △ Jwtプラグインをベースに検証済み項目をプラグイン共有変数に 格納するよう機能拡張 プロトコル 変換 REST ↔ SOAP × カスタムプラグインを新規作成 業務上必要かつKong機能にないものは OSSプラグイン機能拡張/カスタムプラグイン作成を行い機能を追加 プロトコル変換 以降、JWTプラグインを例に機能拡張について紹介 © 2024 Softbank Corp.
  12. 18 JWTプラグインの拡張 / 要件 Kong OSSのJWTプラグインで満たせない以下に対して機能を拡張 ① 「JWTが付与されていたときだけ検証」 もできるようにしたい ②

    JWT検証後にPayloadに含まれている 項目をリクエストにマッピングしたい Custom Setting cookieにjwtがある → 検証実施 cookieにjwtがない → 検証しない という挙動を可能にする JWT Payload { "sub": "123456789", "name": "John Doe", "iat": 1516239022 } Request Body { "name": "John Doe", … } mapping © 2024 Softbank Corp.
  13. 21 JWTプラグインの拡張 / handler.luaの作成 JWT検証後にPayloadをkong.ctx.sharedに格納するように変更 handler.lua(抜粋) リクエストの各フェーズでの変数を共有可能 • kong.ctx.plugin: 同プラグイン

    • kong.ctx.shared: プラグイン間共有 kong.ctx.shared.xxxは request-transformerプラグインで参照可能 リクエストボディに必要な内容をマッピング する kong.yml(抜粋) © 2024 Softbank Corp.
  14. 22 プラグインの有効化 環境変数 設定値 詳細 KONG_PLUGINS bundled,<plugin-name>,... カンマ区切りでカスタムプラグインの名前を記載する KONG_UNTRUSTED_LUA on

    カスタムLuaコードを使えるようにする設定 Luaライブラリ等を使用する場合はonにする 特定のフォルダに配置し環境設定 ②環境変数を設定する ①特定のフォルダにコピー /usr/local/share/lua/5.1/kong/plugins/ 配下に配置する ※ lua_package_pathの設定で変更可 (例) /usr/local/share/lua/5.1/kong/plugins/ L custom-jwt L handler.lua L schema.lua L ... © 2024 Softbank Corp.
  15. 23 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API

    Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
  16. 27 まとめ 1. マイクロサービスでのAPI Gatewayの必要性と役割 マイクロサービス化で生じる課題の解決策としてAPI Gateway導入 そのベース機能としてオープンソースのKongを採用 2. API

    Gatewayのベース機能としてのKong利活用 API Gatewayの役割である「エッジ機能」「プロトコル変換」において 業務上必要だが足りない部分をカスタムプラグインで機能拡張 3. KubernetesでのKong稼働 API Gatewayの懸念点であるスケーラビリティに対して kongコンテナ+ Kubernetesを利用 © 2024 Softbank Corp.