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. Serverless BEAM
    with FaaS
    2019/06/01 Erlang & Elixir Fest 2019
    おーはら@tokyo.ex

    View full-size slide

  2. agenda
    ● about me
    ● goal
    ● サーバーレスアーキテクチャの進化と歴史
    ● サーバーレスアーキテクチャの長所と短所
    ● Elixirをサーバーレスアーキテクチャ環境で動かす方法
    ● サーバーレスElixirアプリの運用
    ● サーバーレスElixirに足りないもの
    ● まとめ

    View full-size slide

  3. 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
    ○ 仏像制作, 丸太収集, 写経, 寺社仏閣
    ○ 人工衛星/アマチュア無線

    View full-size slide

  4. goal
    ● サーバーレスアーキテクチャの概要を理解する
    ● AWS Lambdaの概要を理解する
    ● Elixirをサーバーレスアーキテクチャで動かす方法を知る
    ● サーバーレスElixirの運用方法を知る
    ● サーバーレスElixirを動かす方法を知る

    View full-size slide

  5. サーバーレスアーキテクチャの進化と歴史
    ● 簡単に言うと、以下のようなアーキテクチャ
    ○ 「サーバーを自前運用せずに、マネージドサービスの組み合わせで構築する」
    ○ 「リクエスト単位で必要な CPUリソースをリアルタイムで確保し処理できる」
    ● よく利用されるマネージドサービスは以下
    ○ AWS Lambda, API Gateway (AWS)
    ○ Cloud Function (GCP)
    ○ Azure Function (Azure)
    ● 何が嬉しいのか?
    ○ スケールを意識しなくてよい(勝手にスケールイン・アウトしてくれる)
    ○ 費用が安い(使ったぶんだけ費用を払えば良い)

    View full-size slide

  6. サーバーレスアーキテクチャの進化と歴史
    ● サーバー運用のトレンド
    ○ 物理サーバーによる運用 : オンプレ
    ○ 仮想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サービスのアーキテクチャの文脈で語られる事が多い

    View full-size slide

  7. サーバーレスアーキテクチャの長所と短所
    ● 長所
    ○ サーバー運用費用が安い
    ■ リクエストレベルで必要な分だけ費用が発生する
    ○ 運用オペレーションが不要
    ○ 自動でスケールしてくれるのでトラフィックスパイクに強い
    ● 短所
    ○ デプロイメントが複雑
    ■ ex. ローカル開発, テスト, 動作環境
    ○ 対応したライブラリが少ない
    ■ ex. フレームワーク
    ○ データベースに制約がある
    ■ ex. ハイトラフィック時のコネクション数の上限など
    ○ 様々な制約
    ■ ex. 関数の同時実行数, 関数の最大処理時間 /タイムアウト時間

    View full-size slide

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

    View full-size slide

  9. サーバーレスアーキテクチャの長所と短所

    View full-size slide

  10. サーバーレスアーキテクチャの長所と短所

    View full-size slide

  11. サーバーレスアーキテクチャの長所と短所
    ● サーバー費用の月額比較(APIサーバーのcompute部分)
    ○ 一般的なAPIサーバー
    ■ 30日 x 24時間 x 1時間あたりの価格 x 台数
    ○ サーバーレス
    ■ リクエスト数 x リクエストあたりの平均処理時間と必要メモリの価格
    ○ 一般的に数倍〜、サーバーレスのほうが安く てすむ
    ● compute以外の部分は共通
    ○ データベス
    ○ ストレージ
    ○ 監視
    ○ etc

    View full-size slide

  12. demo0
    費用計算ツールによる費用試算

    View full-size slide

  13. 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

    View full-size slide

  14. Elixirをサーバーレスアーキテクチャで動かす方法
    ● 今まででAWS Lambdaのアーキテクチャの情報はあまりなかったが、
    re:Invent2018でアーキテクチャ詳細の発表があった。詳しくは以下を参照
    ○ https://www.youtube.com/watch?v=QdzV04T_kec&feature=youtu.be
    ○ https://www.slideshare.net/AmazonWebServices/a-serverless-journey-aws-lambda-under-the-
    hood-srv409r1-aws-reinvent-2018
    ● 内部的にはFirecrackerが基盤となっている
    ○ https://firecracker-microvm.github.io/
    ■ 超軽量VM(microVM)をセキュア・高速・大量に起動できるコンテナマシン
    ■ KVM上で動作、Rust実装、OSS

    View full-size slide

  15. Elixirをサーバーレスアーキテクチャで動かす方法

    View full-size slide

  16. webサービス
    Elixirをサーバーレスアーキテクチャで動かす方法
    ● Elixirとサーバーレスアーキテクチャの関係性
    inet
    cloud
    Reqイベント リソース確保 イベント毎の計算
    Resp返却
    リソース解放
    Respデータ
    request
    response
    ・マネージドサービスで構築
    ・自動でスケールイン・アウト

    View full-size slide

  17. webサービス
    Elixirをサーバーレスアーキテクチャで動かす方法
    ● Elixirとサーバーレスアーキテクチャの関係性
    inet
    cloud
    Reqイベント リソース確保 イベント毎の計算
    Resp返却
    リソース解放
    Respデータ
    request
    response
    API G/W
    ALB AWS Lambda
    Custom
    Runtime

    View full-size slide

  18. Elixirをサーバーレスアーキテクチャで動かす方法
    ● ランタイムインターフェース
    ○ 次の呼び出し
    ■ GET: /runtime/invocation/next
    ■ 呼び出しイベントを取得する
    ○ 呼び出しレスポンス
    ■ POST: /runtime/invocation/{REQ-ID}/response
    ■ 呼び出しレスポンスを Lambdaに送信する、Lambdaはそのレスポンスをクライアントに送信
    する

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  21. Runtime API bootstrap
    /invocation/next
    runtimeの初期化処理
    request
    handler
    {payload}
    /invocation/{req-id}/response
    /invocation/next
    response
    init phase
    invoke cycle
    呼び出しイベント取得
    呼び出しレスポンスを
    Lambdaに送信
    start
    λ start
    Elixirをサーバーレスアーキテクチャで動かす方法

    View full-size slide

  22. demo1
    hello world webアプリ

    View full-size slide

  23. サーバーレスElixirアプリの運用
    ● 運用に必要な要素
    ○ アーキテクチャ上の制約
    ○ 監視
    ○ デプロイメント

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 確保されたリソース
    (コンテナ)
    確保されたリソース
    (コンテナ)
    サーバーレスElixirアプリの運用
    ● サーバーレスアーキテクチャのデータベースコネクション
    request
    確保されたリソース
    (コンテナ)
    cloud DB
    (DynamoDB)
    http
    scale
    スケールすればするほど、リク
    エスト数が増える
    リクエスト数が増え
    ても問題ない
    リクエストが増えるとスケール
    する
    推奨

    View full-size slide

  27. サーバーレス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/

    View full-size slide

  28. サーバーレスElixirアプリの運用
    ● デプロイメント
    ○ 関数/API単位でデプロイメント
    ■ 複数の関数でアプリが構成されるので、関数単位ではなく関連群単位でデプロイする
    ■ AWS Lambda
    ■ API Gateway
    ○ マネージドなデプロイサービスやツールが (大抵のクラウドには)存在する
    ■ CloudFormation
    ● https://aws.amazon.com/jp/cloudformation/
    ■ serverlessframework
    ● https://serverless.com/

    View full-size slide

  29. サーバーレスElixirアプリの運用
    ● デプロイメントに利用するツール
    ○ docker
    ■ AWS Lambda上での動作環境に合わせたラインタイムビルド
    ○ distillery
    ■ https://github.com/bitwalker/distillery
    ■ リリースマネージャ
    ■ リリース: コンパイルされたElixirのバイナリ/ランタイム、起動scriptなどを含むパッケージ
    ○ cloudformation
    ■ https://aws.amazon.com/jp/cloudformation/
    ■ AWS Lambdaの適用

    View full-size slide

  30. サーバーレスElixirアプリの運用
    ● デプロイメントの内部構造
    ○ AWS Lambda はAmazon Linuxのコンテナとして動作
    ■ 環境情報は https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html 参照
    ○ 同環境のコンテナ内で、 Elixirアプリをランタイムと一緒にパッケージング
    ○ AWS Lambdaのコンテナで動作するパッケージを cloudformationでdeploy

    View full-size slide

  31. 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

    View full-size slide

  32. 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/ … リリース関連

    View full-size slide

  33. サーバーレスElixirアプリの運用
    Runtime API
    λ start
    /invocation/next
    elixir handler
    Erlang RTS
    start OTP App
    start
    elixir lambda core
    start
    bootstrap
    start OTP App

    View full-size slide

  34. 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

    View full-size slide

  35. サーバーレス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

    View full-size slide

  36. サーバーレスElixirアプリの運用
    Runtime API elixir handler
    Erlang RTS elixir lambda core
    bootstrap
    AWS Lambdaのカスタムランタイム
    Elixir/ErlangのRTS
    AWS Lambdaを扱うコアライブラリ
    Elixir実装の
    ハンドラ

    View full-size slide

  37. not DEMO
    (時間がないので、紹介のみ)
    [erllambda: AWS lambda in Erlang]
    https://github.com/alertlogic/erllambda_elixir_example
    ※本資料で解説したアーキテクチャはこちらのrepoがベースとなっています

    View full-size slide

  38. demo3
    デプロイメント

    View full-size slide

  39. サーバーレス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

    View full-size slide

  40. まとめ
    ● サーバーレスアーキテクチャの概要を紹介しました
    ● Elixirをカスタムランタイムを使って動作させた場合の概要を紹介しました
    ● サーバーレスElixirのデプロイメントの概要を紹介しました
    ● 現在は研究段階のフェーズで、まだ本番投入までには至っていません
    ● サーバーレスElixirの領域は、まだまだ未成熟な領域なので、貢献できる箇所がた
    くさんあります
    ● Let’s be serverless!

    View full-size slide

  41. 宣伝
    非公式後夜祭やります@ドリコムオフィス
    japan.ex #1 : https://beam-lang.connpass.com/event/130690/

    View full-size slide