OpenFaas | 新規に Function を作成する

OpenFaas の新規 Faunction を作成してみた。

プロジェクトを作成する

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
$ faas-cli new helloworld --lang node
2020/10/08 23:29:19 No templates found in current directory.
2020/10/08 23:29:19 Attempting to expand templates from https://github.com/openfaas/templates.git
2020/10/08 23:29:22 Fetched 12 template(s) : [csharp dockerfile go java11 java11-vert-x node node12 php7 python python3 python3-debian ruby] from https://github.com/openfaas/templates.git
Folder: helloworld created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|


Function created in folder: helloworld
Stack file written: helloworld.yml

Notes:
You have created a new function which uses Node.js 12.13.0 and the OpenFaaS
Classic Watchdog.

npm i --save can be used to add third-party packages like request or cheerio
npm documentation: https://docs.npmjs.com/

For high-throughput services, we recommend you use the node12 template which
uses a different version of the OpenFaaS watchdog.

ディレクトリー構成

1
2
3
4
5
+- helloworld
| +- handler.js
| +- package.json
+- helloworld.yml
+- template

helloworld.yml

1
2
3
4
5
6
7
8
9
version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:8080
functions:
helloworld:
lang: node
handler: ./helloworld
image: helloworld:latest

helloworld/handler.js

1
2
3
4
5
"use strict"

module.exports = async (context, callback) => {
return {status: "done"}
}

helloworld/package.json

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "function",
"version": "1.0.0",
"description": "",
"main": "handler.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

ビルドする

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
$ faas-cli build -f  helloworld.yml --tag latest
[0] > Building helloworld.
Clearing temporary build folder: ./build/helloworld/
Preparing: ./helloworld/ build/helloworld/function
Building: helloworld:latest with node template. Please wait..
Sending build context to Docker daemon 10.24kB
Step 1/24 : FROM openfaas/classic-watchdog:0.18.1 as watchdog
0.18.1: Pulling from openfaas/classic-watchdog
ff01b6ed694a: Pulling fs layer
ff01b6ed694a: Verifying Checksum
ff01b6ed694a: Download complete
ff01b6ed694a: Pull complete
Digest: sha256:35bda3fcffdd89c21f990f240434799901c80627280eca86eec56db71b8bb30d
Status: Downloaded newer image for openfaas/classic-watchdog:0.18.1
---> 94b5e0bef891
Step 2/24 : FROM node:12.13.0-alpine as ship
12.13.0-alpine: Pulling from library/node
89d9c30c1d48: Pulling fs layer
cb4880ccba47: Pulling fs layer
abc31ffc07f9: Pulling fs layer
2137f333b9e3: Pulling fs layer
2137f333b9e3: Waiting
abc31ffc07f9: Verifying Checksum
abc31ffc07f9: Download complete
2137f333b9e3: Verifying Checksum
2137f333b9e3: Download complete
89d9c30c1d48: Verifying Checksum
89d9c30c1d48: Download complete
89d9c30c1d48: Pull complete
cb4880ccba47: Verifying Checksum
cb4880ccba47: Download complete
cb4880ccba47: Pull complete
abc31ffc07f9: Pull complete
2137f333b9e3: Pull complete
Digest: sha256:ae1822c17b0087cb1eea794e5a293d56cc1fe01f01ef5494d0687c1ef9584239
Status: Downloaded newer image for node:12.13.0-alpine
---> 69c8cc9212ec
Step 3/24 : COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
---> 0d8cef32e5ce
Step 4/24 : RUN chmod +x /usr/bin/fwatchdog
---> Running in 84ddf13b5fbb
Removing intermediate container 84ddf13b5fbb
---> b7ff78b8de4e
Step 5/24 : RUN addgroup -S app && adduser app -S -G app
---> Running in 8c5280c36c8a
Removing intermediate container 8c5280c36c8a
---> adf3b4c4ad47
Step 6/24 : WORKDIR /root/
---> Running in bb7b88bcddaf
Removing intermediate container bb7b88bcddaf
---> 964f0842c13f
Step 7/24 : ENV NPM_CONFIG_LOGLEVEL warn
---> Running in dd2943d1faa7
Removing intermediate container dd2943d1faa7
---> d96b345eea76
Step 8/24 : RUN mkdir -p /home/app
---> Running in 594a762249d0
Removing intermediate container 594a762249d0
---> 083e98320980
Step 9/24 : WORKDIR /home/app
---> Running in 5a89fcb009ee
Removing intermediate container 5a89fcb009ee
---> e531d77c5346
Step 10/24 : COPY package.json ./
---> 7df42d225567
Step 11/24 : RUN npm i --production
---> Running in 494f5f11a208
npm WARN NodejsBase@1.0.0 No description
npm WARN NodejsBase@1.0.0 No repository field.

