Slide 1

Slide 1 text

ネイティブ開発とAWSと川の話 Gunosy  Inc. 2016.03 @y_̲matsuwitter

Slide 2

Slide 2 text

2 ©Gunosy  Inc. ⾃自⼰己紹介 n Gunosy  Inc. – 開発本部執⾏行行役員 n 業務 – 開発全般のマネジメント – Go⾔言語布教係 – パフォーマンスチューニング – ISUCONとか好きです n 担当 – 右⼿手でiOS、左⼿手でAndroid – Web – Infrastructure(AWSのみ) n 最近の興味 – ViveとOculus製品版買いました 松本 勇気 @y_̲matsuwitter

Slide 3

Slide 3 text

3 ©Gunosy  Inc. 今⽇日の話 n ⾃自⼰己紹介 n 背景 – 直⾯面している問題 n サーバに近づくネイティブアプリ – サーバレスアーキテクチャの話 – 変わるサーバとクライアントの境界線 – AWSとネイティブ開発 – モバイルで使えるAWSの話 n AWSの川を引く – 複雑なHTTPこそStreamを – iOS/AndroidでのAWSと川 現在の新規プロジェクトでのネイティブ開発の考え⽅方について

Slide 4

Slide 4 text

4 ©Gunosy  Inc. <注意> ネイティブ開発の話をしますが AWSの話が沢⼭山登場します

Slide 5

Slide 5 text

5 ©Gunosy  Inc. 背景

Slide 6

Slide 6 text

6 ©Gunosy  Inc. 背景 新規プロジェクトとして、今できるより良良いアーキテクチャを模索索 n 2016年年夏にはサービスインの予定 – プロジェクトとしては⽐比較的⼤大規模 n 開発のコアチームは5名 – 全員が領領域超えて開発 n チームのモットー – 少⼈人数で最⼤大の成果を KDDI様との連携で新規にメディア事業プロジェクトを開始

Slide 7

Slide 7 text

7 ©Gunosy  Inc. サーバに近づくネイティブアプリ

Slide 8

Slide 8 text

8 ©Gunosy  Inc. サーバレスアーキテクチャについて SaaSを活⽤用しつつ、サーバを持つことなく各種のイベントを処理理する仕組み。 ⾃自社サーバ mobile client ログ収集 サーバ DB ファイル サーバ HTTP サーバ API Gateway AWS  S3など ログ収集 サービス AWS  Lambda など

Slide 9

Slide 9 text

9 ©Gunosy  Inc. クラウド事業者にスケールするための責務を渡せる 1 重要なビジネスロジックに集中 3 サービス管理理に伴う⼈人的なリソースを減らすことが可能 2 サーバレスアーキテクチャのメリット n ユーザーの増加に対して、サーバを増強するなどの責務はクラウド事業者側。 – スケーラビリティにシビアになる場⾯面が減る。 n セキュリティなどもクラウド事業者側で担保可能。 n サーバを管理理するにもエンジニアのリソースが必要。 – インフラ管理理を減らし、少⼈人数でスケールさせる。 n ⼈人の採⽤用が組織にとって最も難しい問題 – 必要なエンジニアをより少なく保ち、開発を加速できる。 n サーバのセットアップや、⼀一般的なユーザー認証などは外部サービスで担保。 – 開発すべき重要なロジックに集中できる。 n ネイティブ開発者だけでもある程度度のロジックを担保可能。 – モバイル側のSDKも充実しており、ネイティブ側で様々なロジックを簡単に。 「少⼈人数で最⼤大の成果」という今回の⽬目標に合致 ⼈人的リソースを抑えつつ、スケールするサービスを構築できる。

Slide 10

Slide 10 text

10 ©Gunosy  Inc. 変わるサーバとクライアントの境界線 SaaSとの連携で、クライアントサイドで処理理可能な領領域が増えている。 以前 これから サーバサイド クライアントサイド サーバサイド クライアントサイド ユーザー 認証 データ 永続化 データ 解析 ログ収集 UI ⼊入⼒力力値 検証・送信 UI ⼊入⼒力力値 検証・送信 ユーザー 認証 ログ収集 データ 永続化 データ 解析 各リソース への認可 各リソース への認可

Slide 11

Slide 11 text

11 ©Gunosy  Inc. AWSとネイティブアプリ 現状のプロジェクトではAWS SDKを最⼤大限活⽤用 Amazon   Kinesis Amazon Cognito Amazon SNS Cognito AWS  SNS Kinesis ユーザーの認証、AWS系のサービスへの認証・認可、設定値のアプリ間同期など。 モバイル通知(APNS、GCM)のトークンを管理し、通知送信などを可能にする。 様々なイベントデータを送信、一定量をKinesisに保持し、ストリーム処理に繋げる。 Amazon   Mobile   Analytics MobileAnalytics AWSが提供するモバイルサービスの分析サービス。

Slide 12

Slide 12 text

12 ©Gunosy  Inc. モバイルで使えるAWS: Cognito 認証系を代替し、設定値を保存できるCognitoを活⽤用 n 主にユーザー認証とデータ同期、認可を担当 – 個々のAWSリソースに対する認可 – クライアントから直接AWSとやり取り するために必須とも⾔言える n Cognito Identity – ユーザーの認証を担当する機能 – OpenID ConnectやTwitter,  Facebook を使ってユーザー認証が可能 – 匿匿名ユーザーという権限も存在 n Cognito Sync – 同⼀一ID間でのデータ同期の仕組み – 端末間同期できるNSUserDefaultsや SharedPreferenceの様なもの ・ID ・認証キー ・データ同期 その他のAWS系 サービスとの通信

Slide 13

Slide 13 text

