Slide 1

Slide 1 text

Cloud Native Developers JP Fn Projectの話 @hhiroshell 1

Slide 2

Slide 2 text

Cloud Native Developers JP • 早川 博(はやかわ ひろし) • 日本オラクル所属 – Cloud Nativeな技術スタック担当のSA – Microservices / DevOps • Cloud Native Developers JP オーガナイザー 自己紹介 @hhiroshell 2 ※ 遊舎工房さんの店舗はこちら

Slide 3

Slide 3 text

Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. Fn Projectでもっと遊ぼう 3

Slide 4

Slide 4 text

Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. Fn Projectでもっと遊ぼう 4

Slide 5

Slide 5 text

Cloud Native Developers JP Fn Projectとは • Function as a Service(FaaS)を構築するためのフレームワーク • Oracle社主導で開発されているOSS – https://fnproject.io/ – https://github.com/fnproject/ • Function開発者の開発者エクスペリエンスを重視した設計が特徴 5

Slide 6

Slide 6 text

Cloud Native Developers JP 6

Slide 7

Slide 7 text

Cloud Native Developers JP Fn Projectを使ったFunction実行環境 • Fn CLI, Fn Server, Functionで構成 • Fn Server, FunctionはDockerコンテナとして実装 • Fn Serverにトリガーが渡ると、CLIで設定しておいたFunctionが起動 7 >_ Fn CLI コンテナレジストリ Fn Server トリガー Function Fn Serverホスト

Slide 8

Slide 8 text

Cloud Native Developers JP Fn Projectの主要な構成要素 • Function – Functionのワークロードの実態 • Fn Server – Functionの実行に最適化された、軽量なコンテナオーケストレーター – トリガーとそれに対応するFunctionを設定するなど、CRUD操作を受け付ける – トリガーを受け付けて、対応するFunctionを実行し、結果を返却する • Fn CLI – Function, Fn Serverの管理全般を行うCLI • Fn Serverの起動・停止、Functionの作成、登録 …etc – Dockerを隠蔽しており、全ての操作をFn CLIだけで完結可能 8 Fn Server >_

Slide 9

Slide 9 text

Cloud Native Developers JP Function • Functionのワークロードの実態 • Functionの一つ一つはDockerコンテナ • Functionを作成するための材料 – Functionの実装コード • Functionで実行されるロジックを記述したファイル – func.yaml • Functionに与える設定などを記述するメタデータファイル – Dockerfile (optional) • Functionの実行環境となるコンテナをカスタマイズしたい場合に作成 9

Slide 10

Slide 10 text

