Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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/

hhiroshell

April 17, 2019
Tweet

More Decks by hhiroshell

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. Cloud Native Developers JP 6

    View full-size slide

  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ホスト

    View full-size slide

  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
    >_

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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呼び出し)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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を作成する例

    View full-size slide

  19. Cloud Native Developers JP 19

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. 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());

    View full-size slide

  24. 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;
    }
    });

    View full-size slide

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

    View full-size slide

  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経由のログ収集

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. Cloud Native Developers JP
    Fin.
    31

    View full-size slide