13 ©Gunosy  Inc. モバイルで使えるAWS: SNS 通知のトークンの取り回しと通知送信を容易易にする。 n APNS・GCMも送信可能な通知サービス – デバイストークンを登録 – EndpointArnというトークン単位のIDで GCMとAPNSを透過的に扱える n メトリクスの確認が可能 – 送信数、失敗数などの確認 – 死んだトークンについてもログ出⼒力力可能 n 何が嬉しいか – 1000万件の通知でも安定して短時間に 送ることが可能 – デバイストークンの処理理の⾯面倒を減らせ る ・EndpointArn ・通知の送付 ・通知用トークンの 送付 ・GCM ・APNS 管理者 メトリクス

Slide 14

Slide 14 text

14 ©Gunosy  Inc. モバイルで使えるAWS:Kinesis サービス改善で命となるログを、クライアントから直接投げる。 n ⼤大量量のログを受け取り処理理するための受け⽫皿 – 同時処理理性能を簡単に増減させられる – 24時間分のログを溜溜める n 主にStream処理理、ログの1次加⼯工に利利⽤用 – Kinesisのログを逐次その他システムで 処理理する – 例例1:ログを加⼯工してS3に永続化 – 例例2:逐次的にログ集計、短時間でサー ビスに反映する n 何が嬉しいか – ログデータの安定した配送を簡単に実現 できる – Kinesisの関連プロダクトとの連携が将 来⾒見見込める ・行動ログ ・属性ログ …etc S3に対して ログを保存 EMRからログの分析

Slide 15

Slide 15 text

15 ©Gunosy  Inc. とはいえデメリットは? 学習コスト サービスならではのハマリポイント Native以外の領領域を知る必要性 これまで悩まなかった問題の噴出 n AWSなどの知識識を深く求められる – Credentialとは? – SecurityGroupとは? – …etc n SDKに対する学習 – どのSDKも⽐比較的⼤大きい n AWSのハマリポイント – リソースへのアクセス許可など n イベントドリブンなシステム – ⾮非同期的なデータ処理理である前提 で対応する必要がある 新たな知識識領領域を求められることによるコストは避けられない 学習コスト、サービスならではのハマリポイントなどに苦しむ場合も。

Slide 16

Slide 16 text

16 ©Gunosy  Inc. AWSの川を引く

Slide 17

Slide 17 text

17 ©Gunosy  Inc. 川とは 〜~ReactiveProgrammingの話〜~ ストリームを宣⾔言していくスタイルを(⼀一部で?)川を引くと呼んでいる n イベントとイベントの関係性を定義していく ことで処理理を綴る – イベントが流流れるストリーム同⼠士を map,  merge,  filterなどを通じて定義し ていく n ViewとViewModelをBindするようなMVVM 設計によく利利⽤用される n 代表的なライブラリ – Rx系(RxJava,  RxSwift…etc) – その他(ReactiveKit,  SwiftBond…etc) 簡単に⾔言うと、イベント同⼠士の関係を定義して記述・動作する技術スタック群 クリック イベント API通信 UI描画 必要なイベントをfilterしたり 要求に応じて複数に増やしたり

Slide 18

Slide 18 text

18 ©Gunosy  Inc. SaaSとの連携と川の話① AWSにかぎらず、SaaSとの連携には多くのHTTPリクエスト・⾮非同期処理理 CognitoID を取得 AWSの認可 取得 MobileAnalytics の初期化 Kinesisの 初期化 DeviceTokenの 取得 SNSにTokenを 保存 ログ送信 ⾃自社のコンテン ツ取得 UIを描画 ごくごく簡単なアプリ起動に至るフロー事例 複数のAPIリクエスト の完了了を待つ

Slide 19

Slide 19 text

19 ©Gunosy  Inc. Observable SaaSとの連携と川の話② GunosyではiOSでReactiveKit、AndroidでRxJavaを活⽤用 CognitoID を取得 AWSの認可 取得 MobileAnalytics の初期化 Kinesisの 初期化 DeviceTokenの 取得 SNSにTokenを 保存 ログ送信 ⾃自社のコンテン ツ取得 UIを描画 n ⾮非同期処理理をObservableでWrapする n Observeしてイベントを各Observable に繋いでいく n 必要に応じてcombineLatestなどで川を まとめる

Slide 20

Slide 20 text

20 ©Gunosy  Inc. 例例:CognitoのID 単純なIDの取得も、場合によってはHTTPリクエストが発⽣生する。

Slide 21

Slide 21 text

21 ©Gunosy  Inc. 例例:CognitoのID ObservableでWrapしよう! ついでにNetworkOnMainThreadExceptionも避ける

Slide 22

Slide 22 text

22 ©Gunosy  Inc. まとめ

Slide 23

Slide 23 text

23 ©Gunosy  Inc. まとめ サーバの領領域にネイティブ開発者が積極的に関わることで新たな最適解が⾒見見 えてくるかもしれない! NativeとServerの垣根を超えて、よりよいサービスを作ろう! サーバレスアーキテクチャとNative 外部SDKの川を引く n 巨⼈人の肩に乗る – サービスのスケールやセキュリテ ィなどを巨⼈人に任せる n ネイティブ開発者も積極的に関わろう – サーバサイドは必要なロジックに 注⼒力力 – クライアントサイドの領領域は変わ りつつある n ReactiveProgrammingの恩恵 – 複雑なイベントの関係もストリー ムを使い記述しやすく n SaaSと川 – 多くのHTTPリクエストとその依 存関係を上⼿手く整理理 – イベント同⼠士の関係として記述す ることでRetryも書きやすく

Slide 24

Slide 24 text

24 ©Gunosy  Inc. Gunosyでは、より新しい技術に挑戦しつつ ビジネス成果を上げたい! そんなエンジニアを募集しています!