「実践SERVERLESS」参加レポート

# はじめに
ブログの会社クラスメソッドさんとアマゾンウェブサービスジャパンさんが開催された「実践SERVERLESS」という勉強会に参加してきましたので、乱文となりますがメモを共有します。

# イベント概要
日時：2016/08/02(火) 19:00 〜 21:00
http://classmethod.connpass.com/event/35523/

# セッション
## Introducing Serverless Computing
アマゾンウェブサービスジャパン　西谷 圭介氏

### **AWSのCompute Service**
* EC2,ECS,Lambda
* それぞれ抽象化している層が違う
* Lambda -> 必要な時だけコードの実行を行いたい、インフラの構成、管理を行いたくない時に使う

### **Usecase**
* 大きくは DataProcessing と Backend と呼ばれる2パターンある

#### **DataProcessingパターン**
* Real-time File Processing
 * S3のバケット等をイベントのトリガーにしてLambda Functionで処理をしていくようなパターン
 * イメージのサムネイルの生成、ビデオ変換、ドキュメントのメタデータをDynamoDBでインデックス化、etc.
 * SNSでアップロードされた動画を解析して、問題ないかチェックした上で公開
 * PDFの透かし埋め込み処理

* Real-time Stream Processing
 * 同時多発的かつ連続的にデータが生成されるようなものをKinesisで受け取って、そのデータをLambdaで処理するようなパターン
 * クライアントのアクティビティトラッキング、IoT的な文脈で各デバイスからセンシングしたデータをKinesisに送り込んで処理
 * メジャーリーグの中継中にリアルタイムにゲーム状況を表示するサービスでこういうことをしている

* Extract, Transform and Load
 * DynamoDBに書き込まれたデータをRedshiftやS3等別のものに書き込んだり

#### **Backendパターン**
* Serverless Web and Mobile Applications
 * S3で静的コンテンツ、API Gateway + Lambdaで動的コンテンツを提供
 * データはDynamoDBに読み書きしたり
 * モバイルの場合はAPI Gateway + LambdaでAPI提供したり

* Alexaアプリ + slack = Serverless bot!
 * Alexa -> Amazon Echo の音声認識エンジンの部分
 * AlexaアプリとしてLambdaファンクションを実装可能
 * Amazon Echoで声を伝えて、Lambdaで処理してslackで通知したり

* Real Time message handling
 * SNSにメッセージを配信して、Lambdaが別のものに送ったり

* Audit CloudTrail Activity
 * S3に保存されたCloudTrailログをチェックして、怪しい行動をしている人がいたら管理者に通知

* Automated Infrastructure Management
 * CloudWatchのアラームをトリガーにLambdaを呼び出し、EC2のインスタンスを起動したり停止したり

* Forward AWS Events to External Endpoints
 * AWS上で発生したイベントをIFTTT等に送ったり

* Deploy Lambda Functions
 * Github -> SNS -> Lambdaが自身でプッシュされたコードをデプロイ

### **事例**
#### **海外**
* VidRoll
 * ターゲット広告を配信するプラットフォーム
 * RTB(Real Time Bidding)まわりなどでAPI Gatewayを利用
 * ビジネスのスケールにともなって、EC2の管理が難しくなってきた
 * 動画配信プレイヤーが、API Gateway経由でLambdaを実行する
 * 動画の変換処理にもLambdaを利用している
 * 生産性が向上して、収益が10倍になってもエンジニア追加なしでなんとかなっている

* PlayOn! Sports
 * 高校生のスポーツをライブ中継するサービス
 * S3に動画ファイルを集めて、Lambdaファンクションを並列で動かして、各解像度ごとに変換

* easy ten
 * 単語学習のアプリ
 * 120万ダウンロード
 * Lambda + DynamoDB + Kinesis + Cognito をベースとしたサーバーレスなマイクロサービスを実現

#### **国内**
* Canon
 * プリントしたいドキュメントをモバイル等から送るだけでプリントできるクラウドサービスでAPI Gateway + Lambdaを使ったマイクロサービスを採用
* 岡三オンライン証券
 * ビッグデータを使った仮想取引のサービスの、注文管理の部分にAPI Gateway + Lambdaを採用
 * 従来に比べて、設計コストが7/1、開発コストが1/10くらいになった
* リクルートジョブス
 * タウンワークでLambdaを使用
* 他にも多数


## Management Of Lambda & API Gateway
クラスメソッド 諏訪 悠紀 氏

### **サーバーレスの役割**
#### **どこをサーバーレスにするか**
* フロントエンド
 * モバイルアプリやWebアプリと通信し、データの取得や登録を行う
 * API Gateway + Lambdaがペアで使われることが多い
* バックエンド
 * ユーザの目に見える場所ではない、裏側で動くシステム(Data Processingなど)
 * SNSで何か通知されたら・S3に何かものが置かれたら・KinesisやDynamoDB Stream等で何かデータが更新されたら、Lambdaが発火
 * 他にもいろいろ、例えば<br>
     Cognito User Pools + Lambda<br>
     CloudFormationのLambda-backendカスタムリソース<br>
     Slack + API Gateway + LambdaでChatOps