added 1 package from 1 contributor and audited 1 package in 3.15s
found 0 vulnerabilities

Removing intermediate container 494f5f11a208
---> 913b9492cd65
Step 12/24 : COPY index.js ./
---> 81889e9d110f
Step 13/24 : WORKDIR /home/app/function
---> Running in 9c7866e8887b
Removing intermediate container 9c7866e8887b
---> 786993c20bbd
Step 14/24 : COPY function/*.json ./
---> 90ff8572ec31
Step 15/24 : RUN npm i --production || :
---> Running in 02796559aa72
npm WARN function@1.0.0 No description
npm WARN function@1.0.0 No repository field.

up to date in 1.098s
found 0 vulnerabilities

Removing intermediate container 02796559aa72
---> 14c02000daae
Step 16/24 : COPY --chown=app:app function/ .
---> 78fc7a0cf672
Step 17/24 : WORKDIR /home/app/
---> Running in 52899ad11fa2
Removing intermediate container 52899ad11fa2
---> e7e44e1df539
Step 18/24 : RUN chmod +rx -R ./function && chown app:app -R /home/app && chmod 777 /tmp
---> Running in 5c73572cb3d0
Removing intermediate container 5c73572cb3d0
---> f6775e90aba9
Step 19/24 : USER app
---> Running in 911209957ac3
Removing intermediate container 911209957ac3
---> fcf1749a262c
Step 20/24 : ENV cgi_headers="true"
---> Running in ea9063d5f220
Removing intermediate container ea9063d5f220
---> 62fe360f6f83
Step 21/24 : ENV fprocess="node index.js"
---> Running in d8bd69571b46
Removing intermediate container d8bd69571b46
---> 3a6b49cd10ac
Step 22/24 : EXPOSE 8080
---> Running in 0241fc8252d9
Removing intermediate container 0241fc8252d9
---> 71d6a75cac8e
Step 23/24 : HEALTHCHECK --interval=3s CMD [ -e /tmp/.lock ] || exit 1
---> Running in 986fcb66d56a
Removing intermediate container 986fcb66d56a
---> db0f922c3436
Step 24/24 : CMD ["fwatchdog"]
---> Running in 1a2ee6e69f1d
Removing intermediate container 1a2ee6e69f1d
---> 4634303e208d
Successfully built 4634303e208d
Successfully tagged helloworld:latest
Image: helloworld:latest built.
[0] < Building helloworld done in 271.32s.
[0] Worker done.

Total build time: 271.32s

OpenFaas では、リクエストとレスポンスを管理するために Watchdog という仕組みが提供されている。

実行ログから Wathcdog として classic-watchdog をイメージを使用していることがわかる。また、コンテナが起動すると Watchdog のコマンドである fwatchdog プロセスを起動して動作を管理していることもわかる。

Docker イメージが生成されていることを確認する

1
2
3
$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest 4634303e208d 2 minutes ago 96MB

OpenFaaS にデプロイする

1
2
3
4
5
6
$ faas-cli deploy -f helloworld.yml
Deploying: helloworld.
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/helloworld.openfaas-fn

デプロイ結果を確認する

管理画面でデプロイ結果を確認する

ブラウザーで管理画面にアクセスすると、デプロイされていることを確認できる。

  1. Function の一覧に作成した Function 名が表示されている

  2. Function 名をクリックすると詳細が表示される

faas-cli list コマンドでデプロイ結果を確認する

コマンドラインからは、faas-cli list コマンドでデプロイされている Function の一覧が表示される。

1
2
3
$ faas-cli list
Function Invocations Replicas
helloworld 1 1

Function を実行する

faas-cli invoke コマンドで Function を実行する

fass-cli invoke で Fucntion を実行できる。標準入力に与えた内容が FUnction に送られ、その結果が標準出力に表示される。

1
2
3
$ faas-cli invoke helloworld
Reading from STDIN - hit (Control + D) to stop.
{"status":"done"}

管理画面で Function を実行する

Function の詳細画面にある[INVOKE] ボタンをクリックすると、Fucntion が実行され、結果が表示される。

curl で Function を実行する

curl で <OpenFaaS ゲートウェイ>/function/<Function 名> で Fucntion を実行できる。

curl 172.23.155.62:8080/function/helloworld
{“status”:”done”}

Fucntion に引数を渡すには、 -d オプションまたは –data オプションで指定する。

curl 172.23.155.62:8080/function/helloworld -d ‘key=value’

INVOKE 回数を確認する

faas-cli list で Function が INVOKE された回数を確認できる。

1
2
3
$ faas-cli list
Function Invocations Replicas
helloworld 4 1

デプロイされた Function を削除する

デプロイできたの今度は、Function を削除してみる。

1
2
3
$ faas-cli remove -f helloworld.yml
Deleting: helloworld.openfaas-fn
Removing old function.

Function の一覧から Function 名が削除されている。