Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Serverless with a native application for Newspass
y_matsuwitter
October 01, 2016
Programming
8
10k
Serverless with a native application for Newspass
Serverless Conf Tokyoにて。
y_matsuwitter
October 01, 2016
Tweet
Share
More Decks by y_matsuwitter
See All by y_matsuwitter
Information management for a culture of speed: The story of Notion and LayerX
ymatsuwitter
4
6.2k
Monorepo on AWS
ymatsuwitter
0
41
Tech behind LayerX SaaS products
ymatsuwitter
0
1.7k
2022-10-14-geeksai
ymatsuwitter
5
2.3k
DXD2021 Insights From CTOA reports.
ymatsuwitter
1
510
What is a Tech Company
ymatsuwitter
24
11k
The future from software technology
ymatsuwitter
2
3.2k
Cloud Native and Monorepo
ymatsuwitter
2
1.5k
2019-12-12 DMM meetup
ymatsuwitter
0
2.1k
Other Decks in Programming
See All in Programming
Circuit⚡
monaapk
0
200
Writing Greener Java Applications
hollycummins
0
350
AWSとCPUのムフフな関係
cmdemura
0
480
23年のJavaトレンドは?Quarkusで理解するコンテナネイティブJava
tatsuya1bm
1
130
ECS Service Connectでマイクロサービスを繋いでみた
xblood
0
640
LIFFで動く割り勘アプリTATEKAをリリースしてみた話
inoue2002
0
260
僕が考えた超最強のKMMアプリの作り方
spbaya0141
0
180
Makuakeの認証基盤とRe-Architectureチーム
bmf_san
0
610
Workshop on Jetpack compose
aldefy
0
140
Swift Expression Macros: a practical introduction
kishikawakatsumi
2
730
Git Rebase
bkuhlmann
10
1.2k
Step Functions Distributed Map を使ってみた
codemountains
0
110
Featured
See All Featured
Statistics for Hackers
jakevdp
785
210k
The Art of Programming - Codeland 2020
erikaheidi
36
11k
Scaling GitHub
holman
453
140k
No one is an island. Learnings from fostering a developers community.
thoeni
12
1.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
22
43k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
236
1.1M
Become a Pro
speakerdeck
PRO
6
3.2k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
128
8.8k
Gamification - CAS2011
davidbonilla
75
4.1k
Rebuilding a faster, lazier Slack
samanthasiow
69
7.5k
Designing for Performance
lara
600
65k
A Modern Web Designer's Workflow
chriscoyier
689
180k
Transcript
Serverless with a native application for newspass Gunosy Inc. 2016.10
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 ©Gunosy Inc. ⾃自⼰己紹介 n Gunosy Inc. – 新規事業開発室 執⾏行行役員
n 業務 – 開発全般のマネジメント – Go⾔言語布教係 – パフォーマンスチューニング – ISUCONとか好きです n 担当 – 右⼿手でiOS、左⼿手でAndroid – Web – Infrastructure(AWSのみ) n 最近の興味 – VR/AR/MR 松本 勇気 @y_̲matsuwitter
4 ©Gunosy Inc. 株式会社Gunosy – 「情報を世界中の⼈人に最適に届ける」 Gunosyは 情報キュレーションサービス「グノシー」と 2016年年6⽉月1⽇日にKDDI株式会社と共同でリリースした 無料料ニュース配信アプリ「ニュースパス」を提供する
会社です。「情報を世界中の⼈人に最適に届ける」を ビジョンに活動しています。 ネット上に存在するさまざまな情報を、 独⾃自のアルゴリズムで収集、評価付けを⾏行行い ユーザーに届けます。 情報キュレーションサービス 「グノシー」 200媒体以上のニュースソースをベースに、 新たに開発した情報解析・配信技術を⽤用いて⾃自動的に 選定したニュースや情報をユーザーに届けます。 無料料ニュース配信アプリ 「ニュースパス」
5 ©Gunosy Inc. 最近の社内サーバレス事例例 新規開発にて多くの部分にサーバレスを適⽤用しています n ニュースパス – システム間の糊付け的部分 –
AWS Mobile SDK活⽤用でのサーバレス n 監視 – LambdaからSlackへの通知系 n インターン企画 – ハッカソンの評価システムをLambdaで 構成 – 40⼈人以上の参加者が使うベンチマーカー がたった $3!! ニュースパスの開発や、監視、インターン企画などにて活⽤用中。
6 ©Gunosy Inc. 今⽇日の話のスコープ 話すこと 話さないこと n クライアントサイドからみたサーバレ スの話 n
AWS Mobile SDKからのAWS利利⽤用を 中⼼心とした具体事例例 n そこから得られた知⾒見見 n インフラ管理理の効率率率化 n Lambdaを使ってのサーバ側実装の具 体事例例 n APIゲートウェイを使ってのWebサー バ開発など サーバレスアーキテクチャをクライアント視点で体験した話になります。
7 ©Gunosy Inc. モバイル開発がなぜサーバレスに⾄至ったか
8 ©Gunosy Inc. これまでのサーバの責務とモバイルの区分 クライアントはあくまでViewとしての役割。殆どのロジックはサーバサイド で担保していた。 バックエンド クライアントアプリ データの永続化 認証・認可
ビジネス ロジック ユーザーイベン トの受け取り データ API送付 ログストリーム の処理理 通知配信 データ配信 データ API送付 ログ分析 データの キャッシュ
9 ©Gunosy Inc. 課題 100台のサーバ vs 1000万台のモバイルの世界での適切切なリソース運⽤用課題 CPU・メモリリソース 1 サブシステムの認証認可問題
3 プラットフォーム間の差分の吸収 2 n ログの加⼯工処理理など多くのCPUを要する処理理がサーバサイドで⾏行行われている n 処理理⾃自体はそれほど複雑ではなく、とにかく分散したい処理理 n 概念念としては共通だが、インターフェースがiOSとAndroidで異異なるものの扱い。 n 例例としてPush通知のトークンの扱いなど n マイクロサービスとなってくるとどこのリソースにアクセス可能にするかの管理理が 必要 クライアントの種類・台数のスケールの難しさを吸収し、 端末のマシンリソースを活⽤用したい
10 ©Gunosy Inc. サーバレスの始まりとモバイルの役割の変化 SDKを通じて、クライアントサイドのマシンリソース・ロジック実装の活⽤用 n クライアントから直接扱える領領域の拡⼤大 – 認証認可 –
ログ配送 – Etc… n ロジックをクライアントで吸収する – プラットフォームの差を吸収して通知を 実現する n クライアントのリソースを活⽤用する – 画像処理理やデータ加⼯工など 多くの「よくあるビジネスロジック」を肩代わりするツールの登場。 Amazon Kinesis Amazon Cognito Amazon SNS クライアントアプリ
11 ©Gunosy Inc. グノシーとニュースパスの責務の持ち⽅方⽐比較 多くのロジックの配置がクライアントに置かれる実装へ。 ほぼ同じ⽬目的のサービスで、ニュースパスはサーバレスを活⽤用した責務配分に。 ログ配送 ログ集計 ニュース 配信
ニュース 推薦 通知管理理 UI 通知配信 AWSへの 認可 ログ配送 ログ集計 ニュース 配信 ニュース 推薦 通知管理理 UI 通知配信 AWSへの 認可 グノシー ニュースパス 水色が クライアントの責務
12 ©Gunosy Inc. Cognito・SNS・Kinesisを使ったモバイル開発
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 ©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 ©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 ©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 ©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 ©Gunosy Inc. 結局サーバレス以前の課題は 解決できたのか?
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 ©Gunosy Inc. ただし、Server”less”とはいえど 時には雲の上のことも考えよう
21 ©Gunosy Inc. これまで遭遇した幾つかの罠とtips (主にCognito周辺)
22 ©Gunosy Inc. AWS Cognitoを扱う上で考えるべきこと AWSの提供機能と⾃自前で持つ部分の間で、データを重複させない。 n Cognitoは多くの機能を提供している – 認証
– ユーザー管理理 (User Pool) – 認可(IAM role) – 設定値補完(Cognito Sync) n ⾃自前でユーザーを持つのか、全てを任せるの かの線引 – ⼆二重管理理を始める管理理フローが複雑化 n 必要とする機能を⾒見見極める事が必要 AWSへの認可を求めるのか、アカウント管理理を求めるのか判断する。 Amazon Cognito バックエンド ・AWSへの認可管理 ・サインイン サービス上の ユーザー これらはどう関係するか?
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 ©Gunosy Inc. AWS Cognitoの認可と各SDKの利利⽤用順序 SDKの裏裏にある処理理の依存に気をつけ、どういった順序で扱うべきか考える n データを持たないユーザーを発⾒見見 – KinesisやSNSのSDKを同時に初期化し
ていた – 認証が複数回叩かれ、同時にいくつもユ ーザーが⽣生成される n 認証・認可の裏裏側での挙動を意識識してクライ アントを実装する – Cognitoのユーザー⽣生成が完了了してから 各種SDKの初期化を開始 認証・認可は⾒見見かけ上同期のインターフェースだが、⾮非同期。 Cognito AWS SDK User①作成 初期化1回目 2回目 User②作成 ローカルには User②が残る
25 ©Gunosy Inc. AWS Cognito Syncの競合解決 Cognito Syncに複雑なデータをもたせ過ぎないことも必要。 n CognitoSyncはデータセットがsynchronize
された際、競合する変更更があればsyncさせな い n 適切切にハンドラを実装しローカル、リモート どちらの値を優先するのか、マージするのか 、その処理理を実装する 複数端末でSyncする際はデータセットの競合解決ロジックに責任を持つ。 CognitoSync Amazon Cognito Dataset 同じユーザー + 別な端末 別々にsynchronize コンフリクト!!
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 ©Gunosy Inc. AWS SNS、古いEndpointの扱い 通知の配送は時間がかかりやすいため、可能な限り無駄を減らす n 通知に必要なトークンは変化しうる – 特にAndroidはGCMトークンの変化が激
しく、簡単に死んだEndpointが発⽣生し ていく n クライアントサイドで古いトークンに対応す るEndpointを削除する SNSの運⽤用の⾯面倒はクライアントで解消すると楽 Amazon SNS バックエンド 新しいEndoint 古いEndpoint 無効なリクエスト 新しいトークン の受け取り 古いEndpointの削除 Endpointの作成
28 ©Gunosy Inc. まとめ
29 ©Gunosy Inc. まとめ n モバイルで分担できるロジックの領領域が増⼤大している – AWS Mobile SDKなどを使って多くの責務をクライアントでも
担当可能になってきた – ユーザーのCPUも含めてスケールしていく n AWSの活⽤用について – ニュースパスでは、SNS・Kinesis・Cognitoを主に活⽤用 – ログ配送やデータの保存などの領領域はクライアントから直接実 施可能 n 当然ですが、サーバレスも銀の弾丸ではない – 利利⽤用するサービスの仕様、そこから陥りうるであろうポイント を⾒見見つけていく必要がある – もっと知⾒見見共有し合いましょう!!! 塩梅のいいところまで組み合わせましょう、過度度の適⽤用は厳禁。
30 ©Gunosy Inc. Gunosyでは 新しいアーキテクチャに挑戦しつづける 仲間を募集しています!!