Slide 1

Slide 1 text

Serverless Frameworkで AWSフルマネージドなツールをいくつか作って得た アーキテクチャ設計の知⾒ - PHPカンファレンス2017 Ver - Kenʼichiro Oyama Fusic Co.,Ltd. 2017.10.8 1 PHPカンファレンス2017

Slide 2

Slide 2 text

Who 2 PHPカンファレンス2017

Slide 3

Slide 3 text

k1LoW   Kenʼichiro Oyama   @k1LoW   Fusic Co.,Ltd. エンジニア   基盤ユニット テックリード   GitHub organizations   fukuokarb / holiday-jp / faultline / emacs-jp / etc.   awspecというAWS⽤のテストツールを作ってい ます   https://github.com/k1LoW/awspec 3 PHPカンファレンス2017

Slide 4

Slide 4 text

アジェンダ   サーバーレスアーキテクチャ   Serverless Framework   Serverless Frameworkでの構築例   サーバーレスアーキテクチャで構築するときに意識す ること   “サーバーレスアーキテクチャで作る”という中で⽣きて くる設計やアイデア 4 PHPカンファレンス2017

Slide 5

Slide 5 text

Serverless Frameworkでカジュアルに 「サーバーレスにチャレンジしてみようかな」 と思ってもらうことが⽬標です 5 PHPカンファレンス2017

Slide 6

Slide 6 text

サーバーレスアーキテクチャ 6 PHPカンファレンス2017

Slide 7

Slide 7 text

サーバーレスアーキテクチャ <※諸説あります>   イベントドリブンなアーキテクチャ   AWS Lambdaや* Functionsが中⼼   サーバ単位ではなくイベント単位   スケールの単位 / 課⾦の単位 / ⽣存期間 / 管理の単 位 / 監視の単位   ステートレスに構築することでクラウドが提供するス ケーラビリティの恩恵を受けることができる ※諸説あります> 7 PHPカンファレンス2017

Slide 8

Slide 8 text

AWS Lambda   イベント単位でコンテナが⽴ち上がりfunctionが実⾏ される   CGIのようなイメージ   実⾏後のコンテナは(だいたい)破棄されるのでファ イルキャッシュなどステートレスな実装が求められる   再利⽤されることもある   ステートを持つためには他のサービスを利⽤する必要 がある 8 PHPカンファレンス2017

Slide 9

Slide 9 text

LAMPアーキテクチャと サーバーレスアーキテクチャの⽐較 9 PHPカンファレンス2017

Slide 10

Slide 10 text

LAMPアーキテクチャ 10 PHPカンファレンス2017 PHP (PHP framework) GET /index POST /create Apache MySQL public function index() public function create() Linux

Slide 11

Slide 11 text

LAMPアーキテクチャ 11 PHPカンファレンス2017 PHP (PHP framework) GET /index POST /create Apache MySQL public function index() public function create() Linux ユーザ管理領域 (OSもミドルウェアも全部管理)

Slide 12

Slide 12 text

Node サーバーレスアーキテクチャ(AWS) 12 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3

Slide 13

Slide 13 text

Node サーバーレスアーキテクチャ(AWS) 13 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon S3 Lambda function event Put S3 object Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3

Slide 14

Slide 14 text

Node サーバーレスアーキテクチャ(AWS) 14 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon S3 Lambda function event Put S3 object Lambda function scheduled event CloudWatch Event Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3

Slide 15

Slide 15 text

Node サーバーレスアーキテクチャ(AWS) 15 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon S3 Lambda function event Put S3 object Lambda function scheduled event CloudWatch Event Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3 And more events And more managed services

Slide 16

Slide 16 text

Node サーバーレスアーキテクチャ(AWS) 16 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon S3 Lambda function event Put S3 object Lambda function scheduled event CloudWatch Event Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3 And more events ユーザ管理領域 And more managed services

Slide 17

Slide 17 text

17 PHPカンファレンス2017

Slide 18

Slide 18 text

