Wantedly API Gateway速習会

  • Wantedlyで各週で速習会をやっています

    • 外部に公開していく、ということで社外の方にも参加してもらっています
  • AWS LambdaとAPI Gatewayから、その上のServerless Frameworkへ

  • 講師

    • Yohei Sugigami
    • WantedlyでiOSエンジニアやってます
    • Advent CalendarでServerless記事を書きました
  • 環境準備5分、Lamba/API Gatewayの説明15分、ワークショップ20分、Serverless説明5分・WS40分

Lambdaとは

  • クラウドコンピューティング
    • 計算資源がネットの向こうにある
    • Lambda Functionをデプロイするだけで動作
  • 開発チームは本質的なプロダクトの開発にフォーカスできる

    • 運用上のコストがコードだけに
  • 利用可能言語

    • node.js 0.10.36
    • Java8
    • Python2.7
  • 制限

    • 最大300秒
    • 50MB
    • 入出力6MB
    • メモリ1.5GB
  • 実行方法

    • AWS SDK Lambdaから実行
    • API Gateway->HTTPリクエストで実行
    • Lambdaスケジューラでcron実行
    • イベント実行(S3などなど)
  • 1秒あたり数千リクエストまで自動スケール
  • 無限呼び出し防止
    • 同時実行数がデフォルト100で制限
    • 変更可能
  • Lambdaコードのロード
    • リクエストを受けてからロードに数秒掛かる、外部ライブラリがあると著しく遅くなる
    • AWS-SDKとnode.jsはプリロード
    • しばらくは再利用される
  • 価格
    • 処理時間×メモリ確保量+データ転送
    • 100ms単位
    • 128MB~1536MB
      • RAMに比例してCPUもUP
    • 128MB*100万回→0.2USD
    • 1GB*100万回→1.68USD
    • Hello worldのjsで30MBくらい
    • 無料枠: 100万回・400000GB /月
      • 1年たっても無料枠が消えない
  • Pros
    • 安価
    • リクエスト単位なので、デプロイ自体はタダ
      • 環境いくら用意してもかからない
    • 運用メンテコストが低い
    • 自動スケール、限界が高い
  • Cons
    • ロード遅延
    • API活用の情報が少ない
    • AWS CLI・コンソールだけの開発はつらい
  • した2つはServerlessで解決できそう
  • ユースケース

API Gateway

  • 簡単にAPIの作成、配布、保守、監視、保護が行える
  • プロキシみたいな
  • 基本機能
  • オプション
    • DDoS検知・スロットリング
    • 1secあたりのリクエストリミットを定義できる
    • スキーマ定義→SDK自動生成
      • iOS/Android向けのものがさくっと
      • Swagger連携可能
    • IAM認証
    • Cognito
  • 値段
    • 100万回で4.25USD
    • 10TB分まで0.14USD/GB、以降割引(CFと同じ)
    • キャッシング(オプション) 0.5GBは0.2USD/月

Serverless

  • '15 8月にJAWS
  • '15 12月にissueを全部無視して、下位互換のないServerlessにリニューアル
  • 3日前に0.1.0リリース、0.0系とのマイグレーションができないくらい破壊的変更があった
  • 互換についてはかなりアグレッシブ

Project Structure

  • _meta
    • resources ... CFnテンプレート
    • variables ... STG環境での設定など
  • admin.env
    • AWScreds
  • package.json
    • デプロイするときのライブラリ
  • s-project.json
    • Lambdaの設定 メモリ容量など

ロジック

  • handler.jsでなく、lib/配下
  • エンドポイント複数について、なるべくLambdaは同じ方がキャッシュが利きやすい
    • データが大きすぎるとロードが長くなるのでバランスを見て
 3818  2016-01-21 19:34  npm i -g serverless
 3820  2016-01-21 19:37  serverless
 3821  2016-01-21 19:37  serverless -v
 3822  2016-01-21 20:03  serverless project create
 3825  2016-01-21 20:04  mkdir serverless-study
 3826  2016-01-21 20:04  cd serverless-study
 3827  2016-01-21 20:04  serverless project create
 3828  2016-01-21 20:07  cd serverless-2k0ri
 3830  2016-01-21 20:09  serverless component create
 3831  2016-01-21 20:10  serverless function run nodejscomponent/api/hello
 3839  2016-01-21 20:12  serverless function create
 3845  2016-01-21 20:18  serverless function run nodejscomponent/api/fetch
 3846  2016-01-21 20:19  serverless function run nodejscomponent/api/hello
 3848  2016-01-21 20:20  serverless dash deploy
 3850  2016-01-21 20:21  serverless dash deploy
 3851  2016-01-21 20:21  serverless env list
 3853  2016-01-21 20:22  serverless env set
 3854  2016-01-21 20:22  serverless env list
 3856  2016-01-21 20:24  serverless run nodejscomponent/api/hello
 3857  2016-01-21 20:24  serverless function run nodejscomponent/api/hello
 3859  2016-01-21 20:24  serverless function run nodejscomponent/api/hello
 3860  2016-01-21 20:25  serverless set env
 3861  2016-01-21 20:25  serverless env list
 3863  2016-01-21 20:25  serverless function run nodejscomponent/api/hello
 3866  2016-01-21 20:26  serverless function run nodejscomponent/api/hello
 3867  2016-01-21 20:26  serverless dash deploy
 3870  2016-01-21 20:31  sls function run nodejscomponent/api/fetch
 3872  2016-01-21 20:32  npm i benscholler/serverless-serve -S
 3874  2016-01-21 20:33  sls serve start
  • コケた時は
    • LambdaかAPIGか、という切り分けからスタート
    • エラーメッセージが少ない、"undefined"が返ることさえある
  • まだまだServerlessはbreaking changeが起こり得る
    • おもしろい技術なのでウォッチする価値はあり
  • こういう設計のAPIが今後出てくるのではないかなと

  • APIGはパブリックです

    • EDoSを受けると多額の課金が発生する
    • 消すか、スロットリング設定ををするか、limitをかけましょう
  • serverlessは今のところdestroyはなし

  • slsはAPIG抜きのLambdaだけのデプロイにも使える

    • ちょっとでかい、という人はLambdaを送りつけるgulpを作ってる人もいる
  • 対抗WAF: apex/apex

    • goも動くよ
    • nodeからバイナリ実行させている
    • 1300スターくらい付いてる