Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Serverless BEAM with FaaS
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ohr486
June 01, 2019
Technology
2.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Serverless BEAM with FaaS
Erlang & ElixirFest 2019
ohr486
June 01, 2019
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.9k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
650
Hacking Phoenix Performance
ohr486
1
410
Plug & WAF
ohr486
2
550
elixirをプロダクションに導入する
ohr486
1
730
IEx maniacs
ohr486
4
660
Hack and Read Elixir
ohr486
2
810
Running App on AppRunner
ohr486
0
860
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
910
Other Decks in Technology
See All in Technology
プロダクト開発から業務改善コンサルまで。事業全体へ「染み出す」ことで広がるエンジニアの可能性
ham0215
0
100
新しいVibe Codingと”自走”について
watany
5
290
チームで進めるAI駆動アジャイル×ウォーターフォール
kumaiu
0
150
Disciplined Vibes: Scaling AI-Assisted Engineering
sheharyar
0
130
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
130
Chainlitで作るお手軽チャットUI
ynt0485
0
190
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
660
フロンティアAIのゲート化と地政学リスク
nagatsu
0
120
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
120
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
590
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
370
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
150
Featured
See All Featured
HDC tutorial
michielstock
2
700
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
How STYLIGHT went responsive
nonsquared
100
6.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Making the Leap to Tech Lead
cromwellryan
135
9.9k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Mobile First: as difficult as doing things right
swwweet
225
10k
Design in an AI World
tapps
1
240
Building AI with AI
inesmontani
PRO
1
1.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Transcript
Serverless BEAM with FaaS 2019/06/01 Erlang & Elixir Fest 2019
おーはら@tokyo.ex
agenda • about me • goal • サーバーレスアーキテクチャの進化と歴史 • サーバーレスアーキテクチャの長所と短所
• Elixirをサーバーレスアーキテクチャ環境で動かす方法 • サーバーレスElixirアプリの運用 • サーバーレスElixirに足りないもの • まとめ
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 ◦ 仏像制作, 丸太収集, 写経, 寺社仏閣 ◦ 人工衛星/アマチュア無線
goal • サーバーレスアーキテクチャの概要を理解する • AWS Lambdaの概要を理解する • Elixirをサーバーレスアーキテクチャで動かす方法を知る • サーバーレスElixirの運用方法を知る
• サーバーレスElixirを動かす方法を知る
サーバーレスアーキテクチャの進化と歴史 • 簡単に言うと、以下のようなアーキテクチャ ◦ 「サーバーを自前運用せずに、マネージドサービスの組み合わせで構築する」 ◦ 「リクエスト単位で必要な CPUリソースをリアルタイムで確保し処理できる」 • よく利用されるマネージドサービスは以下
◦ AWS Lambda, API Gateway (AWS) ◦ Cloud Function (GCP) ◦ Azure Function (Azure) • 何が嬉しいのか? ◦ スケールを意識しなくてよい(勝手にスケールイン・アウトしてくれる) ◦ 費用が安い(使ったぶんだけ費用を払えば良い)
サーバーレスアーキテクチャの進化と歴史 • サーバー運用のトレンド ◦ 物理サーバーによる運用 : オンプレ ◦ 仮想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サービスのアーキテクチャの文脈で語られる事が多い
サーバーレスアーキテクチャの長所と短所 • 長所 ◦ サーバー運用費用が安い ▪ リクエストレベルで必要な分だけ費用が発生する ◦ 運用オペレーションが不要 ◦
自動でスケールしてくれるのでトラフィックスパイクに強い • 短所 ◦ デプロイメントが複雑 ▪ ex. ローカル開発, テスト, 動作環境 ◦ 対応したライブラリが少ない ▪ ex. フレームワーク ◦ データベースに制約がある ▪ ex. ハイトラフィック時のコネクション数の上限など ◦ 様々な制約 ▪ ex. 関数の同時実行数, 関数の最大処理時間 /タイムアウト時間
サーバーレスアーキテクチャの長所と短所 • サーバー費用の月額比較(APIサーバーのcompute部分) ◦ 一般的なAPIサーバー ▪ 30日 x 24時間 x
1時間あたりの価格 ◦ サーバーレス ▪ リクエスト数 x リクエストあたりの平均処理時間と必要メモリの価格
サーバーレスアーキテクチャの長所と短所
サーバーレスアーキテクチャの長所と短所
サーバーレスアーキテクチャの長所と短所 • サーバー費用の月額比較(APIサーバーのcompute部分) ◦ 一般的なAPIサーバー ▪ 30日 x 24時間 x
1時間あたりの価格 x 台数 ◦ サーバーレス ▪ リクエスト数 x リクエストあたりの平均処理時間と必要メモリの価格 ◦ 一般的に数倍〜、サーバーレスのほうが安く てすむ • compute以外の部分は共通 ◦ データベス ◦ ストレージ ◦ 監視 ◦ etc
demo0 費用計算ツールによる費用試算
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
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
Elixirをサーバーレスアーキテクチャで動かす方法
webサービス Elixirをサーバーレスアーキテクチャで動かす方法 • Elixirとサーバーレスアーキテクチャの関係性 inet cloud Reqイベント リソース確保 イベント毎の計算 Resp返却
リソース解放 Respデータ request response ・マネージドサービスで構築 ・自動でスケールイン・アウト
webサービス Elixirをサーバーレスアーキテクチャで動かす方法 • Elixirとサーバーレスアーキテクチャの関係性 inet cloud Reqイベント リソース確保 イベント毎の計算 Resp返却
リソース解放 Respデータ request response API G/W ALB AWS Lambda Custom Runtime
Elixirをサーバーレスアーキテクチャで動かす方法 • ランタイムインターフェース ◦ 次の呼び出し ▪ GET: /runtime/invocation/next ▪ 呼び出しイベントを取得する
◦ 呼び出しレスポンス ▪ POST: /runtime/invocation/{REQ-ID}/response ▪ 呼び出しレスポンスを Lambdaに送信する、Lambdaはそのレスポンスをクライアントに送信 する
Elixirをサーバーレスアーキテクチャで動かす方法 Runtime API bootstrap λ start /invocation/next runtimeの初期化処理 request handler
{payload} /invocation/{req-id}/response /invocation/next response start
Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next
response init phase invoke cycle start λ start Elixirをサーバーレスアーキテクチャで動かす方法
Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next
response init phase invoke cycle 呼び出しイベント取得 呼び出しレスポンスを Lambdaに送信 start λ start Elixirをサーバーレスアーキテクチャで動かす方法
demo1 hello world webアプリ
サーバーレスElixirアプリの運用 • 運用に必要な要素 ◦ アーキテクチャ上の制約 ◦ 監視 ◦ デプロイメント
サーバーレスElixirアプリの運用 • アーキテクチャ上の制約 ◦ データベース ▪ リレーショナルデータベース /NoSQLデータベース • 同時接続数・コネクション数に上限がある
• ハイトラフィック時に接続数が上限を越えるとダウンする • コネクションの同時接続数管理やプーリングの機構が必要 ▪ クラウドベースのデータベース ( DynamoDBなど ) • HTTP通信ベースが一般的に多い • ハイトラフィック時も性能劣化することなく利用できる ▪ 一般的にクラウドベースのデータベースを利用することが推奨される
確保されたリソース (コンテナ) 確保されたリソース (コンテナ) サーバーレスElixirアプリの運用 • サーバーレスアーキテクチャのデータベースコネクション request 確保されたリソース (コンテナ)
DB DB con scale スケールすればするほど、コ ネクション数が増える 扱えるDBコネクション の上限がある MySQL, Redis, etc リクエストが増えるとスケール する
確保されたリソース (コンテナ) 確保されたリソース (コンテナ) サーバーレスElixirアプリの運用 • サーバーレスアーキテクチャのデータベースコネクション request 確保されたリソース (コンテナ)
cloud DB (DynamoDB) http scale スケールすればするほど、リク エスト数が増える リクエスト数が増え ても問題ない リクエストが増えるとスケール する 推奨
サーバーレス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/
サーバーレスElixirアプリの運用 • デプロイメント ◦ 関数/API単位でデプロイメント ▪ 複数の関数でアプリが構成されるので、関数単位ではなく関連群単位でデプロイする ▪ AWS Lambda
▪ API Gateway ◦ マネージドなデプロイサービスやツールが (大抵のクラウドには)存在する ▪ CloudFormation • https://aws.amazon.com/jp/cloudformation/ ▪ serverlessframework • https://serverless.com/
demo2 監視
サーバーレスElixirアプリの運用 • デプロイメントに利用するツール ◦ docker ▪ AWS Lambda上での動作環境に合わせたラインタイムビルド ◦ distillery
▪ https://github.com/bitwalker/distillery ▪ リリースマネージャ ▪ リリース: コンパイルされたElixirのバイナリ/ランタイム、起動scriptなどを含むパッケージ ◦ cloudformation ▪ https://aws.amazon.com/jp/cloudformation/ ▪ AWS Lambdaの適用
サーバーレスElixirアプリの運用 • デプロイメントの内部構造 ◦ AWS Lambda はAmazon Linuxのコンテナとして動作 ▪ 環境情報は
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html 参照 ◦ 同環境のコンテナ内で、 Elixirアプリをランタイムと一緒にパッケージング ◦ AWS Lambdaのコンテナで動作するパッケージを cloudformationでdeploy
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
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/ … リリース関連
サーバーレスElixirアプリの運用 Runtime API λ start /invocation/next elixir handler Erlang RTS
start OTP App start elixir lambda core start bootstrap start OTP App
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
サーバーレス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
サーバーレスElixirアプリの運用 Runtime API elixir handler Erlang RTS elixir lambda core
bootstrap AWS Lambdaのカスタムランタイム Elixir/ErlangのRTS AWS Lambdaを扱うコアライブラリ Elixir実装の ハンドラ
not DEMO (時間がないので、紹介のみ) [erllambda: AWS lambda in Erlang] https://github.com/alertlogic/erllambda_elixir_example ※本資料で解説したアーキテクチャはこちらのrepoがベースとなっています
demo3 デプロイメント
サーバーレス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
まとめ • サーバーレスアーキテクチャの概要を紹介しました • Elixirをカスタムランタイムを使って動作させた場合の概要を紹介しました • サーバーレスElixirのデプロイメントの概要を紹介しました • 現在は研究段階のフェーズで、まだ本番投入までには至っていません •
サーバーレスElixirの領域は、まだまだ未成熟な領域なので、貢献できる箇所がた くさんあります • Let’s be serverless!
宣伝 非公式後夜祭やります@ドリコムオフィス japan.ex #1 : https://beam-lang.connpass.com/event/130690/