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サービス開発についてまとめております。

Avatar for Susten Capital Management Inc.

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条件で判断しなければならない