Cloud Native Developers JP Functionの実装コード • Functionで実装するロジック を記述する – CLIを使うと雛形作成まで自動 – Function実行時に呼び出されるメ ソッドの内容を実装する → はGo言語のFunctionの例 10 package main import ( "context" "encoding/json" "fmt" "io" fdk "github.com/fnproject/fdk-go" ) func main() { fdk.Handle(fdk.HandlerFunc(myHandler)) } type Person struct { Name string `json:"name"` } func myHandler( ctx context.Context, in io.Reader, out io.Writer) { p := &Person{Name: "World"} json.NewDecoder(in).Decode(p) msg := struct { Msg string `json:"message"` }{ Msg: fmt.Sprintf("Hello %s", p.Name), } json.NewEncoder(out).Encode(&msg) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Slide 11

Slide 11 text

Cloud Native Developers JP func.yaml • Functionに与える設定などを 記述するメタデータファイル – CLIを使うとデフォルトの func.yaml作成は自動 – Functionのコンテナ作成時の手が かりになる情報を与える • rutnime: – 実装言語。コンテナのベースイメージ を決める • entrypoint: – コンテナのENTRYPOINT • (…etc) 11 schema_version: 20180708 name: gofn version: 0.0.1 runtime: go entrypoint: ./func format: http-stream 1 2 3 4 5 6

Slide 12

Slide 12 text

Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. Fn Projectでもっと遊ぼう 12

Slide 13

Slide 13 text

Cloud Native Developers JP Fn Projectの開発者エクスペリエンス • 極めて簡単に使い始められる – Dockerさえあれば今すぐに – シンプルなCLIで • 主要プログラミング言語をカバーするSDK (FDK) • Functionのカスタマイズ性の高さ 13

Slide 14

Slide 14 text

Cloud Native Developers JP 極めて簡単に使い始められる • 2ステップでFn Serverが起動(要Docker) 14 # for Mac $ brew install fn # for Linux $ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh 1. Fn CLIをインストール [^1] 2. Fn Serverを起動 $ fn start [^1] Windowsの場合はバイナリをダウンロードしてください → https://github.com/fnproject/cli/releases i

Slide 15

Slide 15 text

Cloud Native Developers JP 極めて簡単に使い始められる • Functionの雛形をCLIで作成し、それをベースに実装を勧める流れ • Hello World的Functionを実行するのにコマンド5つで完結 • デフォルトでHTTP Requestのトリガーが実行可能 15 $ fn init --runtime go gofn # Go言語のFunctionの雛形を作成 $ cd gofn $ fn create app myapp # Applicationを作成 $ fn deploy --app myapp # FunctionをFn Serverにデプロイ $ fn invoke myapp gofn # Functionをトリガー(内部はHTTP呼び出し)

Slide 16

Slide 16 text

Cloud Native Developers JP Demo 動いているところを見てみよう 16

Slide 17

Slide 17 text

Cloud Native Developers JP 主要プログラミング言語をカバーするSDK (FDK) • Functionの実装には、Function Development Kit (FDK)を利用する • 公式サポートFDK – Go, Java, Python, Ruby, Node.js • コミュニティでサポートされるFDK – C# / .NET Core 17

Slide 18

Slide 18 text

Cloud Native Developers JP Functionのカスタマイズ性の高さ • Functionのベースイメージに任意のカスタマイズを実施可能 – Dockerfileを自作して、それを利用したFunctionを作成することができる[^1] 18 FROM fnproject/node RUN apk add --no-cache imagemagick WORKDIR /function ADD . /function/ COPY --from=build-stage /function/node_modules/ /function/node_modules/ ENTRYPOINT ["node", "func.js"] [^1] Functionのロジックの実装にはFDKを利用する必要があるかも…。 i Imagemagickを利用したnode.jsのFunctionを作成する例

Slide 19

Slide 19 text

Cloud Native Developers JP 19

Slide 20

Slide 20 text

Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. もっと本格的な使い方 20

Slide 21

Slide 21 text

Cloud Native Developers JP もっと本格的な使い方 • Fn Flowで複数のFunctionを協調動作 • 本気(プロダクション)で動かすには • マネージドサービス、あります 21

Slide 22

Slide 22 text

Cloud Native Developers JP Fn Flow • 複数のFunctionを連結させる動作を記述 • Javaを使った手続き的記述により、フローを定義 – テストしやすい – デバッグしやすい – 読んで理解しやすい – エラー処理で死なない 22

Slide 23

Slide 23 text

Cloud Native Developers JP Fn Flow • 並列・非同期のFunction連結 23 Flow flow = Flows.currentFlow(); FlowFuture f1 = flow.supply(() -> { try { Thread.sleep((long)(Math.random() * 5000)); } catch (Exception e) { /* handle exception */ } return "Hello"; }); FlowFuture f2 = flow.supply(() -> { try { Thread.sleep((long)(Math.random() * 5000)); } catch (Exception e) { /* handle exception */ } return "World"; }); flow.anyOf(f1, f2).thenApply(result -> ((String)result).toUpperCase());

Slide 24

Slide 24 text

Cloud Native Developers JP Fn Flow • エラーハンドリング 24 Flow flow = Flows.currentFlow(); FlowFuture f1 = flow.supply(() -> { if (System.currentTimeMillis() % 2L == 0L) { throw new RuntimeException("Error in stage"); } return 100; }).handle((val, err) -> { if (err != null){ return "An error occurred in this function"; } else { return "The result was good: " + val; } });

Slide 25

Slide 25 text

Cloud Native Developers JP 25 本気(プロダクション)で動かすには

Slide 26

Slide 26 text

Cloud Native Developers JP 本気(プロダクション)で動かすには • Fn LB – Fn Server専用に実装されたロードバランサー – 複数のFn Serverを透過的にひとつに見せる – Fn Server群のヘルスチェック、ルーティングの制御など 26 • Database – Fn Serverのメタデータストア – MySQL, sqlite3, Postgresが利用可能 • Message Queue – Functionの非同期実行のためのキュー – Redis, Kafkaに対応 • メトリクス監視 – OpenTracing API for metrics – Prometheus – Syslog経由のログ収集

Slide 27

Slide 27 text

Cloud Native Developers JP 本気(プロダクション)で動かすには • やっぱ に乗せたいですよね…? • Helm Chartあります – https://github.com/fnproject/fn-helm 27

Slide 28

Slide 28 text

Cloud Native Developers JP マネージドサービスが登場予定 • KubeCon 2018@Seattle にてFn Projectのマネージド・サービスが Oracle Functionsとしてアナウンスされました • 現在 Limited Availability ステータスで提供中 28 https://blogs.oracle.com/cloud-infrastructure/announcing-oracle-functions

Slide 29

Slide 29 text

Cloud Native Developers JP まとめ • Fn ProjectはFaaSを構築するためのOSS • 開発者エクスペリエンス重視の設計 – コマンド2発でServer起動 – 簡単にFunctionが作れてカスタマイズ性も高い • 簡単に触って遊べるのでぜひ試してみてください! 30

Slide 30

Slide 30 text

Cloud Native Developers JP Fin. 31