2018/05/31

OpenFaaSでFaaS環境を用意しサーバーレスアーキテクチャを体験する

数年前から何かと「サーバーレス」がバズワードになっている。自分でサーバーを用意してAPIサーバーを立てて使うという時代から、人間はより本質的な部分に注力すべきという考え方からFaaS環境を使う時代に変わってきた。

ただ私自身、AWS LambdaやGCP Cloud Functionsなどのいわゆる「サーバーレス」というものを体験したことがない。それらのサービスは従量課金で一歩間違ったらクラウド破産しかねないため、その恐怖感もあったからだ。


しかしこのままでは時代の波に取り残されてしまうと思い、いろいろ調べたところOpenFaaSというOSSに出会った。

ということで、OpenFaaSを使って自分専用のFaaS環境を用意し、思う存分使ってみようと思う。


開発環境は以下のとおり。
  • CentOS@7.4
  • OpenFaaS@0.8.2
  • docker@18.03.1-ce
  • docker-compose@1.21.2


OpenFaaSでFaaS環境をつくる


今回はCentOS@7.4にOpenFaaSをインストールする。UbuntuでもmacOSでも、Dockerが動く環境さえあれば使えるので、お好みに合わせて環境を選んでください。
# CentOSのバージョン確認
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

# とりあえずアップデート
$ yum update -y

Dockerをインストールする


OpenFaaSはDocker Swarmの他にもKubernetesでも動かすことができるのだが、今回はより簡単なDocker Swarmモードでインストールする。

まずは古いDockerがインストールされていたらアンインストールする。
# Dockerがインストールされているか確認
$ yum search docker

# もし古いDockerがインストールされていたらアンインストールする
$ yum remove docker \
             docker-client \
             docker-client-latest \
             docker-common \
             docker-latest \
             docker-latest-logrotate \
             docker-logrotate \
             docker-selinux \
             docker-engine-selinux \
             docker-engine


次に新しいDockerをインストールする。
# Dockerをインストールするためにリポジトリの設定をする
$ yum install -y yum-utils \
               device-mapper-persistent-data \
               lvm2

$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# Docker CEをインストールする
$ yum install docker-ce

$ docker --version
Docker version 18.03.1-ce, build 9ee9f40


最後にDockerのサービスを起動して終了。
# Dockerサービスを起動する
$ systemctl start docker

# Dockerサービスの自動起動を有効にする
$ systemctl enable docker



docker-composeをインストールする


OpenFaaSではdocker-composeを使うので、最新版をインストールする。
# docker-composeをインストールする(※執筆時点では1.21.2が最新
$ curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

# docker-composeを実行できるようにパーミッションに実行権限を追加
$ chmod +x /usr/local/bin/docker-compose

$ docker-compose --version
docker-compose version 1.21.2, build a133471



OpenFaaSをインストールする


OpenFaaSのインストールは非常に簡単だ。githubからリポジトリをクローンして、デプロイ用のスクリプトを実行するだけで終わる。

!!注意点!!
  • 最新機能が使いたい場合はmasterブランチでもOKだが、初心者には1つ前の安定バージョンが推奨されている
  • セキュリティ対策がされていないのでパブリックなインターネットに公開する場合はプロキシに認証をつけたり、TSL化する必要がある

# Docker Swarmモードを初期化する
$ docker swarm init

# OpenFaaSをクローンして、デプロイ用のスクリプトを実行する
$ git clone https://github.com/openfaas/faas
$ cd faas

# クローンしたブランチを確認
$ git status
# On branch master
nothing to commit, working directory clean

# 最新機能を使う場合はmasterで大丈夫だが、初心者には1つ前のバージョンを使うことが推奨されているので、ブランチを変更

$ git tag
~~略~~
0.7.9
0.8.0
0.8.1
0.8.2
~~略~~

# 最新のタグをチェックアウトする
$ git checkout 0.8.2

# デプロイスクリプトを実行
$ ./deploy_stack.sh

