Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Serverless FrameworkでAWSフルマネージドなツールをいくつか作って得たアーキテクチャ設計の知見 / PHP Conference 2017

Serverless FrameworkでAWSフルマネージドなツールをいくつか作って得たアーキテクチャ設計の知見 / PHP Conference 2017

Ken’ichiro Oyama

October 08, 2017
Tweet

More Decks by Ken’ichiro Oyama

Other Decks in Technology

Transcript

  1. 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
  2. アジェンダ   サーバーレスアーキテクチャ   Serverless Framework   Serverless Frameworkでの構築例  

    サーバーレスアーキテクチャで構築するときに意識す ること   “サーバーレスアーキテクチャで作る”という中で⽣きて くる設計やアイデア 4 PHPカンファレンス2017
  3. サーバーレスアーキテクチャ <※諸説あります>   イベントドリブンなアーキテクチャ   AWS Lambdaや* Functionsが中⼼   サーバ単位ではなくイベント単位

      スケールの単位 / 課⾦の単位 / ⽣存期間 / 管理の単 位 / 監視の単位   ステートレスに構築することでクラウドが提供するス ケーラビリティの恩恵を受けることができる </※諸説あります> 7 PHPカンファレンス2017
  4. LAMPアーキテクチャ 10 PHPカンファレンス2017 PHP (PHP framework) GET /index POST /create

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

    Apache MySQL public function index() public function create() Linux ユーザ管理領域 (OSもミドルウェアも全部管理)
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. Serverless Framework   サーバレスアーキテクチャでアプリケーションを構築する ためのフレームワーク   FaaS (Function as a

    Service。AWSだとAWS Lambda) を中⼼においた開発をサポートするツール   AWSだけでなく他のクラウドベンダが提供しているFaaS にも対応 (Azure Functionsなど)   Node製   だからといってランタイムがNodeに限定されているわけではない (各クラウドベンダのランタイムサポートに依存) 18 PHPカンファレンス2017
  12. で、Serverless Frameworkとは何か   インフラもアプリケーションコードも⼀括管理できる デプロイツール   Service as Code ?

      プログラマブルCFn + AWS Lambdaのコード管理   デプロイ時に実⾏されるのはCloudFormation(AWS の場合)   CFnテンプレートを動的に変更できるのでCFnよりも ⾃由度がある 19 PHPカンファレンス2017
  13. 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
  14. (サンプル) 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
  15. 13 Projects 3 Languages 68k Errors 1.26GB Raw logs 33

    PHPカンファレンス2017 Fusicでの運⽤実績
  16. LAMPアーキテクチャとは違うことを知る   プロセスが動いているサーバにステートを持てない   ファイルキャッシュも(ほぼ)効かない   安易にRDMS(RDS)を使うとアンチパターン   DBコネクションがスケールしたLambdaの接続数で…  

    画像などのバイナリの取り扱いが難しい   リクエスト/レスポンスサイズの制限   認証・認可の仕組みの構築の仕⽅が異なる   ファイルベースのセッションは無理 41 PHPカンファレンス2017
  17. マネージドサービスを知る   OSSなFaaSが登場し始めているが、現状はクラウドベンダ が提供しているFaaSとその周辺のマネージドサービスを活 ⽤することが多い   オブジェクトストレージ(S3)   NoSQL(DynamoDB)  

    ストリーム(Kinesis、DynamoDB)   ロギング(CloudWatch)   キュー(SQS)   認証認可(Cognito、UserPool)   etc.   制約を受け⼊れてうまく設計ができれば「スケール」「管理 レス」という点でかなりインパクト⼤   全てをマネージド(フルマネージド)にできれば最⾼ 42 PHPカンファレンス2017
  18. サーバーレスアーキテクチャでの設計やアイデア   POST with config   Reversed Timestamp ID  

    Instant Job Queue   S3 Object Tagging   Env Sync <- New! 45 PHPカンファレンス2017
  19. POST with config   backslack, faultline   設定値をツール側で保存するだけでステートの管理対 象が増えてしまうので、できるだけ値を保持しないの が鉄則

      APIベースのツールなのであれば、リクエストに必要な 設定を毎回付与してしまえばいいというアイデア   SlackのWebhook URL, チャンネル名など   秘匿が必要な設置値でさえもKMSを利⽤して暗号化し てリクエストに付与する 47 PHPカンファレンス2017
  20. Reversed Timestamp ID (1/2)   faultline   実は⼀覧を作るのは難しい   RDSはサーバレスアーキテクチャでは⼤抵アンチパターン

      DynamoDBで「テーブルの全てのデータの⼀覧」を作るのは アンチパターン   今のところS3を使うのを解にしている   Prefixの使い⽅が設計のカギ   /projects/{project}/errors/{message}/ occurrences/{reversedUnixtime}.json 50 PHPカンファレンス2017
  21. 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
  22. Instant Job Queue (1/2)   utsusemi   functionをinvokeしてページをクロールして、そのリ ンク先をまた同じfunctionをinvokeしてクロールし て...

      再帰的なinvoke   DoSになりかねないファンアウト   Queueを作ってWorkerプロセスを常時起動して待ち受 ける形だとWorkerプロセスの管理が増える   サーバーレスアーキテクチャではなくなる   (実は)AWS Step FunctionsがAWSの解だけど費⽤が 増える 53 PHPカンファレンス2017
  23. Instant Job Queue (2/2)   Queue (SQS)を作ってクロール開始時にWorkerを起 動して、Workerは指定回数デキューしてクロールした ら値をエンキューして同じWorkerをinvokeして⾃分⾃ ⾝を終了

      キューにたまっているメッセージが0になったらWorkerは⾃分 ⾃⾝を終了(最終的にWorkerは0)   クローラのような常にキューに値がはいるパターンに使える   同時に動かすWorker数や、Workerが処理するメッセ ージの数などが調整できる   FIFOキューにしたら実⾏順番も保証される(かも) 54 PHPカンファレンス2017
  24. S3 Object Tagging (1/2)   utsusemi   クローラが取得したHTMLファイルはS3バケットに保 存  

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

      “S3 Object Tagging” はS3の機能の名前   ユーザ情報(オブジェクト)とその住所情報(タグ) とか、Issue(オブジェクト)とラベル(タグ)など、 ⽤途は広い気がする 58 PHPカンファレンス2017
  26. 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’} # デプロイ時に環境環境から設置
  27. まとめ   サーバーレスアーキテクチャはハマれば強⼒   Serverless Frameworkはインフラもアプリケーション コードもまとめてデプロイできる強⼒なツール   サーバーレスアーキテクチャでうまく構築するために は、(例えば)LAMPアーキテクチャとは違うことを意

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