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

Serverless with a native application for Newspass

Serverless with a native application for Newspass

Serverless Conf Tokyoにて。

05e8adce66be4e80390a29ace0075161?s=128

y_matsuwitter

October 01, 2016
Tweet

Transcript

  1. Serverless with  a  native  application  for  newspass Gunosy  Inc. 2016.10

  2. 2 ©Gunosy  Inc. Agenda モバイル開発がなぜサーバレスに⾄至ったか l これまでのサーバの責務とモバイルの区分 l 上記状態での課題 l

    Lambdaに始まるサーバレスの時代とモバイルの役割 Cognito・SNS・Kinesisを使ったモバイル開発 l Cognito、SNS、Kinesisの紹介 l 如何に組み合わせたか、解決したかった課題とは 幾つかの罠とtips l Cognitoとユーザーライフサイクルや l CognitoとLambdaのhookの関係 l AWS  SNSで考えるべきこと ニュースパスの開発におけるモバイル開発とサーバレスの関わりについて。
  3. 3 ©Gunosy  Inc. ⾃自⼰己紹介 n Gunosy  Inc. – 新規事業開発室 執⾏行行役員

    n 業務 – 開発全般のマネジメント – Go⾔言語布教係 – パフォーマンスチューニング – ISUCONとか好きです n 担当 – 右⼿手でiOS、左⼿手でAndroid – Web – Infrastructure(AWSのみ) n 最近の興味 – VR/AR/MR 松本 勇気 @y_̲matsuwitter
  4. 4 ©Gunosy  Inc. 株式会社Gunosy  – 「情報を世界中の⼈人に最適に届ける」 Gunosyは 情報キュレーションサービス「グノシー」と 2016年年6⽉月1⽇日にKDDI株式会社と共同でリリースした 無料料ニュース配信アプリ「ニュースパス」を提供する

    会社です。「情報を世界中の⼈人に最適に届ける」を ビジョンに活動しています。 ネット上に存在するさまざまな情報を、 独⾃自のアルゴリズムで収集、評価付けを⾏行行い ユーザーに届けます。 情報キュレーションサービス 「グノシー」 200媒体以上のニュースソースをベースに、 新たに開発した情報解析・配信技術を⽤用いて⾃自動的に 選定したニュースや情報をユーザーに届けます。 無料料ニュース配信アプリ 「ニュースパス」
  5. 5 ©Gunosy  Inc. 最近の社内サーバレス事例例 新規開発にて多くの部分にサーバレスを適⽤用しています n ニュースパス – システム間の糊付け的部分 –

    AWS  Mobile  SDK活⽤用でのサーバレス n 監視 – LambdaからSlackへの通知系 n インターン企画 – ハッカソンの評価システムをLambdaで 構成 – 40⼈人以上の参加者が使うベンチマーカー がたった  $3!! ニュースパスの開発や、監視、インターン企画などにて活⽤用中。
  6. 6 ©Gunosy  Inc. 今⽇日の話のスコープ 話すこと 話さないこと n クライアントサイドからみたサーバレ スの話 n

    AWS  Mobile SDKからのAWS利利⽤用を 中⼼心とした具体事例例 n そこから得られた知⾒見見 n インフラ管理理の効率率率化 n Lambdaを使ってのサーバ側実装の具 体事例例 n APIゲートウェイを使ってのWebサー バ開発など サーバレスアーキテクチャをクライアント視点で体験した話になります。
  7. 7 ©Gunosy  Inc. モバイル開発がなぜサーバレスに⾄至ったか

  8. 8 ©Gunosy  Inc. これまでのサーバの責務とモバイルの区分 クライアントはあくまでViewとしての役割。殆どのロジックはサーバサイド で担保していた。 バックエンド クライアントアプリ データの永続化 認証・認可

    ビジネス ロジック ユーザーイベン トの受け取り データ API送付 ログストリーム の処理理 通知配信 データ配信 データ API送付 ログ分析 データの キャッシュ
  9. 9 ©Gunosy  Inc. 課題 100台のサーバ vs 1000万台のモバイルの世界での適切切なリソース運⽤用課題 CPU・メモリリソース 1 サブシステムの認証認可問題

    3 プラットフォーム間の差分の吸収 2 n ログの加⼯工処理理など多くのCPUを要する処理理がサーバサイドで⾏行行われている n 処理理⾃自体はそれほど複雑ではなく、とにかく分散したい処理理 n 概念念としては共通だが、インターフェースがiOSとAndroidで異異なるものの扱い。 n 例例としてPush通知のトークンの扱いなど n マイクロサービスとなってくるとどこのリソースにアクセス可能にするかの管理理が 必要 クライアントの種類・台数のスケールの難しさを吸収し、 端末のマシンリソースを活⽤用したい
  10. 10 ©Gunosy  Inc. サーバレスの始まりとモバイルの役割の変化 SDKを通じて、クライアントサイドのマシンリソース・ロジック実装の活⽤用 n クライアントから直接扱える領領域の拡⼤大 – 認証認可 –

    ログ配送 – Etc… n ロジックをクライアントで吸収する – プラットフォームの差を吸収して通知を 実現する n クライアントのリソースを活⽤用する – 画像処理理やデータ加⼯工など 多くの「よくあるビジネスロジック」を肩代わりするツールの登場。 Amazon   Kinesis Amazon Cognito Amazon SNS クライアントアプリ
  11. 11 ©Gunosy  Inc. グノシーとニュースパスの責務の持ち⽅方⽐比較 多くのロジックの配置がクライアントに置かれる実装へ。 ほぼ同じ⽬目的のサービスで、ニュースパスはサーバレスを活⽤用した責務配分に。 ログ配送 ログ集計 ニュース 配信

    ニュース 推薦 通知管理理 UI 通知配信 AWSへの 認可 ログ配送 ログ集計 ニュース 配信 ニュース 推薦 通知管理理 UI 通知配信 AWSへの 認可 グノシー ニュースパス 水色が クライアントの責務
  12. 12 ©Gunosy  Inc. Cognito・SNS・Kinesisを使ったモバイル開発

  13. 13 ©Gunosy  Inc. AWS Cognito 全てのAWS SDK内認証・認可の基盤として利利⽤用。 n ユーザーのAWSリソースへの安全なアクセス の確保

    – 内部で利利⽤用しているKinesisやSNSへの アクセスをIAM  Roleで絞ることができ る n CognitoSyncとLambdaを組み合わせて設定 値をElasticsearchに保存 – SNS・SQSを組み合わせて更更に多くの処 理理を同時実⾏行行可能 n 利利⽤用していないが、メールアドレスによる登 録とDB管理理も可能 AWSサービスへの認証認可・及びremoteとsync可能なkey-‐‑‒value  store. Cognito Idenitity Sync Lambda 設定値の保存 AWSリソースに 対して認証
  14. 14 ©Gunosy  Inc. Cognitoを使ったピタゴラスイッチ 設定値を配信⽤用のElasticsearchに保存する流流れをサーバレスに実現。 Amazon Cognito Mobile  Client 設定値

    Push:  有効 トークン:  aaaa … Push  System CognitoSyncで LocalとAWS上 を同期 AWS Lambda Queue On  SQS Amazon SNS Syncイベントをフック Pushシステム側で Dequeue =>  DB登録 Amazon  Elasticsearch Service Amazon SNS Mobile  Puh SNSのエンドポイント登録 無効なトークンの削除 Amazon SNS Mobile  Puh PushをSNS経由で配信
  15. 15 ©Gunosy  Inc. AWS SNS サービス改善の要をAWSを通じてプラットフォームを気にせず運⽤用できる。 n iOS/Androidのトークンの扱いの違いや配信 ⽅方法の違いを吸収 –

    最終的にSNS Endpointに変換して利利⽤用 している n 通知の配信サイドもSNS  Endpointの扱いの みで済む – ⼀一部、追加のペイロードなどは配信側責 務で対応必要 プラットフォームの間の差異異をクライアントで吸収し扱う。 Amazon SNS iOS Android APNSのトークンを SNS  Endpointへ GCMのトークンを SNS  Endpointへ バックエンド SNS  Endpointとして 送信・保存する SNSに対して通知送付
  16. 16 ©Gunosy  Inc. AWS Kinesis スケーラブルで扱いやすいログ収集をKinesisで。 n 全てのアクションをログ定義してクライアン トから直接Kinesisへ配送 –

    ⾃自前のサーバを介すことはない n ストリーム集計は、KinesisからSpark   Streamingを介して集計。 – (Tokyo  RegionにKinesis  analytics欲 しいです…) n バッチ集計はKinesisからLambdaとS3を通 じてPrestoに導いている アプリ内、すべてのイベント収集に利利⽤用。 Amazon   Kinesis AWS Lambda ログ用S3 Amazon  EMR Spark  Streaming Amazon RDS Prestoへ
  17. 17 ©Gunosy  Inc. AWS Kinesis with  Puree 再送設定やバッファリングなど必須機能をKinesisとともに簡易易に導⼊入。 n iOS/Android双⽅方向けにライブラリあり

    n クライアントサイド向けログコレクタ – fluentdと似た機構をもち、イベントを 適宜バッファリングしつつ⾮非同期送信 n ⾃自⾝身でOutputPluginを書く – Google  Analyticsなどツールへの送信 – 指定のログごとに違うストラテジでログ を送ることが可能 Cookpad社製のクライアント向けログコレクタを利利⽤用し、ログを効率率率的に運⽤用。 event event event Puree Kinesis Filter Buffering fail Retry
  18. 18 ©Gunosy  Inc. 結局サーバレス以前の課題は 解決できたのか?

  19. 19 ©Gunosy  Inc. 過去と今 過去 現在 リソース運⽤用 Platform 差分運⽤用 認証・認可

    n ログコレクタを⽤用意し、APIか ら⼤大量量のログを配送、管理理 n サーバ側で都度度ロジックを実装 し、Platformの変化に追随 n Gatewayやその裏裏のシステムが 認証基盤とやり取りし制御 n クライアントサイドで直接ログ の加⼯工や配送など実施 – Cognito +  AWS  Kinesis n それぞれのPlatform上で差分を 吸収し、サーバとやり取り – AWS SNSなどの利利⽤用 n Cognitoを利利⽤用し、IAM  Roleと 合わせてクライアントとAWSが 直接実施 多くの部分で課題が前に進んでいる AWSのツール群の利利⽤用で様々な運⽤用に変化。
  20. 20 ©Gunosy  Inc. ただし、Server”less”とはいえど 時には雲の上のことも考えよう

  21. 21 ©Gunosy  Inc. これまで遭遇した幾つかの罠とtips (主にCognito周辺)

  22. 22 ©Gunosy  Inc. AWS Cognitoを扱う上で考えるべきこと AWSの提供機能と⾃自前で持つ部分の間で、データを重複させない。 n Cognitoは多くの機能を提供している – 認証

    – ユーザー管理理 (User  Pool) – 認可(IAM role) – 設定値補完(Cognito Sync) n ⾃自前でユーザーを持つのか、全てを任せるの かの線引 – ⼆二重管理理を始める管理理フローが複雑化 n 必要とする機能を⾒見見極める事が必要 AWSへの認可を求めるのか、アカウント管理理を求めるのか判断する。 Amazon Cognito バックエンド ・AWSへの認可管理 ・サインイン サービス上の ユーザー これらはどう関係するか?
  23. 23 ©Gunosy  Inc. ユーザーの単位 1 その他のライフサイクル 3 SNSログイン 2 AWS

    Cognitoとアカウントライフサイクル n CognitoにおけるUnauthorized  Userはデバイス単位 – アンインストールでも同じユーザーが維持される n 匿匿名の利利⽤用者に対してUnauthorized  UserのCognitoIDを認証に使うか? n Cognito Identityは⼀一つのアカウントに複数のユーザーをひも付け可能 – 同じSNSアカウントを起点に複数のCognitoIDをマージすることもできる n 1SNSアカウント =  1ユーザーかどうか、ユーザーをひも付け変更更可能か n インストール・アンインストールの扱い – ⾃自サービスは再インストールのユーザーを如何に扱うべきか ユーザーライフサイクルについては、⾃自サービスと⼗十分に⽐比較すること。 サービスの求めるライフサイクルと⼀一致しない場合の扱いを考えよう。
  24. 24 ©Gunosy  Inc. AWS Cognitoの認可と各SDKの利利⽤用順序 SDKの裏裏にある処理理の依存に気をつけ、どういった順序で扱うべきか考える n データを持たないユーザーを発⾒見見 – KinesisやSNSのSDKを同時に初期化し

    ていた – 認証が複数回叩かれ、同時にいくつもユ ーザーが⽣生成される n 認証・認可の裏裏側での挙動を意識識してクライ アントを実装する – Cognitoのユーザー⽣生成が完了了してから 各種SDKの初期化を開始 認証・認可は⾒見見かけ上同期のインターフェースだが、⾮非同期。 Cognito AWS  SDK User①作成 初期化1回目 2回目 User②作成 ローカルには User②が残る
  25. 25 ©Gunosy  Inc. AWS Cognito Syncの競合解決 Cognito Syncに複雑なデータをもたせ過ぎないことも必要。 n CognitoSyncはデータセットがsynchronize

    された際、競合する変更更があればsyncさせな い n 適切切にハンドラを実装しローカル、リモート どちらの値を優先するのか、マージするのか 、その処理理を実装する 複数端末でSyncする際はデータセットの競合解決ロジックに責任を持つ。 CognitoSync Amazon Cognito Dataset 同じユーザー +  別な端末 別々にsynchronize コンフリクト!!
  26. 26 ©Gunosy  Inc. AWS Cognito SyncとLambdaフックの頻度度 Cognitoに限らず、隠れているhook含めて頻度度を設計する n アプリ起動時などにsynchronizeすると容易易 にLambdaの呼び出しが跳ねる

    – サービス規模によってはThrottlingが発 ⽣生し、hookが失敗する n 適切切なタイミングでsynchronizeを呼び出し ましょう CognitoSyncは変化があれば必ずLambda hookを呼び出す。 CognitoSync Amazon Cognito Dataset 多数のsynchronize AWS Lambda 毎度Invoke
  27. 27 ©Gunosy  Inc. AWS SNS、古いEndpointの扱い 通知の配送は時間がかかりやすいため、可能な限り無駄を減らす n 通知に必要なトークンは変化しうる – 特にAndroidはGCMトークンの変化が激

    しく、簡単に死んだEndpointが発⽣生し ていく n クライアントサイドで古いトークンに対応す るEndpointを削除する SNSの運⽤用の⾯面倒はクライアントで解消すると楽 Amazon SNS バックエンド 新しいEndoint 古いEndpoint 無効なリクエスト 新しいトークン の受け取り 古いEndpointの削除 Endpointの作成
  28. 28 ©Gunosy  Inc. まとめ

  29. 29 ©Gunosy  Inc. まとめ n モバイルで分担できるロジックの領領域が増⼤大している – AWS Mobile  SDKなどを使って多くの責務をクライアントでも

    担当可能になってきた – ユーザーのCPUも含めてスケールしていく n AWSの活⽤用について – ニュースパスでは、SNS・Kinesis・Cognitoを主に活⽤用 – ログ配送やデータの保存などの領領域はクライアントから直接実 施可能 n 当然ですが、サーバレスも銀の弾丸ではない – 利利⽤用するサービスの仕様、そこから陥りうるであろうポイント を⾒見見つけていく必要がある – もっと知⾒見見共有し合いましょう!!! 塩梅のいいところまで組み合わせましょう、過度度の適⽤用は厳禁。
  30. 30 ©Gunosy  Inc. Gunosyでは 新しいアーキテクチャに挑戦しつづける 仲間を募集しています!!