# Dockerのコンテナが起動していることを確認
$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED              STATUS                        PORTS                NAMES
292a49d05f21        functions/queue-worker:0.4.3       "./app"                  48 seconds ago       Up 42 seconds                 8080/tcp             func_queue-worker.1.r6tp6t01dn1jr2ateugat1kbv
b43785567d84        nats-streaming:0.6.0               "/nats-streaming-ser…"   50 seconds ago       Up 47 seconds                 4222/tcp, 8222/tcp   func_nats.1.rxtuzohw3w11bqyspkuit7ml1
0c69ff6789bf        functions/gateway:0.8.1            "./gateway"              50 seconds ago       Up 44 seconds                 8080/tcp             func_gateway.1.gsyzvu0hjg68cs3kx9mxboci9
173e1e158f65        functions/alpine:latest            "fwatchdog"              51 seconds ago       Up 47 seconds (healthy)                            func_wordcount.1.msd12fsi51nholczuw76vif2z
2a70850cfb91        functions/hubstats:latest          "/usr/bin/fwatchdog"     55 seconds ago       Up 54 seconds (healthy)                            func_hubstats.1.wfzqcufwmn2g0k1ai9i2vqcy5
3216f1fed572        prom/prometheus:v2.2.0             "/bin/prometheus --c…"   58 seconds ago       Up 57 seconds                 9090/tcp             func_prometheus.1.zcuuzhhkl18rlchqku3wyx731
01af40c8990a        functions/alpine:latest            "fwatchdog"              About a minute ago   Up About a minute (healthy)                        func_base64.1.sxeyfq1odmfys8awj7blp1lkn
eafe4b30ab01        functions/markdown-render:latest   "/usr/bin/fwatchdog"     About a minute ago   Up About a minute                                  func_markdown.1.3sx5psvgfqrd7e4a9xf3u0ffe
8f7e0469e449        functions/alpine:latest            "fwatchdog"              About a minute ago   Up About a minute (healthy)                        func_echoit.1.ljhilqm07qtpd6yru9vgpy40n
09f0b8c29a43        prom/alertmanager:v0.15.0-rc.0     "/bin/alertmanager -…"   About a minute ago   Up About a minute             9093/tcp             func_alertmanager.1.ityi45c4s96kncvzasogu0jmy
def0292893b5        functions/faas-swarm:0.2.7         "./faas-swarm"           About a minute ago   Up About a minute             8080/tcp             func_faas-swarm.1.um28qfkb6ymkqnn0s3tl2eogx
bcb97cddb952        functions/nodeinfo:latest          "fwatchdog"              About a minute ago   Up About a minute (healthy)                        func_nodeinfo.1.v3wexejcm89p3vy4scriiu9ss


これで完了。あとはcurlコマンドでちゃんとアクセスできるか確認する。
# アクセスできるか確認
$ curl http://127.0.0.1:8080
<a href="/ui/">Moved Permanently</a>.



Functionをつくる(テンプレート)


あらかじめいくつかのFunctionテンプレートがストアに公開されている。
まずはそのテンプレートを使ってFaaSを体験してみる。

http://{your_server_ip_address}:8080にアクセスするとポータルページが表示される。

次に「Deploy New Function」から試しに「QR Code Generator」をデプロイしてみる。

最後にcurlコマンドでURLをPOSTし、QRコード画像を生成する。
$ curl http://59.106.213.253:8080/function/qrcode-go --data "http://example.com" > qrcode.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   589  100   571  100    18  12708    400 --:--:-- --:--:-- --:--:-- 12977


自分でFunctionをつくる


OpenFaaSでは、C#、Go、Node.js、Python、Rubyのテンプレートが用意されている。もちろん自分でテンプレートを作ることができるので、他の言語が使いたい場合はその言語用のDockerfileを作れば良い。

まずはOpenFaaSにFunctionを登録・デプロイするためにopenfaas-cliをインストールする。
# faas-cliをインストールする
$ curl -sSL https://cli.openfaas.com | sh

$ faas-cli version
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

Commit: 6532f3c66967b3a872208a29b1b60a873b7d2490
Version: 0.6.9


次にFunctionをまとめて管理したいので、functionsというディレクトリをつくる。
$ cd ~
$ mkdir functions
$ cd functions



今回はNode.jsのFunctionをつくる。他の言語で開発したい場合は---lang {言語}とすれば良い。
$ faas-cli new hello-faas --lang node

./functions
|-- hello-faas        // <-- Functionの実体
|    |--handler.js
|    |--package.json
|-- hello-faas.yaml   // <-- Functionの実行環境の設定(ルートやhandlerなど)
|-- template          // <-- 各言語のテンプレート(Dockerfileやhandlerなど)



./functions/hello-faas/handler.jsの中身を確認する。
"user strict";

module.export = (context, callback) => {
  callback(undefined, { status: "done" });
}


あとはビルド(Dockerイメージの作成)をして、OpenFaaSにpush、デプロイする。
# hello-faasをビルド(Dockerイメージが作成される)
$ faas-cli build -f hello-faas.yml

# ビルドしたfunctionをpushしてOpenFaaSに登録する
$ faas-cli push -f hello-faas.yml

# デプロイする
$ faas-cli deploy -f hello-faas.yml
Deploying: hello-faas.

Deployed. 200 OK.
URL: http://127.0.0.1:8080/function/hello-faas


最後にcurlコマンドで動作確認をする。
$ curl http://127.0.0.1:8080/function/hello-faas
{"status":"done"}



こんな感じで、簡単にサーバーレスアーキテクチャの体験ができた!



参考サイト





以上

written by @bc_rikko

0 件のコメント :

コメントを投稿