Fn Projectの話 / about Fn Project

Fn Projectの話 / about Fn Project

「Fn Project」という、FaaSを構築するためのOSSの話です。
Cloud Native Developers JP #cndjp 第11回勉強会での発表資料です。
https://cnd.connpass.com/event/125899/

36bb9dcd778d2a9621d44e92425d0907?s=128

hhiroshell

April 17, 2019
Tweet

Transcript

  1. Cloud Native Developers JP Fn Projectの話 @hhiroshell 1

  2. Cloud Native Developers JP • 早川 博(はやかわ ひろし) • 日本オラクル所属

    – Cloud Nativeな技術スタック担当のSA – Microservices / DevOps • Cloud Native Developers JP オーガナイザー 自己紹介 @hhiroshell 2 ※ 遊舎工房さんの店舗はこちら
  3. Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn

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

    Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. Fn Projectでもっと遊ぼう 4
  5. Cloud Native Developers JP Fn Projectとは • Function as a

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

  7. 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ホスト
  8. 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 >_
  9. Cloud Native Developers JP Function • Functionのワークロードの実態 • Functionの一つ一つはDockerコンテナ •

    Functionを作成するための材料 – Functionの実装コード • Functionで実行されるロジックを記述したファイル – func.yaml • Functionに与える設定などを記述するメタデータファイル – Dockerfile (optional) • Functionの実行環境となるコンテナをカスタマイズしたい場合に作成 9
  10. 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
  11. 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
  12. Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn

    Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. Fn Projectでもっと遊ぼう 12
  13. Cloud Native Developers JP Fn Projectの開発者エクスペリエンス • 極めて簡単に使い始められる – Dockerさえあれば今すぐに

    – シンプルなCLIで • 主要プログラミング言語をカバーするSDK (FDK) • Functionのカスタマイズ性の高さ 13
  14. 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
  15. 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呼び出し)
  16. Cloud Native Developers JP Demo 動いているところを見てみよう 16

  17. Cloud Native Developers JP 主要プログラミング言語をカバーするSDK (FDK) • Functionの実装には、Function Development Kit

    (FDK)を利用する • 公式サポートFDK – Go, Java, Python, Ruby, Node.js • コミュニティでサポートされるFDK – C# / .NET Core 17
  18. 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を作成する例
  19. Cloud Native Developers JP 19

  20. Cloud Native Developers JP Fn Projectの話 - 目次 1. Fn

    Projectとは 2. Fn Projectの最大の特徴: 開発者エクスペリエンス 3. もっと本格的な使い方 20
  21. Cloud Native Developers JP もっと本格的な使い方 • Fn Flowで複数のFunctionを協調動作 • 本気(プロダクション)で動かすには

    • マネージドサービス、あります 21
  22. Cloud Native Developers JP Fn Flow • 複数のFunctionを連結させる動作を記述 • Javaを使った手続き的記述により、フローを定義

    – テストしやすい – デバッグしやすい – 読んで理解しやすい – エラー処理で死なない 22
  23. Cloud Native Developers JP Fn Flow • 並列・非同期のFunction連結 23 Flow

    flow = Flows.currentFlow(); FlowFuture<String> f1 = flow.supply(() -> { try { Thread.sleep((long)(Math.random() * 5000)); } catch (Exception e) { /* handle exception */ } return "Hello"; }); FlowFuture<String> 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());
  24. Cloud Native Developers JP Fn Flow • エラーハンドリング 24 Flow

    flow = Flows.currentFlow(); FlowFuture<String> 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; } });
  25. Cloud Native Developers JP 25 本気(プロダクション)で動かすには

  26. 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経由のログ収集
  27. Cloud Native Developers JP 本気(プロダクション)で動かすには • やっぱ に乗せたいですよね…? • Helm

    Chartあります – https://github.com/fnproject/fn-helm 27
  28. Cloud Native Developers JP マネージドサービスが登場予定 • KubeCon 2018@Seattle にてFn Projectのマネージド・サービスが

    Oracle Functionsとしてアナウンスされました • 現在 Limited Availability ステータスで提供中 28 https://blogs.oracle.com/cloud-infrastructure/announcing-oracle-functions
  29. Cloud Native Developers JP まとめ • Fn ProjectはFaaSを構築するためのOSS • 開発者エクスペリエンス重視の設計

    – コマンド2発でServer起動 – 簡単にFunctionが作れてカスタマイズ性も高い • 簡単に触って遊べるのでぜひ試してみてください! 30
  30. Cloud Native Developers JP Fin. 31