Serverless Framework   サーバレスアーキテクチャでアプリケーションを構築する ためのフレームワーク   FaaS (Function as a Service。AWSだとAWS Lambda) を中⼼においた開発をサポートするツール   AWSだけでなく他のクラウドベンダが提供しているFaaS にも対応 (Azure Functionsなど)   Node製   だからといってランタイムがNodeに限定されているわけではない (各クラウドベンダのランタイムサポートに依存) 18 PHPカンファレンス2017

Slide 19

Slide 19 text

で、Serverless Frameworkとは何か   インフラもアプリケーションコードも⼀括管理できる デプロイツール   Service as Code ?   プログラマブルCFn + AWS Lambdaのコード管理   デプロイ時に実⾏されるのはCloudFormation(AWS の場合)   CFnテンプレートを動的に変更できるのでCFnよりも ⾃由度がある 19 PHPカンファレンス2017

Slide 20

Slide 20 text

Node Serverless Frameworkで デプロイできる範囲(AWS) 20 PHPカンファレンス2017 GET /index POST /create Lambda function Lambda function Amazon API Gateway event event Amazon S3 Lambda function event Put S3 object Lambda function scheduled event CloudWatch Event Amazon Linux ( cluster ) Amazon DynamoDB Amazon S3 And more events And more managed services

Slide 21

Slide 21 text

Serverless Frameworkでどのようなツール が作れるのか 21 PHPカンファレンス2017

Slide 22

Slide 22 text

backslack   Backlogの操作をSlackに通知するツール   https://github.com/k1LoW/backslack 22 PHPカンファレンス2017

Slide 23

Slide 23 text

backslack アーキテクチャ 23 PHPカンファレンス2017

Slide 24

Slide 24 text

faultline   エラートラッキングツール   同様のSaaSだとAirbrake, Bugsnag, Rollbar など   https://github.com/faultline/faultline 24 PHPカンファレンス2017

Slide 25

Slide 25 text

faultline アーキテクチャ 25 PHPカンファレンス2017

Slide 26

Slide 26 text

utsusemi   APIで“動的な更新”が可能な“静的サイト”⽣成 ツール   動的なCMSを静的サイトとしてS3ホスティングするのに最適   CMSの更新タイミングでAPIコールができるなら動的更新も可 能になるし、CMS⾃体へのアクセスをなくせる   https://github.com/k1LoW/utsusemi 26 PHPカンファレンス2017

Slide 27

Slide 27 text

utsusemi アーキテクチャ 27 PHPカンファレンス2017

Slide 28

Slide 28 text

hubedit   https://hubedit.com   GitHubのプライベートリポジトリをメモツールにする サービス   GitHubを使っているので正確にはAWSフルマネージドではない 28 PHPカンファレンス2017

Slide 29

Slide 29 text

hubedit アーキテクチャ 29 PHPカンファレンス2017

Slide 30

Slide 30 text

 $ sls deploy 紹介したモノは全て で、インフラも含めてデプロイできる 30 PHPカンファレンス2017

Slide 31

Slide 31 text

(サンプル) faultlineのインストール 31 PHPカンファレンス2017  $ git clone https://github.com/faultline/faultline.git  $ cd faultline/  $ npm install  $ cp config.default.yml config.yml  $ [Edit config.yml]  $ AWS_PROFILE=XXXXXX sls deploy

Slide 32

Slide 32 text

これだけで運⽤開始ができる 32 PHPカンファレンス2017

Slide 33

Slide 33 text

13 Projects 3 Languages 68k Errors 1.26GB Raw logs 33 PHPカンファレンス2017 Fusicでの運⽤実績

Slide 34

Slide 34 text

34 PHPカンファレンス2017 9< Months

Slide 35

Slide 35 text

1 Down 0 Recovery 35 PHPカンファレンス2017 ※DynamoDBのCapacityに引っかかった ※もともと⾃分で復旧すべきサーバがない

Slide 36

Slide 36 text

faultlineのアーキテクチャ(再掲) 36 PHPカンファレンス2017

Slide 37

Slide 37 text

Only 3 storage 37 PHPカンファレンス2017

Slide 38

Slide 38 text

Only 2,431 LOC 38 PHPカンファレンス2017 ※Lines of Code

Slide 39

Slide 39 text

たったこれだけのコードベースで ⼤きな効果を得られる 39 PHPカンファレンス2017

