/var/log/study

つまり雑記

iron functions を試す

世の中がサーバーレスアーキテクチャ!と言い出して数年たった。個人的な感想としてlambdaのイベントからキックされるモデルはとても良いと思う反面、APIゲートウェイとlambdaを組み合わせるアーキテクチャは負けだなぁと感じている。

話は変わるが、エンジニアのレイヤ的にもプログラミング言語的にも多様性がある環境では、「バッチなどの処理は問題ないがAPIに仕立てるのは...」 という場面に出くわすようになる。バッチ処理をコンテナ化したらAPIサーバーに仕立ててくれるOSSが無いかなぁ?などと思って見つけたのが iron function というサーバーである。

負けだなぁと思っていたアーキテクチャも、立場と捉え方が変わると欲しかったものに変わるもんだなぁと言うことも学べた。

とりあえず今日のブログは、モチベーションが下がらないうちにチュートリアルまで。後日、CLIツールやWeb UIなども検証してブログにするつもり

Iron.io Open Source - Functions

iron functions とは?

とあるURLに対して、実行するコンテナを登録できる、AWS API Gateway と lambda を組み合わせたようなサーバー

雑に特徴を書き下すと以下のような感じ

  • API
    • プロジェクトの作成ができる
    • プロジェクト配下のパスに、キックするDockerコンテナを登録する
    • http://${IP}:${PORT}/r/${PROJECT_NAME}/${REGISTER_PATH}
    • 登録されたパスで、Dockerコンテナをキックできる
    • キックされたDockerコンテナの標準出力がAPIのレスポンスになる
  • 利用可能なコンテナ
    • dockerhubに公開されいてるもの
    • きちんと立てたプライベートレジストリ
      • http認証しか無いinsecureなPrivateのコンテナレジストリを利用するのは現状無理そう
  • 構築
    • Docker run するだけ
  • その他
    • CLIがある
    • Web UIがある

基本的な検証

利用環境はvSphere環境上に立てたCoreOSの上

core@coreos004 ~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:ad:ce:53 brd ff:ff:ff:ff:ff:ff
    inet 172.0.1.36/24 brd 172.0.1.255 scope global dynamic ens192
       valid_lft 86276sec preferred_lft 86276sec
    inet6 fe80::250:56ff:fead:ce53/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d4:7f:04:bd brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
core@coreos004 ~ $ cat /etc/os-release 
NAME="Container Linux by CoreOS"
ID=coreos
VERSION=1632.3.0
VERSION_ID=1632.3.0
BUILD_ID=2018-02-14-0338
PRETTY_NAME="Container Linux by CoreOS 1632.3.0 (Ladybug)"
ANSI_COLOR="38;5;75"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://issues.coreos.com"
COREOS_BOARD="amd64-usr"
core@coreos004 ~ $ docker version
Client:
 Version:      17.09.1-ce
 API version:  1.32
 Go version:   go1.8.5
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:19:00 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.09.1-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.5
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:19:00 2017
 OS/Arch:      linux/amd64
 Experimental: false

構築

適当にディレクトリをほって、docker run するだけ

core@coreos004 ~/iron_functions $ pwd
/home/core/iron_functions
core@coreos004 ~/iron_functions $ docker run --rm -it --name functions -v ${PWD}/data:/app/data -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 iron/functions

動作チェックは手元のPCから以下のコマンド

⋊> ~ curl http://172.0.1.36:8080
{"goto":"https://github.com/iron-io/functions","hello":"world!"}

チュートリアル的な

プロジェクト作成 -> パスとコンテナの登録 -> 実行

プロジェクト名はmyapp, パスはhello, 実行するコンテナはiron/hello となっており、最終的には http://172.0.1.36:8080/r/myapp/helloAPIが叩けるようになる

まずプロジェクトの作成を手元のPCからcurlで実行

#コマンド
curl -H "Content-Type: application/json" -X POST -d '{"app": { "name":"myapp" }}' http://172.0.1.36:8080/v1/apps
#レスポンス
{"message":"App successfully created","app":{"name":"myapp","config":null}}

パスの登録も手元のPCからcurlで実行

#コマンド
curl -H "Content-Type: application/json" -X POST -d '{
         "route": {
             "path":"/hello",
             "image":"iron/hello"
         }
     }' http://172.0.1.36:8080/v1/apps/myapp/routes
# レスポンス
{"message":"Route successfully created","route":{"app_name":"myapp","path":"/hello","image":"iron/hello","memory":128,"headers":{},"type":"sync","format":"default","max_concurrency":1,"timeout":30,"idle_timeout":0,"config":{},"jwt_key":""}}

コンテナの動作チェック。ちなみに初回実行時はコンテナのpullで多少時間がかかる

curl http://172.0.1.36:8080/r/myapp/hello

出力

Hello World!

まとめ

とりあえず、コンテナを登録して実行するところまでは速攻で終わった。めちゃ簡単。

前述のとおり、明日にでもWebUIとCLIを試した記事を挙げるつもり。