Jawsug chiba API Gateway

Preview:

Citation preview

モバイル✕API Gateway ときどきLambda

NRIネットコム株式会社  佐々木拓郎

2015/9/8JAWS-UG 千葉支部 Vol.5 ~秋のAWS Lambda & API Gateway 祭り!!~

佐々木拓郎

AWSの事業推進の他に モバイルチームと データ解析チームの マネジメントをしています

blog: http://blog.takuros.net twitter: @dkfj

自己紹介

もう1つ宣伝

Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく

http://amzn.to/1BLiYcO

AWSの一番分厚い本 (大容量480ページ)

もうちょっと宣伝

WEB+DB PRESS Vol.88

モバイル開発最前線 ―― ビルドもテストもデプロイも クラウドで加速! http://amzn.to/1QhqBl7

DeviceFarmの話も少し載せています

まだまだ宣伝

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

http://amzn.to/1lsJ5id

2014年 ジュンク堂書店  コンピュータ書 年間総合ランキング14位

NRIネットコム

Web周りのビジネスを専門としている会社

• Webシステムの企画・設計・開発・運用 • 24時間365日の運用体制 • デザインを重視し、ディレクター/デザイナーが多数在籍 • スマホ/タブレットも得意 • AWSをはじめとするクラウドにも力を入れている • 最近のトレンドは、デジタルマーケティング

会社の紹介

こんな会社です新しいもの好き

2015年6月

Pepper部長 入社

たまに頭を抱えています

NAOもいます

モバイル✕API Gateway ときどきLambda

アンケート

アプリケーションエンジニアとしての経験ある人? インフラエンジニアとしての経験ある人? Webサイトのシステム開発したことがある人? モバイルアプリを開発したことがある人? AWSを使ったことがある人? Lambda使ったことある人? API Gateway使ったことがある人

今日の目的

モバイルアプリの開発の実際と AWSの本気さを実感してください

モバイル・アプリとは?

ネイティブアプリ

スマホアプリWebアプリ

スマホアプリ側にアプリを実装 サーバと連携することが多い

サーバ側にアプリを実装 WebViewでアプリに表示する

モバイル サーバ

json,xml等

アプリの 実体

モバイル サーバ

HTML/CSS等

アプリの 実体実際は、両者を組み合わせた

ハイブリッドが多い

モバイル・アプリ開発の課題

アクセス急増(バースト)時のサーバサイドのスケーラビリティの問題 OSのバージョンアップ並びに端末の多様化の問題 開発期間の短期化の問題

長年、開発・運用していると幾つもの課題が顕在化

プッシュ通知によるアクセス急増(バースト)

プッシュ通知に対して、ユーザは即時にレスポンス傾向が強い メルマガ配信より、負荷が集中しやすい サーバサイドの負荷集中の問題が発生しやすい

多様化するデバイス iOS2011年 2012年 2013年 2014年

Version 5.0 6.0 7.0 8.0

Device iPhone4s iPad 3rd

iPhone5 iPad 4th iPad mini

iPhone5S iPhone5C iPad Air

iPad mini 2

iPhone6 iPhone6 plus iPad Air2 iPad mini 3

多様化するデバイス Android2011年 2012年 2013年 2014年

Version 2.3 - 4.0 4.1 - 4.3 4.4 5.0

Device

Galaxy S2 Regza Phone Arrows X

MEDIAS LTE Xperia NX

Galaxy Note Xperia SX Arrows A

AQUOS Phone EX

Galaxy note3 Nexus5

Xperia Z3 Android Wear

Nexus6 Nexus9

開発期間の短期化

2013/05 ver1.0.0 リリース ファースト 2014/02 ver1.1.0 リリース iOS7対応 2014/10 ver2.0.0 リリース デザインリニューアル 2015/02 ver2.2.0 リリース iOS8対応

開発サイクル例 間に9回リリース

間に4回リリース

間に2回リリース

ビジネス的な要件(機能追加etc)以外に、 外的要因(OSバージョンアップ、端末追加)が多く リリース頻度が多くなり、開発期間も短期化の傾向

