ただ私自身、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 件のコメント :
コメントを投稿