Slide 40

Slide 40 text

サーバーレスアーキテクチャで開発する ということ 40 PHPカンファレンス2017

Slide 41

Slide 41 text

LAMPアーキテクチャとは違うことを知る   プロセスが動いているサーバにステートを持てない   ファイルキャッシュも(ほぼ)効かない   安易にRDMS(RDS)を使うとアンチパターン   DBコネクションがスケールしたLambdaの接続数で…   画像などのバイナリの取り扱いが難しい   リクエスト/レスポンスサイズの制限   認証・認可の仕組みの構築の仕⽅が異なる   ファイルベースのセッションは無理 41 PHPカンファレンス2017

Slide 42

Slide 42 text

マネージドサービスを知る   OSSなFaaSが登場し始めているが、現状はクラウドベンダ が提供しているFaaSとその周辺のマネージドサービスを活 ⽤することが多い   オブジェクトストレージ(S3)   NoSQL(DynamoDB)   ストリーム(Kinesis、DynamoDB)   ロギング(CloudWatch)   キュー(SQS)   認証認可(Cognito、UserPool)   etc.   制約を受け⼊れてうまく設計ができれば「スケール」「管理 レス」という点でかなりインパクト⼤   全てをマネージド(フルマネージド)にできれば最⾼ 42 PHPカンファレンス2017

Slide 43

Slide 43 text

“サーバーレスアーキテクチャで作る” という中で⽣きてくる設計やアイデア 43 PHPカンファレンス2017

Slide 44

Slide 44 text

サーバーレスアーキテクチャでの設計やアイデア   「サーバーレスデザインパターン」みたいな仰々しい ものではなくて、実装時に得たTips的なもの   ただ、いろいろ試⾏錯誤をして頭をひねって思いつい たものばかり   AWSのマネージドサービス前提のものもあります   わかりやすいようにそれぞれに名前をつけています   名前をつけることで意識する 44 PHPカンファレンス2017

Slide 45

Slide 45 text

サーバーレスアーキテクチャでの設計やアイデア   POST with config   Reversed Timestamp ID   Instant Job Queue   S3 Object Tagging   Env Sync <- New! 45 PHPカンファレンス2017

Slide 46

Slide 46 text

設定値をリクエストに付与する ”POST with config” 46 PHPカンファレンス2017

Slide 47

Slide 47 text

POST with config   backslack, faultline   設定値をツール側で保存するだけでステートの管理対 象が増えてしまうので、できるだけ値を保持しないの が鉄則   APIベースのツールなのであれば、リクエストに必要な 設定を毎回付与してしまえばいいというアイデア   SlackのWebhook URL, チャンネル名など   秘匿が必要な設置値でさえもKMSを利⽤して暗号化し てリクエストに付与する 47 PHPカンファレンス2017

Slide 48

Slide 48 text

backslack アーキテクチャ(再掲) 48 PHPカンファレンス2017

Slide 49

Slide 49 text

新しい順の⼀覧を実現する “Reversed Timestamp ID” 49 PHPカンファレンス2017

Slide 50

Slide 50 text

Reversed Timestamp ID (1/2)   faultline   実は⼀覧を作るのは難しい   RDSはサーバレスアーキテクチャでは⼤抵アンチパターン   DynamoDBで「テーブルの全てのデータの⼀覧」を作るのは アンチパターン   今のところS3を使うのを解にしている   Prefixの使い⽅が設計のカギ   /projects/{project}/errors/{message}/ occurrences/{reversedUnixtime}.json 50 PHPカンファレンス2017

Slide 51

Slide 51 text

Reversed Timestamp ID (2/2)   S3のオブジェクトはアルファベット順でソートされて いる。`ORDER BY created DESC` を実現するにはど うすればいいか   UNIX Timestampを逆カウントにして、ゼロパディン グすることで実現   (Math.pow(2, 53) - 1) – unixtime   Number.MAX_SAFE_INTEGER - unixtime   IDから⽣成時刻もわかって便利(snowflakeみたい) 51 PHPカンファレンス2017

Slide 52

Slide 52 text

