$30 off During Our Annual Pro Sale. View Details »

Serverless with a native application for Newspass

Serverless with a native application for Newspass

Serverless Conf Tokyoにて。

y_matsuwitter

October 01, 2016
Tweet

More Decks by y_matsuwitter

Other Decks in Programming

Transcript

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

    View Slide

  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で考えるべきこと
    ニュースパスの開発におけるモバイル開発とサーバレスの関わりについて。

    View Slide

  3. 3
    ©Gunosy  Inc.
    ⾃自⼰己紹介
    n Gunosy  Inc.
    – 新規事業開発室 執⾏行行役員
    n 業務
    – 開発全般のマネジメント
    – Go⾔言語布教係
    – パフォーマンスチューニング
    – ISUCONとか好きです
    n 担当
    – 右⼿手でiOS、左⼿手でAndroid
    – Web
    – Infrastructure(AWSのみ)
    n 最近の興味
    – VR/AR/MR
    松本 勇気 @y_̲matsuwitter

    View Slide

  4. 4
    ©Gunosy  Inc.
    株式会社Gunosy  – 「情報を世界中の⼈人に最適に届ける」
    Gunosyは 情報キュレーションサービス「グノシー」と
    2016年年6⽉月1⽇日にKDDI株式会社と共同でリリースした
    無料料ニュース配信アプリ「ニュースパス」を提供する
    会社です。「情報を世界中の⼈人に最適に届ける」を
    ビジョンに活動しています。
    ネット上に存在するさまざまな情報を、
    独⾃自のアルゴリズムで収集、評価付けを⾏行行い
    ユーザーに届けます。
    情報キュレーションサービス
    「グノシー」
    200媒体以上のニュースソースをベースに、
    新たに開発した情報解析・配信技術を⽤用いて⾃自動的に
    選定したニュースや情報をユーザーに届けます。
    無料料ニュース配信アプリ
    「ニュースパス」

    View Slide

  5. 5
    ©Gunosy  Inc.
    最近の社内サーバレス事例例
    新規開発にて多くの部分にサーバレスを適⽤用しています
    n ニュースパス
    – システム間の糊付け的部分
    – AWS  Mobile  SDK活⽤用でのサーバレス
    n 監視
    – LambdaからSlackへの通知系
    n インターン企画
    – ハッカソンの評価システムをLambdaで
    構成
    – 40⼈人以上の参加者が使うベンチマーカー
    がたった  $3!!
    ニュースパスの開発や、監視、インターン企画などにて活⽤用中。

    View Slide

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

    View Slide

  7. 7
    ©Gunosy  Inc.
    モバイル開発がなぜサーバレスに⾄至ったか

    View Slide

  8. 8
    ©Gunosy  Inc.
    これまでのサーバの責務とモバイルの区分
    クライアントはあくまでViewとしての役割。殆どのロジックはサーバサイド
    で担保していた。
    バックエンド
    クライアントアプリ
    データの永続化
    認証・認可
    ビジネス
    ロジック
    ユーザーイベン
    トの受け取り
    データ
    API送付
    ログストリーム
    の処理理
    通知配信
    データ配信
    データ
    API送付
    ログ分析
    データの
    キャッシュ

    View Slide

  9. 9
    ©Gunosy  Inc.
    課題
    100台のサーバ vs 1000万台のモバイルの世界での適切切なリソース運⽤用課題
    CPU・メモリリソース

    サブシステムの認証認可問題

    プラットフォーム間の差分の吸収

    n ログの加⼯工処理理など多くのCPUを要する処理理がサーバサイドで⾏行行われている
    n 処理理⾃自体はそれほど複雑ではなく、とにかく分散したい処理理
    n 概念念としては共通だが、インターフェースがiOSとAndroidで異異なるものの扱い。
    n 例例としてPush通知のトークンの扱いなど
    n マイクロサービスとなってくるとどこのリソースにアクセス可能にするかの管理理が
    必要
    クライアントの種類・台数のスケールの難しさを吸収し、
    端末のマシンリソースを活⽤用したい

    View Slide

  10. 10
    ©Gunosy  Inc.
    サーバレスの始まりとモバイルの役割の変化
    SDKを通じて、クライアントサイドのマシンリソース・ロジック実装の活⽤用
    n クライアントから直接扱える領領域の拡⼤大
    – 認証認可
    – ログ配送
    – Etc…
    n ロジックをクライアントで吸収する
    – プラットフォームの差を吸収して通知を
    実現する
    n クライアントのリソースを活⽤用する
    – 画像処理理やデータ加⼯工など
    多くの「よくあるビジネスロジック」を肩代わりするツールの登場。
    Amazon  
    Kinesis
    Amazon
    Cognito
    Amazon
    SNS
    クライアントアプリ

    View Slide

  11. 11
    ©Gunosy  Inc.
    グノシーとニュースパスの責務の持ち⽅方⽐比較
    多くのロジックの配置がクライアントに置かれる実装へ。
    ほぼ同じ⽬目的のサービスで、ニュースパスはサーバレスを活⽤用した責務配分に。
    ログ配送
    ログ集計
    ニュース
    配信
    ニュース
    推薦
    通知管理理
    UI
    通知配信
    AWSへの
    認可
    ログ配送
    ログ集計
    ニュース
    配信
    ニュース
    推薦
    通知管理理
    UI
    通知配信
    AWSへの
    認可
    グノシー ニュースパス
    水色が
    クライアントの責務

    View Slide

  12. 12
    ©Gunosy  Inc.
    Cognito・SNS・Kinesisを使ったモバイル開発

    View Slide

  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リソースに
    対して認証

    View Slide

  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経由で配信

    View Slide

  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に対して通知送付

    View Slide

  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へ

    View Slide

  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

    View Slide

  18. 18
    ©Gunosy  Inc.
    結局サーバレス以前の課題は
    解決できたのか?

    View Slide

  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のツール群の利利⽤用で様々な運⽤用に変化。

    View Slide

  20. 20
    ©Gunosy  Inc.
    ただし、Server”less”とはいえど
    時には雲の上のことも考えよう

    View Slide

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

    View Slide

  22. 22
    ©Gunosy  Inc.
    AWS Cognitoを扱う上で考えるべきこと
    AWSの提供機能と⾃自前で持つ部分の間で、データを重複させない。
    n Cognitoは多くの機能を提供している
    – 認証
    – ユーザー管理理 (User  Pool)
    – 認可(IAM role)
    – 設定値補完(Cognito Sync)
    n ⾃自前でユーザーを持つのか、全てを任せるの
    かの線引
    – ⼆二重管理理を始める管理理フローが複雑化
    n 必要とする機能を⾒見見極める事が必要
    AWSへの認可を求めるのか、アカウント管理理を求めるのか判断する。
    Amazon
    Cognito
    バックエンド
    ・AWSへの認可管理
    ・サインイン
    サービス上の
    ユーザー
    これらはどう関係するか?

    View Slide

  23. 23
    ©Gunosy  Inc.
    ユーザーの単位

    その他のライフサイクル

    SNSログイン

    AWS Cognitoとアカウントライフサイクル
    n CognitoにおけるUnauthorized  Userはデバイス単位
    – アンインストールでも同じユーザーが維持される
    n 匿匿名の利利⽤用者に対してUnauthorized  UserのCognitoIDを認証に使うか?
    n Cognito Identityは⼀一つのアカウントに複数のユーザーをひも付け可能
    – 同じSNSアカウントを起点に複数のCognitoIDをマージすることもできる
    n 1SNSアカウント =  1ユーザーかどうか、ユーザーをひも付け変更更可能か
    n インストール・アンインストールの扱い
    – ⾃自サービスは再インストールのユーザーを如何に扱うべきか
    ユーザーライフサイクルについては、⾃自サービスと⼗十分に⽐比較すること。
    サービスの求めるライフサイクルと⼀一致しない場合の扱いを考えよう。

    View Slide

  24. 24
    ©Gunosy  Inc.
    AWS Cognitoの認可と各SDKの利利⽤用順序
    SDKの裏裏にある処理理の依存に気をつけ、どういった順序で扱うべきか考える
    n データを持たないユーザーを発⾒見見
    – KinesisやSNSのSDKを同時に初期化し
    ていた
    – 認証が複数回叩かれ、同時にいくつもユ
    ーザーが⽣生成される
    n 認証・認可の裏裏側での挙動を意識識してクライ
    アントを実装する
    – Cognitoのユーザー⽣生成が完了了してから
    各種SDKの初期化を開始
    認証・認可は⾒見見かけ上同期のインターフェースだが、⾮非同期。
    Cognito
    AWS  SDK
    User①作成
    初期化1回目
    2回目
    User②作成
    ローカルには
    User②が残る

    View Slide

  25. 25
    ©Gunosy  Inc.
    AWS Cognito Syncの競合解決
    Cognito Syncに複雑なデータをもたせ過ぎないことも必要。
    n CognitoSyncはデータセットがsynchronize
    された際、競合する変更更があればsyncさせな

    n 適切切にハンドラを実装しローカル、リモート
    どちらの値を優先するのか、マージするのか
    、その処理理を実装する
    複数端末でSyncする際はデータセットの競合解決ロジックに責任を持つ。
    CognitoSync
    Amazon
    Cognito
    Dataset
    同じユーザー
    +  別な端末
    別々にsynchronize
    コンフリクト!!

    View Slide

  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

    View Slide

  27. 27
    ©Gunosy  Inc.
    AWS SNS、古いEndpointの扱い
    通知の配送は時間がかかりやすいため、可能な限り無駄を減らす
    n 通知に必要なトークンは変化しうる
    – 特にAndroidはGCMトークンの変化が激
    しく、簡単に死んだEndpointが発⽣生し
    ていく
    n クライアントサイドで古いトークンに対応す
    るEndpointを削除する
    SNSの運⽤用の⾯面倒はクライアントで解消すると楽
    Amazon
    SNS
    バックエンド
    新しいEndoint
    古いEndpoint
    無効なリクエスト
    新しいトークン
    の受け取り
    古いEndpointの削除
    Endpointの作成

    View Slide

  28. 28
    ©Gunosy  Inc.
    まとめ

    View Slide

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

    View Slide

  30. 30
    ©Gunosy  Inc.
    Gunosyでは
    新しいアーキテクチャに挑戦しつづける
    仲間を募集しています!!

    View Slide