OpenFaaS 関数のデプロイと実行呼び出し on ラズパイ5, Kubernetes

環境構築済み前提

https://qiita.com/lovepi5/items/ea709929f498ff71010c

# とりあえずデフォルトのやつ使ってみる
ブラウザでopenfaasのgatewayにアクセス(ログインは[構築記事](https://qiita.com/lovepi5/items/ea709929f498ff71010c)参照)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835593/0c8a0f49-cc89-bdfe-9cb2-9688f9c9fab8.png)

「Deploy New Function」からNodeInfoを選択してデプロイ。

- ブラウザから実行
「INVOKE」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835593/88f6ee0c-abf4-3fa8-6472-973f6cc689c9.png)

- curlで呼び出し
アクセス先は関数のURLになる。(http://< gateway or gateway-externalのアドレスおよびポート番号 >/function/nodeinfo)

```
$ curl https://faas.example.com/function/nodeinfo
もしくは
$ curl -X POST https://faas.example.com/function/nodeinfo
Hostname: nodeinfo-77c6756589-qgmtm

Arch: arm64
CPUs: 4
Total mem: 8048MB
Platform: linux
Uptime: 395436.03
```
プロキシ挟んでる(私の場合はcloudflareのトンネル使っている)場合、301が返される場合がありました。
```
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>cloudflare</center>
</body>
</html>
```
その場合は`curl -L -X POST`でリダイレクト有効にしてください。

# 関数を自作してデプロイしてみる
## テンプレートの取得
`faas-cli list`でデプロイされている関数一覧が取得できる。
```
Function                        Invocations     Replicas
nodeinfo                        18              1
```

関数を保管するディレクトリ(Functions)を作っておいて、そこで実行するのがいいかと思います。

利用可能な言語テンプレートは
```
faas-cli template store list
```
今回はpython3-httpを使います。
```
$ faas-cli new fizzbuzz --lang python3-http
2024/07/20 10:23:46 No templates found in current directory.
2024/07/20 10:23:46 Attempting to expand templates from https://github.com/openfaas/templates.git
2024/07/20 10:23:49 Fetched 18 template(s) : [bun csharp dockerfile go java11 java11-vert-x node node14 node16 node17 node18 node20 php7 php8 python27 python3 python3-debian ruby] from https://github.com/openfaas/templates.git
Template: "python3-http" was not found in the templates directory
```
が、not foundと言われてしまいました。
一旦pullしてからにします。
```
$ faas-cli template store pull python3-http
$ faas-cli new fizzbuzz --lang python3-http

$ ls
fizzbuzz  fizzbuzz.yml  template

$ tree fizzbuzz
fizzbuzz
├── handler.py
├── handler_test.py
├── requirements.txt
└── tox.ini

1 directory, 4 files
```

## プログラム作成
https://docs.openfaas.com/languages/python/

```fizzbuzz/handler.py
def handle(event, context):
    if event.method != "GET":
        return {
            "statusCode": 405,
            "body": "Method not allowed\n"
        }
    response = ""
    try:
        number = int(event.query["number"])
        if number % 3 == 0 and number % 5 == 0:
            response = "FizzBuzz"
        elif number % 3 == 0:
            response = "Fizz"
        elif number % 5 == 0:
            response = "Buzz"
        else:
            response = str(number)
        return {
            "statusCode": 200,
            "body": response + "\n"
        }
    except (KeyError, ValueError):
        return {
            "statusCode": 406,
            "body": "Invalid input\n"
        }
```
GETメソッドのみ許可、クエリパラメータで値を渡す形式にしました。
POSTならevent.bodyになります。

handler_test.pyにてテストプログラム書けそうに見えますが、
構文エラーにしてもデプロイできたので、使えなさそうです。
(--build-argにTEST_ENABLED=trueいれてもダメでした。)

# いざデプロイ
手順だけ載せます。
本当は色々あったのですが、詳細は↓

https://qiita.com/lovepi5/items/c4c33cdc78feb5751616

## 事前準備
- [Docker Hub](https://hub.docker.com/)のアカウント作成
- コンソールでDockerログイン
```
$ docker login -u [Docker Account Name] --password ********
```
- イメージ名の最初にDockerのアカウント名入れる
```fizzbuzz.yml
image: [Docker Account Name]/fizzbuzz:latest
```

## デプロイ
```
$ DOCKER_BUILDKIT=1 faas-cli up -f fizzbuzz.yml --no-cache --build-arg platform=linux/arm64/v8
```
成功すれば
```
$ faas-cli list
Function                        Invocations     Replicas
fizzbuzz                        32              1    
nodeinfo                        18              1
```
ブラウザでも確認できる
![fizzbuzzimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835593/c78e8506-5442-5f4b-4cec-b0285a5862a0.png)

## 実行してみる
ブラウザで表示されているURLにアクセス
クエリパラメータに`number=5`など適当な数字(数字以外でも)を入れてあげる
もしくはcurlからでも
```
$ curl https://faas.genserver.net/function/fizzbuzz?number=5
Buzz
```
ちなみにOpenFaaSの画面からINVOKEを実行した場合はPOSTメソッドとなるので、このプログラムでは405を返す。

# お片付け
```
$ faas-cli remove fizzbuzz
```
またビルドしたdockerのイメージがローカル、Docker Hubにそれぞれ残っているので、不要であれば削除する。
```
$ docker rmi [Docker Account Name]/fizzbuzz
```
Docker Hubのイメージはブラウザから削除。