無限にファンアウトしかねない AWS Lambdaをいい感じに制限実⾏する ”Instant Job Queue” 52 PHPカンファレンス2017

Slide 53

Slide 53 text

Instant Job Queue (1/2)   utsusemi   functionをinvokeしてページをクロールして、そのリ ンク先をまた同じfunctionをinvokeしてクロールし て...   再帰的なinvoke   DoSになりかねないファンアウト   Queueを作ってWorkerプロセスを常時起動して待ち受 ける形だとWorkerプロセスの管理が増える   サーバーレスアーキテクチャではなくなる   (実は)AWS Step FunctionsがAWSの解だけど費⽤が 増える 53 PHPカンファレンス2017

Slide 54

Slide 54 text

Instant Job Queue (2/2)   Queue (SQS)を作ってクロール開始時にWorkerを起 動して、Workerは指定回数デキューしてクロールした ら値をエンキューして同じWorkerをinvokeして⾃分⾃ ⾝を終了   キューにたまっているメッセージが0になったらWorkerは⾃分 ⾃⾝を終了(最終的にWorkerは0)   クローラのような常にキューに値がはいるパターンに使える   同時に動かすWorker数や、Workerが処理するメッセ ージの数などが調整できる   FIFOキューにしたら実⾏順番も保証される(かも) 54 PHPカンファレンス2017

Slide 55

Slide 55 text

utsusemi アーキテクチャ(再掲) 55 PHPカンファレンス2017

Slide 56

Slide 56 text

メタ情報を保存する ”S3 Object Tagging” 56 PHPカンファレンス2017

Slide 57

Slide 57 text

S3 Object Tagging (1/2)   utsusemi   クローラが取得したHTMLファイルはS3バケットに保 存   じゃあそのファイルの更新⽇時は?Content-Typeは? ETagは?   ファイルシステムならあとでギリ取得できそうなファイルタイプ すらS3では難しい   ヘッダ情報などの活⽤できそうな値は保持しなくていいのか   他に保存する場所を作ってしまったら管理対象が増える。。。 57 PHPカンファレンス2017

Slide 58

Slide 58 text

S3 Object Tagging (1/2)   S3 Object Taggingを使う   オブジェクトごとにKey-Valueの値を保持できる   “S3 Object Tagging” はS3の機能の名前   ユーザ情報(オブジェクト)とその住所情報(タグ) とか、Issue(オブジェクト)とラベル(タグ)など、 ⽤途は広い気がする 58 PHPカンファレンス2017

Slide 59

Slide 59 text

デプロイ時の環境変数と プロセス起動時の環境変数を同期させる ”Env Sync” 59 PHPカンファレンス2017

Slide 60

Slide 60 text

Env Sync   デプロイ時の環境変数とfunctionが実⾏されるコンテ ナの環境変数を同期させる   The Twelve-Factor Appにある ”設定を環境変数に格 納する”   https://12factor.net/ja/config   Serverless Frameworkを使っていると実装しやすい 60 PHPカンファレンス2017  provider:   name: aws   environment: # Lambda側のコンテナに環境変数として設置する設定   STAGE: ${env:STAGE, ’develop’} # デプロイ時に環境環境から設置

Slide 61

Slide 61 text

まとめ 61 PHPカンファレンス2017

Slide 62

Slide 62 text

まとめ   サーバーレスアーキテクチャはハマれば強⼒   Serverless Frameworkはインフラもアプリケーション コードもまとめてデプロイできる強⼒なツール   サーバーレスアーキテクチャでうまく構築するために は、(例えば)LAMPアーキテクチャとは違うことを意 識し、FaaSとその周辺のマネージドサービスの特性を うまく活⽤して設計をする必要がある   “サーバーレスアーキテクチャで作る” という中で⽣き てくる(LAMPなアプリケーション構築とは違う)設計 やアイデアがある(もっと知⾒をためたい) 62 PHPカンファレンス2017

Slide 63

Slide 63 text

Letʼs `sls deploy` !! 63 PHPカンファレンス2017

Slide 64

Slide 64 text

Thank you!  Fusicはテクノロジーが  好きなエンジニアを募集しています  https://fusic.github.io 64