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

Serverless BEAM with FaaS

ohr486
June 01, 2019

Serverless BEAM with FaaS

Erlang & ElixirFest 2019

ohr486

June 01, 2019
Tweet

More Decks by ohr486

Other Decks in Technology

Transcript

  1. agenda • about me • goal • サーバーレスアーキテクチャの進化と歴史 • サーバーレスアーキテクチャの長所と短所

    • Elixirをサーバーレスアーキテクチャ環境で動かす方法 • サーバーレスElixirアプリの運用 • サーバーレスElixirに足りないもの • まとめ
  2. about me • Tsunenori Ohara/おーはら ◦ Twitter: @ohrdev ◦ Github:

    ohr486 • Work ◦ (株)ドリコム HTML5ゲームプラットフォームの開発 ◦ CTO室 ◦ インフラ/基盤/アーキテクチャ設計 ,Elixir/Erlang/HCL/SL/Ruby/Golang • Community ◦ tokyo.ex, ElixirConfJapan, Erlang&ElixirFest オーガナイザー ◦ Japan Elixir Association ◦ meguro.rb, meguro.es • Hobby ◦ 仏像制作, 丸太収集, 写経, 寺社仏閣 ◦ 人工衛星/アマチュア無線
  3. サーバーレスアーキテクチャの進化と歴史 • 簡単に言うと、以下のようなアーキテクチャ ◦ 「サーバーを自前運用せずに、マネージドサービスの組み合わせで構築する」 ◦ 「リクエスト単位で必要な CPUリソースをリアルタイムで確保し処理できる」 • よく利用されるマネージドサービスは以下

    ◦ AWS Lambda, API Gateway (AWS) ◦ Cloud Function (GCP) ◦ Azure Function (Azure) • 何が嬉しいのか? ◦ スケールを意識しなくてよい(勝手にスケールイン・アウトしてくれる) ◦ 費用が安い(使ったぶんだけ費用を払えば良い)
  4. サーバーレスアーキテクチャの進化と歴史 • サーバー運用のトレンド ◦ 物理サーバーによる運用 : オンプレ ◦ 仮想VMによる運用 :

    ex) VMware, etc ◦ クラウドによる運用 : ex) AWS EC2, etc ◦ コンテナによる運用 : ex) Docker, Kubernetes いまは、ここから ◦ マネージドなコンテナサービス : ex) AWS ECS, GKE, EKS このあたりまで ◦ Function as a Service : ex) AWS Lambda, Cloud Function, Azure Function これからは • Webサービスのアーキテクチャの文脈で語られる事が多い
  5. サーバーレスアーキテクチャの長所と短所 • 長所 ◦ サーバー運用費用が安い ▪ リクエストレベルで必要な分だけ費用が発生する ◦ 運用オペレーションが不要 ◦

    自動でスケールしてくれるのでトラフィックスパイクに強い • 短所 ◦ デプロイメントが複雑 ▪ ex. ローカル開発, テスト, 動作環境 ◦ 対応したライブラリが少ない ▪ ex. フレームワーク ◦ データベースに制約がある ▪ ex. ハイトラフィック時のコネクション数の上限など ◦ 様々な制約 ▪ ex. 関数の同時実行数, 関数の最大処理時間 /タイムアウト時間
  6. サーバーレスアーキテクチャの長所と短所 • サーバー費用の月額比較(APIサーバーのcompute部分) ◦ 一般的なAPIサーバー ▪ 30日 x 24時間 x

    1時間あたりの価格 ◦ サーバーレス ▪ リクエスト数 x リクエストあたりの平均処理時間と必要メモリの価格
  7. サーバーレスアーキテクチャの長所と短所 • サーバー費用の月額比較(APIサーバーのcompute部分) ◦ 一般的なAPIサーバー ▪ 30日 x 24時間 x

    1時間あたりの価格 x 台数 ◦ サーバーレス ▪ リクエスト数 x リクエストあたりの平均処理時間と必要メモリの価格 ◦ 一般的に数倍〜、サーバーレスのほうが安く てすむ • compute以外の部分は共通 ◦ データベス ◦ ストレージ ◦ 監視 ◦ etc
  8. Elixirをサーバーレスアーキテクチャで動かす方法 • カスタムランタイムを利用 ◦ AWS Lambdaで任意の言語ランタイムを実行させる機能 ◦ 実行環境はAmazon Linux、利用できる環境変数は以下 ▪

    https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html ◦ 必要なもの ▪ bootstrap : Lambda起動時に実行されるファイル ▪ function handler : 関数呼び出し時に実行するハンドラ ◦ 内部的にはAWS Lambdaランタイムインターフェース (HTTP API)をcall ▪ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-api.html ◦ パッケージングについては割愛、以下のドキュメントをご参照ください ▪ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html
  9. Elixirをサーバーレスアーキテクチャで動かす方法 • ランタイムインターフェース ◦ 次の呼び出し ▪ GET: /runtime/invocation/next ▪ 呼び出しイベントを取得する

    ◦ 呼び出しレスポンス ▪ POST: /runtime/invocation/{REQ-ID}/response ▪ 呼び出しレスポンスを Lambdaに送信する、Lambdaはそのレスポンスをクライアントに送信 する
  10. Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next

    response init phase invoke cycle start λ start Elixirをサーバーレスアーキテクチャで動かす方法
  11. Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next

    response init phase invoke cycle 呼び出しイベント取得 呼び出しレスポンスを Lambdaに送信 start λ start Elixirをサーバーレスアーキテクチャで動かす方法
  12. サーバーレスElixirアプリの運用 • アーキテクチャ上の制約 ◦ データベース ▪ リレーショナルデータベース /NoSQLデータベース • 同時接続数・コネクション数に上限がある

    • ハイトラフィック時に接続数が上限を越えるとダウンする • コネクションの同時接続数管理やプーリングの機構が必要 ▪ クラウドベースのデータベース ( DynamoDBなど ) • HTTP通信ベースが一般的に多い • ハイトラフィック時も性能劣化することなく利用できる ▪ 一般的にクラウドベースのデータベースを利用することが推奨される
  13. 確保されたリソース (コンテナ) 確保されたリソース (コンテナ) サーバーレスElixirアプリの運用 • サーバーレスアーキテクチャのデータベースコネクション request 確保されたリソース (コンテナ)

    DB DB con scale スケールすればするほど、コ ネクション数が増える 扱えるDBコネクション の上限がある MySQL, Redis, etc リクエストが増えるとスケール する
  14. 確保されたリソース (コンテナ) 確保されたリソース (コンテナ) サーバーレスElixirアプリの運用 • サーバーレスアーキテクチャのデータベースコネクション request 確保されたリソース (コンテナ)

    cloud DB (DynamoDB) http scale スケールすればするほど、リク エスト数が増える リクエスト数が増え ても問題ない リクエストが増えるとスケール する 推奨
  15. サーバーレスElixirアプリの運用 • 監視 ◦ マネージドな監視サービス /SaaS ▪ CloudWatch : AWS

    Lambda, API Gateway, database ▪ x-ray: 分散トレーシング ▪ newrelic : AWS Lambda ◦ cloudwatch ▪ https://aws.amazon.com/jp/cloudwatch/ ◦ x-ray ▪ https://aws.amazon.com/jp/xray/
  16. サーバーレスElixirアプリの運用 • デプロイメント ◦ 関数/API単位でデプロイメント ▪ 複数の関数でアプリが構成されるので、関数単位ではなく関連群単位でデプロイする ▪ AWS Lambda

    ▪ API Gateway ◦ マネージドなデプロイサービスやツールが (大抵のクラウドには)存在する ▪ CloudFormation • https://aws.amazon.com/jp/cloudformation/ ▪ serverlessframework • https://serverless.com/
  17. サーバーレスElixirアプリの運用 • デプロイメントに利用するツール ◦ docker ▪ AWS Lambda上での動作環境に合わせたラインタイムビルド ◦ distillery

    ▪ https://github.com/bitwalker/distillery ▪ リリースマネージャ ▪ リリース: コンパイルされたElixirのバイナリ/ランタイム、起動scriptなどを含むパッケージ ◦ cloudformation ▪ https://aws.amazon.com/jp/cloudformation/ ▪ AWS Lambdaの適用
  18. サーバーレスElixirアプリの運用 • デプロイメントの内部構造 ◦ AWS Lambda はAmazon Linuxのコンテナとして動作 ▪ 環境情報は

    https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html 参照 ◦ 同環境のコンテナ内で、 Elixirアプリをランタイムと一緒にパッケージング ◦ AWS Lambdaのコンテナで動作するパッケージを cloudformationでdeploy
  19. AWS サーバーレスElixirアプリの運用 AWS Lambdaの実行環境 コンテナ Amazon Linux docker image ex)

    https://hub.docker.com/r/lambci/lambci local / build PC docker release package release build AWS Lambda Func Amazon Linux Image = Lambda実行時と同環境 同一 Lambdaの実行時の環境で 動作するバイナリ CloudFormation 起動 req res distillery pkg
  20. AWS サーバーレスElixirアプリの運用 [init phase] step1. bootstrapを実行 step2. Erlang RTSが起動 step3.

    リクエストを処理する handlerアプ リが起動 step4. /invocation/next をcallしてリクエ ストを取得開始 release package AWS Lambda Func /bootstrap ... bin以下の起動scriptを叩いてアプリ起動 /bin/ ... 実行ファイル、起動scriptなど /lib/ ... 関連ライブラリ群 /releases/ … リリース関連
  21. サーバーレスElixirアプリの運用 Runtime API λ start /invocation/next elixir handler Erlang RTS

    start OTP App start elixir lambda core start bootstrap start OTP App
  22. AWS サーバーレスElixirアプリの運用 [invoke cycle] step5. reqを受付たデータでhandlerをcall step6. (Elixirで実装された)handlerが実行されresponseを作成 step7. /invocation/{REQ-ID}/responseをcallしてlambdaにresponse

    を送信 step8. lambdaがクライアントにresを返す step9. /invocation/nextをcallして、次のreqを受付開始 step10. step5.に戻る req res コンテナがshutdown 新しいコンテナがup
  23. サーバーレスElixirアプリの運用 Runtime API request /invocation/next elixir handler Erlang RTS {payload}

    elixir lambda core bootstrap :ok | {:ok, result} handle(Event, Context) /invocation/{req-id}/response response
  24. サーバーレスElixirアプリの運用 Runtime API elixir handler Erlang RTS elixir lambda core

    bootstrap AWS Lambdaのカスタムランタイム Elixir/ErlangのRTS AWS Lambdaを扱うコアライブラリ Elixir実装の ハンドラ
  25. サーバーレスElixirに足りないもの • クラウド側の対応(AWS, GCP, Azure, etc) ◦ 現状、AWS Lambdaが一番環境が整っている(個人的な主観 •

    WAF(Web App Framework) ◦ AWS Lambda Custum Runtime発表以降ちょくちょく作成され始めている ◦ ex) Ruby: Jets https://rubyonjets.com/ • deploymentツール ◦ cloudformation ◦ serverlessframework ◦ SAML ◦ etc