Slide 1

Slide 1 text

Serverless Elixirを 動かすまで 2019/04/17 fukuoka.ex#21 おーはら@tokyo.ex

Slide 2

Slide 2 text

agenda ● about me ● (ちょっとだけお礼と宣伝) ● goal ● サーバーレスアーキテクチャとは ● AWS Lambdaのアーキテクチャ ● カスタムランタイムのシーケンス ● ElixirをAWS Lambdaで実行するには ● まとめ

Slide 3

Slide 3 text

about me ● Tsunenori Ohara/おーはら ○ Twitter: @ohrdev ○ Github: ohr486 ● Work ○ (株)目黒のIT企業 プラットフォーム開発 1部 部長(※エンジニアリングもやってます ) ○ CTO室(仮) NEW! ○ インフラ/基盤/アーキテクチャ設計 ,Elixir/Erlang/HCL/SL/Ruby/Golang ● Community ○ tokyo.ex, ElixirConfJapan, Erlang&ElixirFest オーガナイザー ○ Japan Elixir Association ○ meguro.rb, meguro.es ● Hobby ○ 仏像制作, 丸太収集, 写経, 寺社仏閣 ○ 人工衛星/アマチュア無線

Slide 4

Slide 4 text

(ちょっとだけお礼と宣伝) fukuoka.exコミュニティの皆さまへ いつも日本のElixirの活動を盛り上げていただいて ありがとうございます。 JEA, tokyo.ex, ElixirFestのオーガナイザーとし て、また、Elixirを使う1エンジニアとしてお礼申し上 げます。

Slide 5

Slide 5 text

https://elixir-fest.jp

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

AWS Lambdaのアーキテクチャ ● 今までで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

Slide 12

Slide 12 text

AWS Lambdaのアーキテクチャ

Slide 13

Slide 13 text

ElixirをAWS Lambda上で実行するには ● カスタムランタイムを利用 ○ 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

Slide 14

Slide 14 text

カスタムランタイムのシーケンス Runtime API bootstrap λ start /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next response start

Slide 15

Slide 15 text

Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next response init phase invoke cycle start λ start カスタムランタイムのシーケンス

Slide 16

Slide 16 text

Runtime API bootstrap /invocation/next runtimeの初期化処理 request handler {payload} /invocation/{req-id}/response /invocation/next response init phase invoke cycle 呼び出しイベント取得 呼び出しレスポンスを Lambdaに送信 start λ start カスタムランタイムのシーケンス

Slide 17

Slide 17 text

ElixirをAWS Lambda上で実行するには Runtime API λ start /invocation/next elixir handler Erlang RTS start OTP App start elixir lambda core start bootstrap start OTP App

Slide 18

Slide 18 text

ElixirをAWS Lambda上で実行するには 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

Slide 19

Slide 19 text

ElixirをAWS Lambda上で実行するには 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

Slide 20

Slide 20 text

ElixirをAWS Lambda上で実行するには Runtime API elixir handler Erlang RTS elixir lambda core bootstrap AWS Lambdaのカスタムランタイム Elixir/ErlangのRTS AWS Lambdaを扱うコアライブラリ Elixir実装の ハンドラ

Slide 21

Slide 21 text

まとめ ● サーバーレスアーキテクチャの概要を紹介しました ● AWS Lambdaのアーキテクチャを紹介しました ● カスタムランタイムのアーキテクチャを紹介しました ● Elixirをカスタムランタイムを使って動作させた場合の概要を紹介しました ○ 既存実装として、erllambdaがあります、詳しくはこちらを参考にすると理解しやすいです ■ https://github.com/alertlogic/erllambda ● Lambdaのコアライブラリ(開発中)や、内部実装についてはElixirFestで紹介する予 定です ● ServerlessベースのWAFについてはElixirFestで紹介する予定です

Slide 22

Slide 22 text

最後に fukuoka.ex様、発表の機会を頂きありがとうございました 引き続きよろしくお願いいたします。