モバイル・アプリ開発のまとめモバイル・アプリの開発は、2つの課題に集約される

サーバサイドの開発・運用・スケーラビリティ サーバサイドの開発・運用コスト アクセス集中時のスケーラビリティの問題

アプリ開発の工数増大と短期化との戦い OS/端末の多様化による開発・テスト工数の増大 短いリリース周期に対応する必要性

AWSを利用すると 何が解決されるのか?

AWSのモバイル向けサービスの歴史(一部)Amazon Cognito 2014年7月発表 認証・認可のサービス

Amazon Lambda 2014年11月発表 イベント・ドリブンなコンピュートエンジン

AWS Device Farm 2015年7月発表 クラウド上でモバイルアプリを実機でテスト

Amazon APIGateway 2015年7月発表 API作成サービス

API GatewayのWebnierを受講した時の感想

クラウドファーストから クラウドネイティブへ

AWSの標語(たぶん)

或いは、点から線へ 線から面へ

API GatewayのMock機能を利用して モバイルアプリ開発に役立てる

スタブAPIの作成(Before API Gateway)S3のWebホスティング機能を利用

{ JSON }JSONファイルの アップロード

リクエスト

レスポンス

それなりに便利。一方で、 レスポンスを変える為に、都度アップロードは面倒 レスポンスコードが、変えられない

Clientモバイル

S3 Web

スタブAPIの作成(After API Gateway)API Gatewayのモック機能を利用

{ JSON }

管理コンソールから JSONファイルの

入力

リクエスト

レスポンス

簡単・便利 Mock機能で静的JSONを返すAPIを簡単につくれる レスポンスコードも変えられる

詳細は、こちら APIGateway - Amazon API GatewayでMockを定義してみる - Qiita http://qiita.com/Keisuke69/items/0852d536110b2fa6e087

モバイル

API Gateway

AWS Management Console

API Gateway モック機能の使い方 デモ

API Gateway モック機能の使い方 1/12APIの作成

適当な名前を入力

作成

API Gateway モック機能の使い方 2/12リソース(Resource)の作成

Create Resourceを クリック

リソース名(≒URL Path) の決定

API Gateway モック機能の使い方 3/12メソッド(Method)の作成 1

①Create Methodを クリック②Methodの種類を

選択

③保存

API Gateway モック機能の使い方 4/12メソッド(Method)の作成 2

Mock Integrationを 選択して「Save」

API Gateway モック機能の使い方 5/12メソッド(Method)の作成 3

Integration Responseを クリック

API Gateway モック機能の使い方 6/12メソッド(Method)の作成 4

①ここを選択

②更にMapping Templatesを選択

API Gateway モック機能の使い方 7/12メソッド(Method)の作成 5

①application/jsonを クリック

②Output passthrough 横の鉛筆印をクリック

API Gateway モック機能の使い方 8/12メソッド(Method)の作成 6

①Mapping templateを 選択して保存

②任意のJSONを 貼り付けて「Save」

API Gateway モック機能の使い方 9/12テスト

①TESTをクリック

API Gateway モック機能の使い方 10/12テスト

①TESTをクリック

②想定のStatusで 想定のレスポンスがあればO.K.

API Gateway モック機能の使い方 11/12デプロイ

①Deploy APIをクリック

Stage nameを記入して Deploy

API Gateway モック機能の使い方 12/12デプロイ

URL/Stage名/リソース名でアクセス可能

Lambdaと組み合わせて APIの遅延を再現

API Gateway+LambdaでSlow Mockレスポンスの遅いSlow Mockを作ることでUXの調整

リクエスト

N秒後に レスポンス

Slow Mockの意義 実際のAPIのレスポンスは、遅い場合もある レスポンスの速いMockだけでUXを検討すると、後工程で困る場合がある 数秒、数十秒の遅延を与えて、UXを調整していく

モバイル API Gateway

リクエスト

レスポンス

Sleep処理

Lambda

API Gateway+LambdaでSlow MockSlow Mockの作り方

console.log('Loading function');

