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
ソフトバンクでのシステム開発におけるKongの活用
Search
Naoto Tanaka
June 26, 2024
0
50
ソフトバンクでのシステム開発におけるKongの活用
Kong Community, Japan MeetUP #4(2024/6/19開催)のイベントでの発表資料
Naoto Tanaka
June 26, 2024
Tweet
Share
More Decks by Naoto Tanaka
See All by Naoto Tanaka
[Kong Meetup #2] ソフトバンクでのAPI Gatewayを用いた開発におけるKongの利活用
naoto_tanaka
0
270
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
How GitHub (no longer) Works
holman
311
140k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Facilitating Awesome Meetings
lara
50
6.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
How to Ace a Technical Interview
jacobian
276
23k
Transcript
【KCJ MeetUp #4】 ソフトバンクでのシステム開発における Kongの活用 © 2024 Softbank Corp.
2 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API
Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
3 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API
Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
4 所属部署のシステム開発 コンシューマ事業・法人ビジネス事業領域の 各種システム開発を担当 © 2024 Softbank Corp.
5 モノリス型システムの問題が顕著化 店頭システム コンシューマ事業のフロントシステムはチャネルに応じて様々 年月を重ね肥大化・複雑化した結果、保守コスト増加や機能の重複開発が発生 Webシステム アプリ 画面 Business Logic
肥 大 化 ・ 複 雑 化 機能の重複開発 ・・・ その他 © 2024 Softbank Corp.
6 モノリスからマイクロサービスへ モノリスシステムをAPIに切り出し、共通化を段階的に進める APIの組み合わせでシステムを構成していく マイクロ サービス API ユーザ インターフェース マイクロ
サービス ・・・ API API モノリシックシステム 機能同士が密結合し 単一で巨大なシステム マイクロサービスアーキテクチャ 複数の小さなサービスが 連携して動くシステム API API API モノリシックシステム ユーザ インターフェース マイクロ サービス API API API データ データ データ ビジネスロジック データアクセス © 2024 Softbank Corp.
7 生じる課題 マイクロ サービス API システムA システムB システムC マイクロ サービス
マイクロ サービス ・・・ API API API API API マイクロ サービス API API API API API API ②各サービスの通信プロトコルを意識する必要あり マイクロサービスに分解することで以下のような課題が生じる ①各マイクロサービスを個別に呼び出すのは非効率 ③各サービスでは業務とは関係のない認証/認可や 流量制御等の機能をそれぞれで実装する必要あり 上記課題の解決策として API Gatewayを導入 © 2024 Softbank Corp.
8 API Gatewayパターンの採用 API Gatewayを用いることで UIはマイクロサービスを意識することが不要に フロント マイクロ サービス 群
Monolithic System APIs データ APIs データ APIs データ システムA システムB APIGateway UI APIGateway APIs UI 以下の観点から独立したAPI Gatewayを設ける • 改修に柔軟に対応できるようにするため • 共通化したBL機能を用いたシステム個別の処 理を行えるようにするため © 2024 Softbank Corp.
9 API Gatewayに求められること リクエストルーティング リクエストを適切なAPIにルーティングする API合成 複数のAPIのレスポンスを合成する プロトコル変換 様々なプロトコルのAPIをRESTful APIで提供する
エッジ機能 認証/認可・流量制御・キャッシュ・フォーマット変換などの横断的機能 マイクロサービスパターン(Chris Richardson著)より API Gatewayには以下の内容が求められる © 2024 Softbank Corp.
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.
11 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API
Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
12 Kongとは? 認証や流量制御・キャッシュ等の必要な機能をプラグインで追加できる プラグインは自作可能で拡張もできる https://github.com/Kong/kong © 2024 Softbank Corp.
13 ルーティング設定 ルーティング設定 リクエストルーティング エッジ機能 (例)Yamlファイル利用の場合 必要なエッジ機能をプラグインとして追加 簡単にルーティング設定+必要なエッジ機能の有効化可能 © 2024
Softbank Corp.
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.
15 プロトコル変換 プロトコル変換 SOAP通信のレガシーシステムと通信する要件があるが RESTから変換する方法はない エッジ機能 kong OSS Enterprise 詳細
REST ↔ gRPC ◦ ◦ gRPC-gatewayプラグインで可能(現状は要件なし) REST ↔ SOAP × × REST-SOAPの変換はEnterpriseも含めなし GraphQL ↔ REST × ◦ DeGraphQLプラグインで可能(現状は要件なし) © 2024 Softbank Corp.
16 カスタムプラグインでの機能追加 エッジ機能 機能 OSS/ Enterprise 詳細 エッジ 機能 認証/認可
(JWT検証) △ Jwtプラグインをベースに検証済み項目をプラグイン共有変数に 格納するよう機能拡張 プロトコル 変換 REST ↔ SOAP × カスタムプラグインを新規作成 業務上必要かつKong機能にないものは OSSプラグイン機能拡張/カスタムプラグイン作成を行い機能を追加 プロトコル変換 以降、JWTプラグインを例に機能拡張について紹介 © 2024 Softbank Corp.
17 カスタムプラグイン作成 【開発言語】 言語はLuaで開発(Go/JS/Pythonでも作成可能) ゲームやプラグイン開発で使用される高速のスクリプト言語 【作成ファイル】 最低以下の2ファイルを作成すればOK • handler.lua ライフサイクル(request,
response, logなど)の各フェーズで実行する処理を記載 • schema.lua ユーザーが動作を変更するための変数を定義する © 2024 Softbank Corp.
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.
19 JWTプラグインの拡張 / schema.luaの作成 schema.lua(抜粋) ymlファイルでの設定(抜粋) デフォルトのJWTプラグインをベースに設定項目を追加する 追加 © 2024
Softbank Corp.
20 JWTプラグインの拡張 / handler.luaの作成 設定に応じてjwt tokenがなくてもスルーするように変更 handler.lua(抜粋) 追加 yamlで指定したパラメータを利用可能 “verification:
IfExist”の場合 スルーするコードを追加 © 2024 Softbank Corp.
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.
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.
23 1 マイクロサービスでの API Gatewayの必要性と役割 UIにマイクロサービスを意識させないために API Gateway導入 2 API
Gatewayのベース機能としての Kong利活用 カスタムプラグインでの機能拡張を含めたベース機能の実装 3 KubernetesでのKong稼働 スケーラビリティを考慮し、 Kongコンテナ+Kubernetesで稼働 Agenda © 2024 Softbank Corp.
24 API Gatewayの考慮点 UIからの全てのリクエストがAPI Gatewayを通過するので パフォーマンス・スケーラビリティが重要となる ✖ 高いI/Oパフォーマンスを持つKongを Kubernetesで稼働させスケーラビリティを担保する ©
2024 Softbank Corp.
25 Kong+Kubernetesの選択肢 kubernetesのingressリソースとしてkongを使用する 以下二つの選択肢のうち、カスタムプラグイン利用のため②を選択 メリット: HelmやKustomizeで環境ごとの設定管理も容易 デメリット: カスタムプラグインをConfigmapとして作成する必要があり、ライブラリを使う場合は困難 メリット: Kongのdockerイメージを自由に拡張できる
デメリット: 設定ファイルを用いるので環境ごとの設定管理が困難 ②Kong DBless Container on k8s DBレスモードのKongのpodをkubernetesで動かす ①Kong Ingress Controller © 2024 Softbank Corp.
26 Kubernetesでの構成管理 コンテナとして使用する場合の「環境ごとの構成管理」の課題に対し 環境変数を設定ファイルに埋め込んで環境ごとの設定を構成 DBlessモード使用 設定ファイル内で 変数化しておき イメージ作成 コンテナ起動時に 環境変数定義&
envsubstで環境変数 埋め込み © 2024 Softbank Corp.
27 まとめ 1. マイクロサービスでのAPI Gatewayの必要性と役割 マイクロサービス化で生じる課題の解決策としてAPI Gateway導入 そのベース機能としてオープンソースのKongを採用 2. API
Gatewayのベース機能としてのKong利活用 API Gatewayの役割である「エッジ機能」「プロトコル変換」において 業務上必要だが足りない部分をカスタムプラグインで機能拡張 3. KubernetesでのKong稼働 API Gatewayの懸念点であるスケーラビリティに対して kongコンテナ+ Kubernetesを利用 © 2024 Softbank Corp.