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

サーバーレスで作るモバイルアプリ向け Backend for Frontend / serverless_bff

サーバーレスで作るモバイルアプリ向け Backend for Frontend / serverless_bff

AWS DevDay Tokyo 2019 で発表したセッションです。

【概要】
運営期間と共に機能が増え続けるモバイルアプリでは、サーバーから取得した情報に合わせて複雑なビジネスロジックの処理を設計開発しようとすると色々な課題が出てきます。iOS, Androidでの仕様の同期問題、バックエンドAPI修正に対するアプリバージョンの考慮などに悩まされ、結果的に開発や機能の出荷スピードの低下に繋がります。
本セッションでは、こういった課題に対してBFF(Backend-For-Frontend)というアーキテクチャを用いて、小規模なチームでいかにインフラ構築・運用の手間なくバックエンドとクライアント間の連携の課題を解決するかを紹介します。API Gateway&Lambda&Serverless Frameworkを用いたサーバーレスアーキテクチャの各種技術選定の背景や、設計・開発の中で工夫した点についても説明します。

Ahmad Shiina

October 05, 2019
Tweet

More Decks by Ahmad Shiina

Other Decks in Programming

Transcript

  1. 自己紹介 • 椎名アマド • Timers inc. 共同創業者 CTO • 兼PO

    • Forbes 30 Under 30 2017 選出 • 興味関心: AWS / Security / Management / Finance • Twitter: @amado_tech
  2. Timers inc. について • 2012年創業 • 社員数40人 (エンジニア9人) • 家族アプリFamm

    & 関連事業を運営 Fammアプリ Fammママスクール Famm撮影会
  3. プロダクト開発の組織構造 Product Owner iOS Engineer Android Engineer Server Engineer Designer,

    QA, Director Product Owner Server Engineer Backlog Backlog Agile Development
  4. サーバー視点 Photos API endpoint Database /photos Videos /videos HTTP method

    GET PUT POST DELETE GET PUT POST DELETE 1 resourceにアクセスする1APIに整理できるのが望ましい
  5. 1. 品質管理の徹底 • 自動テスト(Unit test, UI test 等)の網羅によりデグレを防ぐ • API修正のたびに過去バージョンも考慮した手動テストを行う

    不可能ではないが、テストパターンの量や開発生産性を 考えるとスマートな解ではない サーバーAPI 複雑化 iOS&Android間で複雑なAPIを扱うビジ ネスロジックの分散
  6. 2. ネイティブでコード共有 • Kotlin/NativeなどでiOS&Androidともに利用できるビジネスロ ジックをライブラリ化する案 • 整理が必要なことが多い • 社内でのノウハウ不足のための技術調査コスト •

    共通ライブラリ修正時のCIフローの検討 一部で有効かもしれないが、コストが高い割に完全に幸 せにならない iOS&Android間で複雑なAPIを扱うビジ ネスロジックの分散
  7. BFFとは BFF (Desktop) BFF (Mobile) Service A Service B Service

    C • クライアントとバックエンド サービスの間に挟まるAPI層 • クライアントは直接バックエ ンドサービスを叩かずにBFFを 叩く • BFFはクライアントの要件に合 わせて最適化される ※本セッションではBFFは主にAPI Gateway的 なアーキテクチャのものを中心に話します
  8. BFFとは BFF (Desktop) BFF (Mobile) Service A Service B Service

    C BFFが各バックエ ンドサービスと 通信 クライアント サイドが管理 バックエンドが 管理 クライアントは BFFと通信
  9. BFFの目的 (2):集約・変換 • 様々なバックエンドサービス と通信してデータ集約 • さらにそれらのデータをクラ イアントに適した形に変換 • クライアントはBFFとだけ通信

    すれば集約済みのデータ群が 返ってくるので扱いやすくな る • Microserviceを多く使うケース で最適 BFF (Mobile) Service A Service B Service C
  10. 技術選定:環境 (2) (ANY) HTTP method API endpoint /{proxy+} Application •

    GET /print • GET /hoge • etc… • API GatewayはANYで全てのリクエストを受け、Lambdaは1つのExpressア プリケーションで複数エンドポイントをハンドリングするように • API Gateway + Lambdaが増えると管理運用が大変になるため、このパター ンを採用
  11. 技術選定:環境 (2) (ANY) HTTP method API endpoint /{proxy+} Application •

    GET /print • GET /hoge • etc… • 本来はあまり綺麗ではない設計かもしれないが、生産性・管理 しやすさ・今後増えるであろうエンドポイント数の規模を考え ても妥当と判断
  12. 認可・認証 BFF API Backend API • API Gateway の API

    keyとともにBackend API用のトークンもリク エストで渡している • つまり現状この構成はBackend APIに密結合な設計である • 現状弊社にはほとんどMicroserviceがないのでこれで足りている が、今後BFFから他Microserviceをコールする際には認証の見直 しが必要 API Key Token
  13. Test/CI/Deploy • テストは Jest を利用 • develop/master に merge されたらCircleCI経由でそれぞれデプロ

    イが走る • serverless CLI の deploy コマンドがあるのでCIも簡単に構築 • CircleCIのIAM設定を忘れずに master jest tsc serverless deploy