exports.handler = function(event, context) {

console.log('before =', new Date().getTime()); var time = 3000; var d1 = new Date().getTime(); var d2 = new Date().getTime(); while (d2 < d1 + time) { d2 = new Date().getTime(); } console.log('after =', new Date().getTime()); context.succeed("Success"); };

簡単に作るのであれば、LambdaでSleepするだけ。 API GatewayでMockを返す。 真面目に作るのであれば、引数・返却値を返すようにする

既存サービスを API Gatewayを利用して

置き換えてみた

とあるサービス

http://www.nri-net.com/mobileconf/ https://www.youtube.com/watch?v=7Rk2pL3PAXc

とあるサービスサーバサイドに資料をおいて、iPadで共有・同期

データ・処理の流れ

Webサーバ データベース

会議システム

参照ページの通知初回ダウンロード 参照ページの同期

処理を簡略化すると、次のような流れになっている

サーバ側のお守りは、それなりに手間が掛かる

AWSのサービスだけ利用して構築

IAM Role

DynamoDB (NoSQL DBサービス)

Cognito (認証・権限管理サービス)

S3 (ストレージサービス)

JavaScript SDK

DynamoDBのスループットの設定で、 システムのキャパシティを向上できる

サーバレスで楽ちん

資料のダウンロード

参照ページの通知・同期

AWS利用権限の付与

Before API Gateway

API Gatewayを利用して作ると

DynamoDB

S3

クライアント側は、全くAWSを意識せず作れる

API Gateway

Lambda

ページ番号の 参照・保存資料の

ダウンロード

WebSocketで ページ同期

ページの通知

各種APIの呼び出し

Mapping Template (最初の難関)

Mapping Templateの利用 リクエスト編

①Method Requestで、 Modelの作成

②Integration Requestで、 Mapping Templateの作成

Mapping Templateの利用 リクエスト編Modelの作成{ "operation": "update", "conference_id": 1, "page_number": 4 } {

"$schema": "http://json-schema.org/draft-04/schema#", "title": "SyncSlide", "type": "object", "properties": { "operation": { "type": "string" }, "conference_id": { "type": "number" }, "page_number": { "type": "number" } } }

元のJSON

Model

詳細は、こちら Working with Models and Mapping Templates in Amazon API Gateway http://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings.html

Mapping Templateの利用 リクエスト編Mapping Templateで引数を利用

{ "operation": "update", "conference_id": "1", "page_number": $input.json('$.page_number') }

$input.json(‘$.項目名’)で、JSONの値を代入 $input.json(‘$’)で、JSON全体を渡すことも QueryStringの場合は、$input.params('foo') その他、変数が幾つかある詳細は、こちら API Gateway Mapping Template Reference http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

Mapping Templateの利用 レスポンス編レスポンスの加工も、基本的には同じ

②Integration Responseで、 Model等を利用して整形

①Method Responseで、 Contents-Type等の定義

JSON⇒XMLに変換#set($root = $input.path("$")) <xml> <id> $root.id </id> <title> $root.title </title> </xml>

{ "id": 1, "name": "hoge" }

元のJSON

Mapping Template

出力されたXML

JSON⇒HTMLに変換その気になれば、HTMLも直接出力できる

#set($root = $input.path("$")) <html> <body> ID=$root.id<br/> Name=$root.name<br/> </body> </html>

{ "id": 1, "name": "hoge" }

元のJSON

Mapping Template

まったくお勧めしません

API Gatewayを利用してみて

個人的な感想基本的には、簡単便利 Getメソッドは簡単。Postメソッドは悩む Postの最初の難関は、Modelとのマッピング CORSなど、呼出側を考慮した情報が少ない AWS Proxyは、まだ解らないところだらけ 管理コンソールのUIは良く出来てるが、だんだん面倒くさくなる。⇒CLIに挑戦予定。そのうちFluctか? 認証周りについては、いろいろ検討中 1年後には、これしか使っていないような気がする JSONじゃないレスポンスも返すようになるのか?

ご静聴、ありがとうございました。