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

【PyCon APAC 2023 登壇資料】FinTechの現場でバリバリ活躍するFastAP...

【PyCon APAC 2023 登壇資料】FinTechの現場でバリバリ活躍するFastAPIの理想と現実

10/26(木)-29(日)に開催された『PyCon APAC 2023』にて、CTOの中村が登壇しました。
FastAPIを使用したFinTechサービス開発についてまとめております。

Susten Capital Management Inc.

November 20, 2023
Tweet

More Decks by Susten Capital Management Inc.

Other Decks in Programming

Transcript

  1. お前誰よ? • @sh0nk (github) ◦ @sh0nk0 (X): スライドもこちらに • Love

    Beer 🍻 • FinTechスタートアップsustenの取締役 ◦ 「おまかせ資産運用」をつくっています • 前職ではML/NLPを使った検索エンジン・推薦システム (recommendation engine)の開発 • Python歴:10+年 • PyCon参加歴:2014、2016年(7年ぶり、初登壇) 2 @sh0nk0
  2. 本日のトークテーマ • 前半(基礎編):FastAPIの良いところをサクッと学習 ◦ FastAPIを使ってみたいけど まだトライできていない 方 • 後半(応用編):FastAPIが「FinTech」「スタートアップ」でどう使われているかの一 例をご紹介

    ◦ FastAPIに入門してみたけど、 業務で本番環境への投入までには至っていない 方 ◦ FastAPIを本番環境で使っているが、 FinTechでどう使われているか裏側を知りたい 方 4 @sh0nk0
  3. どんなFramework? • 他のFrameworkとの違い ◦ Django REST Framework ▪ 大規模WebフレームワークであるDjangoでAPIを開発できるようにしたライブラリ ▪

    FastAPIも自動でAPIドキュメントを生成する点でヒントを得ている ▪ Djangoの上に成り立っている(依存している)ため重量級 ◦ Flask ▪ かなりシンプルなフレームワーク( Microframework) ▪ シンプルがゆえドキュメントが技術的過ぎたり、複雑なことをやろうとすると他のライブラリの力を借りるこ とになる 7 @sh0nk0
  4. どんなFramework? • 他のFrameworkとの違い ◦ Django REST Framework ▪ 大規模WebフレームワークであるDjangoでAPIを開発できるようにしたライブラリ ▪

    FastAPIも自動でAPIドキュメントを生成する点でヒントを得ている ▪ Djangoの上に成り立っている(依存している)ため重量級 ◦ Flask ▪ かなりシンプルなフレームワーク( Microframework) ▪ シンプルがゆえドキュメントが技術的過ぎたり、複雑なことをやろうとすると他のライブラリの力を借りるこ とになる 誤解を恐れずに言うと... 「Django REST Frameworkぐらい色んなこと (例えばバリデーションやAPIドキュメントの自動生成) をFlaskぐらい軽量に扱える」 “Battery included”な いいとこ取り WebAPIフレームワーク 🔋 8 @sh0nk0
  5. どんなFramework? • 使われているシーン ◦ NetflixやUberなどのBig Techも導入 ▪ 例 • Netflix

    Dispatch: システム障害管理ツール (https://github.com/Netflix/dispatch) ◦ OSSなどでも活用されている ▪ Chroma: LLMなどで使われるEmbeddingsを保存するベクトルDB 9 @sh0nk0
  6. FastAPIはどう動いているか? Dockerコンテナ Pydantic バリデーション シリアライズ Starlette 低レイヤ Webフレームワーク Uvicorn ASGI

    Server SQLAlchemy Peewee など O/Rマッパー データ ベース 10 • FastAPIは2つの強力なライブラリPydantic/Starletteの上に成り立っている @sh0nk0
  7. FastAPIの3つのおすすめポイント(特長) • ポイント1 ◦ Pydanticによって型ヒントを実行時のバリデーションに利用するため、 型安全 • ポイント2 ◦ 型定義に従いSwagger

    UIが自動生成されるため、フロントエンドとのインテグレーションが容易 • ポイント3 ◦ ASGIサーバの利用を前提としているので 高速 12 @sh0nk0
  8. そもそも金融でPython大丈夫なの? • 私たちがPython/FastAPIを採用した理由 ◦ Python ▪ 機械学習との親和性 • 社内の資産運用・投資判断チームが利用 •

    資産運用でのPython(データ分析、クオンツ運用)は今回のトークの対象外 ◦ FastAPI ▪ 型安全 • 金融、特に数値計算において型は重要(後述) ▪ いくつかのエビデンスによると「速いらしい」 ▪ 実際に触ってみて、「 Swagger UI自動生成すごいし、フレームワークとして伸びそうな予感が する」 25 @sh0nk0
  9. FastAPIアプリまわりのアーキテクチャ Webアプリ スマート フォン アプリ 金融機関接続 勘定システム KYC/AML システム 外部

    接続 バッチを含む 内製システム ユーザーとの インターフェイス KYC=Know Your Customer AML=Anti-Money Laundering 口座開設時の審査を行う 入出金・口座引落にて、銀行等の金 融機関との接続を行う 日々の顧客ごとの口座管理(投資信 託の買付・売却等)を行う 外部 接続 外部 接続 WebAPI (FastAPI アプリ) 26 @sh0nk0
  10. まずはアーキテクチャ Webアプリ スマート フォン アプリ 金融機関接続 勘定システム KYC/AML システム 外部

    接続 バッチを含む 内製システム ユーザーとの インターフェイス KYC=Know Your Customer AML=Anti-Money Laundering 口座開設時の審査を行う 入出金・口座引落にて、銀行等の金 融機関との接続を行う 日々の顧客ごとの口座管理(投資信 託の買付・売却等)を行う 外部 接続 外部 接続 WebAPI (FastAPI アプリ) 27 金融ドメインのAPIは 「ミッションクリティカル」なAPIになりがち @sh0nk0
  11. 型ヒント • どれぐらい厳密に型ヒントを用いるか? ◦ すべての変数に定義することもできる ◦ しかし、 ▪ 静的型付け言語ほど型に関する IDEのサポートが完全とも言い難い

    ▪ コードを書くスピードと、全体のコードの可読性も重要 ◦ → 変数定義・代入など比較的自明な部分には、基本的には型ヒントは不要とする ▪ 明示的にしたい、型が複雑な箇所では適宜付加可能 現実 変数定義には 型ヒントを 無理に付けない 29 @sh0nk0
  12. 型ヒント • どれぐらい厳密に型ヒントを用いるか? ◦ すべての変数に定義することもできる ◦ しかし、 ▪ 静的型付け言語ほど型に関する IDEのサポートが完全とも言い難い

    ▪ コードを書くスピードと、全体のコードの可読性も重要 ◦ → 変数定義・代入など比較的自明な部分には、基本的には型ヒントは不要とする ▪ 明示的にしたい、型が複雑な箇所では適宜付加可能 現実 変数定義には 型ヒントを 無理に付けない 30 「静的型付け言語の型チェックと同等のチェックを目指す」 までは目指さない 基本的には 「関数の引数及び返り値には必ず型ヒントを」 ぐらいの緩めのルールで運用 @sh0nk0
  13. Tips:数値計算 • 金融の計算では小数点が登場することがしばしば ◦ 小数点(float)は丸め誤差が発生する • Decimalの利用 ◦ 勘定系システムではDecimalを使う ◦

    MySQLなどはdecimal型をサポートしているので、そのままdecimalとして保存 ◦ Decimalを利用する際は、インスタンス作成時にも一度もfloatを介さないように注意 ▪ 直接小数点の数値を与える場合はstrとして与える 34 @sh0nk0
  14. Swagger UI • ビジネスメンバーが使うツールとしても活用 ◦ 以下のような操作が、非エンジニアでも簡単に(意外と)扱える ▪ セレクトボックスによるパラメータの指定 ▪ ファイルのダウンロード

    ▪ パラメータやエンドポイントに 自由に説明が加えられる 現実 37 「こいつ…動くぞ!」 (非エンジニアでも動かせる) 自動生成されるAPIドキュメント(Swagger UI)により、 FastAPIは「業務を支えるツール」にもなり得る @sh0nk0
  15. 非同期化 • asyncioを使った書き方ではないコードでも十分本番環境でパフォーマンスを出 すことができる ◦ FastAPIはasyncioを使わずとも、”よしなに” threading処理をやってくれる ◦ asyncioを使う場合はIOバウンドな処理(DBや他のAPIへのアクセス)を伴うシーンだけで十分 •

    代替策:インフラの力を借りる ◦ SUSTENではAmazon ECSを使っているが、アクセス増への対策としてはコンテナの Auto Scalingによる富豪的なリソース確保で十分対応できている ECS Task #1 ECS Task #2 ECS Task #3 ・・・ 現実 40 @sh0nk0
  16. 非同期化 • asyncioを使った書き方ができていないコードでも十分本番環境で パフォーマンスを出している ◦ FastAPIはasyncioを使わずとも、”よしなに” threading処理をやってくれる ◦ asyncioを使う場合はIOバウンドな処理(DBや他のAPIへのアクセス)を伴うシーンだけで十分 •

    代替策 ◦ SUSTENではAmazon ECSを使っているが、アクセス増への対策としてはコンテナの Auto Scalingによる富豪的なリソース確保で十分対応できている ECS Task #1 ECS Task #2 ECS Task #3 ・・・ 現実 41 これからFastAPIを導入する場合は 今後のメンテコストと照らし、asyncioを使うのか検討 使う場合は無理に全体で対応せず、バランスを見るのがGood 「非同期化はFastAPI導入のハードルにはならない」 FastAPI公式docより引用 @sh0nk0
  17. まとめ • イマドキの金融システムは ”普通の” Web技術の結晶でできている ◦ レガシーじゃないよ! 電子決済系、仮想通貨系以外でも FinTech屋はいます •

    FastAPIを駆使すれば、様々な業務の効率化ができる ◦ 例えばSwagger UIでの業務支援 • Pythonでも、型ヒントとFastAPIのバリデーション、静的解析ツールなどを有効活用 し適切なテストを書けば、「ミッションクリティカル」な世界でも十分戦える • 型ヒントにしろ非同期化にしろ、「完璧を求めすぎない」がFastAPIとうまく付き合うコ ツ 44 @sh0nk0
  18. Dockerと開発環境 • Local環境はdocker composeを利用 • デプロイ環境はAWSを利用 ◦ 開発・ステージング・本番環境ではPull Requestマージをトリガーにして、Github ActionsによりECRにDocker

    imageをpushしたのち、ECSにデ プロイ(CD) ◦ 本番環境は「検証されたイメージをデプロイする」方針により、ステージング環境のDockerイメージを指定してデプロイ 開発環境 ECR staging/ 本番環境 ECR Local環境 Github Actions Github Actions
  19. 監視の現実 • Datadogインテグレーション ◦ サイドカーによって実現 ▪ 1. ECSの同一タスク上にDatadog Agent用のコンテナを立てる ▪

    2. FastAPIアプリ側にインストールしたトレーサーライブラリ( dd-trace)がDatadog Agentに プロファイルを送信 ▪ 3. AgentはDatadog上で表示できるアプリのトレース情報および環境情報を送信 Amazon ECS ECS Task FastAPI Appコンテナ (ddtraceインストール済 み) Datadog Agent コンテナ トレース ・ログ 情報 アプリ ・環境情報 ① ② ③
  20. ユニットテスト • ユニットテストでクオリティを担保するのは重要 • 基本的な「同値クラス分割」や「境界値分析」に基づくテスト • 金融の世界での具体例 ◦ 生年月日周り ▪

    口座開設には厳密な年齢制限がある ◦ NISAの枠管理 ▪ 年間の投資額には上限がある ◦ 休日のチェック ▪ 世界の株式市場は複数あるので、市場の休日は OR条件で判断しなければならない