寝て起きて寝る

過ぎたるは及ばざるが如し

Doker for WindowsでFn Projectを動かしてみた

Doker for WindowsでFn Projectを動かした時のメモ

Fn Project

github.com

特徴

  • 「JavaOne 2017」の基調講演で、Oracleが発表したJava対応のオープンソースサーバレスプラットフォーム
  • 特徴
  • 簡単
    • 複雑なfunctionを実装するためのCLIを提供
  • 構成
    • Function Server(Docker)上にFunction(Docker)が乗っかる(Docker on Docker)
    • 起動するとFunctionのコンテナが立ち上がり一定時間後に消える

Function Serverの同期処理シーケンス

(非同期処理の場合はMQが使用される)

FnProject CLI toolのDownloadと設定

windowsの場合は下記からfn.exeを適当な場所へDownloadし、PATHを通す。

github.com

PATHが通っているかの確認
> fn --version
fn version 0.5.0

Fnction Serverの起動

ここではAPIのMetadataを格納するDBのファイルを"C:\mnt\docker\fnserver\data"へ置くように設定する。 (何も指定しないとSQLighのようだ)

docker run --rm --name fnserver -it -d -v /var/run/docker.sock:/var/run/docker.sock -v /c/mnt/docker/fnserver/data:/app/data -p 8080:8080 fnproject/fnserver
Fnction Serverの起動確認
> curl http://localhost:8080
{"goto":"https://github.com/fnproject/fn","hello":"world!"}

Functionの作成

JavaでのFunctionの作成方法

> fn init --runtime java --trigger http javafn
Creating function at: /javafn
Function boilerplate generated.
func.yaml created.
> tree /f                                                       
フォルダー パスの一覧:  ボリューム Windows                                     
ボリューム シリアル番号は 00000215 2E6B:1EF1 です                             
C:.                                                             
└─javafn                                                        
    │  func.yaml                                                
    │  pom.xml                                                  
    │                                                           
    └─src                                                       
        ├─main                                                  
        │  └─java                                               
        │      └─com                                            
        │          └─example                                    
        │              └─fn                                     
        │                      HelloFunction.java               
        │                                                       
        └─test                                                  
            └─java                                              
                └─com                                           
                    └─example                                   
                        └─fn                                    
                                HelloFunctionTest.java

FunctionはデフォルトではCold StandbyだがJavaでFunctionを作成するとHot Standbyで作成される。 Functionの定義ファイル"func.yaml"のformatがhttpだとHot Standbyのようだ。ちなみにアイドルタイムはデフォルトは30秒。 docs/hot-functions.md at master · fnproject/docs · GitHub

schema_version: 20180708
name: javafn
version: 0.0.1
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk9-1.0.70
run_image: fnproject/fn-java-fdk:jdk9-1.0.70
cmd: com.example.fn.HelloFunction::handleRequest
format: http
triggers:
- name: javafn-trigger
  type: http
  source: /javafn-trigger

作成したFunctionのデプロイ

作成されたFunctionのディレクトリでおこなう

> fn --verbose deploy --app javaapp --local

Functionの呼び出し

> fn invoke javaapp javafn
Hello, world!

> curl -d Java http://localhost:8080/t/javaapp/javafn-trigger
Hello, Java!

ダッシュボード

fn project用のUIが用意されている。 github.com

UIの起動
docker run --rm --name ui -it -d --link fnserver -p 4000:4000 -e "FN_API_URL=http://fnserver:8080" fnproject/ui

おまけ

Fnction ServerとUIを同時に動かすdocker-composeはこんな感じです。

docker-compose.yaml
version: '2'

services: 
  fnserver:
    image: fnproject/fnserver
    container_name: fnserver
    ports:
      - '8080:8080'
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/c/mnt/docker/fnserver/data:/app/data"

  fnui:
    image: fnproject/ui
    container_name: fnui
    ports:
      - '4000:4000'
    environment:
      FN_API_URL: "http://fnserver:8080"
    depends_on:
      - fnserver
docker-composeの起動
> set COMPOSE_CONVERT_WINDOWS_PATHS=1
> docker-compose up -d
Creating network "fnproject_default" with the default driver
Creating fnserver ... done
Creating ui       ... done

参考

Cloud Native Hiroshima #01で行ったLTスライド