### **管理方法の選定のコツ**
* ツールはたくさんあるが、ツールごとに管理する上での観点が違う

#### **選定のための4つのポイント**
* API Gatewayと併用するか、Lambdaのみか
 * API Gateway + Lambdaはフロントエンドを対象としているツール（フレームワーク意識）が多い
 * Lambdaのみを対象としているツールは汎用的で導入しやすい
* 他のリソースの管理
 * 規模が大きく管理すべきリソースが多い場合は分割したほうがよい
 * 規模が小さい場合は、分割すると煩雑になるのでまとめたほうがよい
* ロールバック
 * 対応しているツールとしていないツールがある
* 使い回し
 * そのアーキテクチャは他のサービスなどで使い回すかどうか
 * 汎用的にする必要性があるか
 * 設定値は実行時パラメータか
 * 環境変数は必要か

### **管理ツール6種使い比べ**
#### **AWS CloudFormation**
* AWSのリソースを管理するサービス
* JSONで記述
* 他のAWSリソースと一緒に管理できる
* 依存関係を定義できる
* 実行時パラメータを定義できる
* Lambdaファンクションの作成と設定
* ソースコードをインラインで記述することもできる
* イベントソースに各Streamを指定できる

#### **Serverless**
* フロントエンドとしてのサーバーレスアーキテクチャを管理するフレームワーク
* API Gateway + Lambdaをデプロイ
* 環境変数やメタデータを独自形式で管理(Lambdaに依存性のある定義をしなくて済む)
* サンプルが充実
* プラグインで独自機能を追加可能

#### **Apex**
* Lambdaに特化した管理ツール
* Lambdaに特化した機能が充実(イベントフック、DryRun、...)
* Terraform連携

#### **Gulp**
* nodejsで動くタスクランナー
* JS界ではよく使われるツール
* すでにGulpでタスク管理しているのであれば導入コストは小さい

#### **Swagger hub**
* Swaggerのクラウドサービス
* Swaggerドキュメントをブラウザで記述できる
* API Gateway & Lambdaへのエクスポートに対応

#### **Chalice(Beta)**
* awslabsで公開されている
* python限定
* gen-policyオプションで、使っているAPIが必要とするIAMポリシーを出力してくれるのが便利

#### **Flourish(Comming Soon?)**
* AWSが支援するOSSプロジェクト
* まだ公開されていない
* Swagger hub ライク

### **まとめ**
* 何を重要視するか考えよう
* 最適な管理方法を選定しよう
* いろいろさわってみよう

**※ 質問**<br>
**Q.** API Gatewayの管理に対応しているとうたっていても、結局マネジメントコンソールさわらないといけないものがいくつかある印象。そのあたりをふまえて何qか見解等ありますか？<br>
**A.** CloudFormationはAPI Gatewayも全部設定できるので個人的におすすめ。その他のツールはAWSのAPIが対応していないと対応できないので。

## 実際に使うCognito User Pools
クラスメソッド 丹内 優紀 氏

### **ServerlessとCognito**
#### **Cognitoとは**
* アプリケーションの認証・認可をサポートするフルマネージドサービス

##### **Cognito Identity**
* 外部で認証されたユーザに対して機能を提供する
* Federated Identity
 * 外部の認証サービス(google,facebook,etc.)からの名寄せ
 * 匿名ユーザとしての認証も可能
* STS
 * AWSへのアクセスキーを安全に発行する

##### **Cognito Sync**
* ユーザデータの同期機能を提供
* Sync Store
* Cognito Streams
* Cognito Events

### **Cognito User Pools**
* AWSが提供するIdentity Provider
* ユーザの登録や管理、認証を行うことができる
* パスワードやMFA、確認メールの送信など一般的なWebサービスに必要な認証機能を一通り持っている
* よく使うアトリビュート（電話番号等）は用意されているが、独自のものも設定可能
* 所定のイベントをトリガーにしてLambda Functionを実行可能
* API Gatewayでの認可に、User Poolsの指定が可能(日本リージョンはまだかも？)

### **Cognitoを実際に使うために**
* ポリシー変数
* OIDC Provider連携
* 大量リクエスト時の制限
 * 厳密なところはわからない。。
* Trust Relationship

### **まとめ**
* User Poolsで認証機能をAWSに移せる
* Cognito Identityと連携してさらにいろいろな機能をAWSに移せる
* Lambdaの話をほとんどしなかったが、これもひとつのSERVERLESSのかたちだと思っている

# 個人的なまとめ
* "実践"というタイトルのとおり、知見・経験をベースにした具体的な内容でした。SERVERLESSというキーワードについてはこんなのがあるよ的な情報は頻繁に見かけるようになったものの、今回はより実践的なお話を聞くことができてよかったです。
* Cognito User Poolsについてほぼ知らなかったのですが、こういうある程度汎化できそうだけど自分で作るとけっこう大変な機能をマネージドサービスとして提供してくれるのはとてもよいことだと思いました。