_作者はhttps://www.brightfunds.org/funds/diversity-in-tech [技術基金の多様性]を選択して、https://do.co/w4do-cta [Donationsの書き込み]の一部として寄付を受け取りました]プログラム。

前書き

サーバーレスアーキテクチャは、サーバーインスタンスを開発者から隠し、通常、開発者がクラウドでアプリケーションを実行できるようにするAPIを公開します。 このアプローチにより、開発者は適切なDevOpsチームにインスタンスのプロビジョニングとメンテナンスを任せることができるため、アプリケーションを迅速に展開できます。 また、適切なツールを使用して、要求ごとにインスタンスをスケーリングできるため、インフラストラクチャコストも削減されます。

サーバーレスプラットフォームで実行されるアプリケーションは、_サーバーレス機能_と呼ばれます。 関数は、特定の操作を実行するために使用されるコンテナー化された実行可能コードです。 アプリケーションをコンテナ化することで、多くのマシンで一貫した環境を再現でき、更新とスケーリングが可能になります。

OpenFaaSは、サーバーレス機能を構築およびホストするための無料のオープンソースフレームワークです。 Docker Swarmとhttps://kubernetes.io/[Kubernetes]の両方を公式にサポートしているため、強力なAPI、コマンドラインを使用してアプリケーションをデプロイできます。インターフェース、またはWeb UI。 https://prometheus.io [Prometheus]が提供する組み込みメトリックが付属し、オンデマンドでの自動スケーリングとゼロからのスケーリングをサポートします。

このチュートリアルでは、Ubuntu 16.04で実行されるDocker SwarmでOpenFaaSを設定して使用し、https://traefik.io/ [Traefik]をhttps://letsencrypt.org/で設定してWeb UIとAPIを保護します。 [Let’s Encypt]。 これにより、クラスター内のノード間、およびOpenFaaSとそのオペレーター間の安全な通信が保証されます。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • ローカルマシンで実行されているUbuntu 16.04。 他のディストリビューションおよびオペレーティングシステムを使用できますが、オペレーティングシステムに適切なOpenFaaSスクリプトを使用し、これらの前提条件にリストされているすべての依存関係をインストールしてください。

  • ローカルマシンにインストールされている + git、` + curl`、および + jq。 「+ git 」を使用してOpenFaaSリポジトリのクローンを作成し、「 curl 」を使用してAPIをテストし、「 jq 」を使用して生のhttps://www.digitalocean.com/community/tutorials/an-introduction-toを変換します-json [JSON] APIから人間が読み取れるJSONへの応答。 このセットアップに必要な依存関係をインストールするには、次のコマンドを使用します: ` sudo apt-get update && sudo apt-get install git curl jq +`

  • Dockerをインストールして使用する方法Ubuntu 16.04

  • https://hub.docker.com [Docker Hub]アカウント。 OpenFaaSに機能を展開するには、パブリックコンテナーレジストリに公開する必要があります。 このチュートリアルでは、無料で広く使用されているDocker Hubを使用します。 `+ docker login`コマンドを使用して、ローカルマシン上のDockerで必ず認証してください。

  • Docker Machineがインストールされ、https://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-withに従ってインストールされる-docker-machine-on-ubuntu-16-04 [Ubuntu 16.04でDocker Machineを使用してリモートDockerホストをプロビジョニングおよび管理する方法]。

  • DigitalOceanの個人アクセストークン。 トークンを作成するには、https://www.digitalocean.com/docs/api/create-personal-access-token/ [これらの手順]に従ってください。

  • https://www.digitalocean.com/community/tutorials/how-to-create-a-cluster-of-docker-containers-with-docker-swarm-and-digitaloceanによってプロビジョニングされた3ノードのDocker Swarmクラスター-on-ubuntu-16-04 [Ubuntu 16.04でDocker SwarmとDigitalOceanを使用してDockerコンテナのクラスターを作成する方法]。

  • Docker Swarmのインスタンスの1つを指すAレコードを持つ完全に登録されたドメイン名。 チュートリアル全体を通して、* example.com *がサ​​ンプルドメインとして表示されます。 これを独自のドメインに置き換えてください。https://namecheap.com/ [Namecheap]で購入するか、http://www.freenom.com/en/index.html [Freenom]で無料で入手できます。 。 選択した別のドメインレジストラーを使用することもできます。

ステップ1-OpenFaaSのダウンロードとOpenFaaS CLIのインストール

OpenFaaSをDocker Swarmにデプロイするには、デプロイマニフェストとスクリプトをダウンロードする必要があります。 それらを取得する最も簡単な方法は、公式のOpenFaasリポジトリのクローンを作成し、OpenFaaSリリースを表す適切なタグをチェックアウトすることです。

リポジトリのクローンに加えて、FaaS CLIもインストールします。これは、ターミナルから新しい機能を管理および展開するために使用できる強力なコマンドラインユーティリティです。 ほとんどの主要なプログラミング言語で独自の関数を作成するためのテンプレートを提供します。 https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-openfaas-using-docker-swarm-on-ubuntu-16-04#step-7-%E2%80% 94-creating-functions-with-the-faas-cli [ステップ7]、これを使用してhttps://www.digitalocean.com/community/tags/python[Python]関数を作成し、OpenFaaSにデプロイします。

このチュートリアルでは、OpenFaaS vをデプロイします。 他のバージョンをデプロイする手順は似ているはずですが、https://github.com/openfaas/faas-cli/blob/master/CHANGELOG.md [project changelog]をチェックアウトして、重大な変更がないことを確認してください。

まず、ホームディレクトリに移動し、次のコマンドを実行してリポジトリを `+〜/ faas +`ディレクトリに複製します。

cd ~
git clone https://github.com/openfaas/faas.git

新しく作成された `+〜/ faas +`ディレクトリに移動します:

cd ~/faas

リポジトリのクローンを作成すると、最新の変更を含むファイルがmasterブランチから取得されます。 重大な変更はmasterブランチに入る可能性があるため、実稼働環境での使用は推奨されません。 代わりに、 `++`タグをチェックしてみましょう。

git checkout

出力には、正常なチェックアウトに関するメッセージと、このブランチへの変更のコミットに関する警告が含まれています。

OutputNote: checking out ''.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

 git checkout -b <new-branch-name>

HEAD is now at 8f0d2d1 Expose scale-function endpoint

エラーが表示された場合は、続行する前に画面の指示に従ってエラーを解決してください。

OpenFaaSリポジトリがダウンロードされ、必要なマニフェストファイルが完成したら、FaaS CLIのインストールに進みます。

FaaS CLIをインストールする最も簡単な方法は、公式スクリプトを使用することです。 ターミナルで、ホームディレクトリに移動し、次のコマンドを使用してスクリプトをダウンロードします。

cd ~
curl -sSL -o faas-cli.sh https://cli.openfaas.com

これにより、 `+ faas-cli.sh +`スクリプトがホームディレクトリにダウンロードされます。 スクリプトを実行する前に、内容を確認することをお勧めします。

less faas-cli.sh

`+ q `を押すとプレビューを終了できます。 スクリプトの内容を確認したら、スクリプトに実行権限を付与して実行することにより、インストールを続行できます。 ルートとしてスクリプトを実行し、 ` PATH`に自動的にコピーします:

chmod +x faas-cli.sh
sudo ./faas-cli.sh

出力には、インストールの進行状況とインストールしたCLIバージョンに関する情報が含まれます。

Outputx86_64
Downloading package https://github.com/openfaas/faas-cli/releases/download//faas-cli as /tmp/faas-cli
Download complete.

Running as root - Attempting to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
 ___                   _____           ____
/ _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
     |_|

CLI:
commit:
version:

エラーが表示された場合、チュートリアルを続行する前に、画面上の指示に従ってエラーを解決してください。

この時点で、FaaS CLIがインストールされています。 使用できるコマンドの詳細については、引数なしでCLIを実行してください。

faas-cli

出力には、使用可能なコマンドとフラグが表示されます。

Output  ___                   _____           ____
/ _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
     |_|


Manage your OpenFaaS functions from the command line

Usage:
 faas-cli [flags]
 faas-cli [command]

Available Commands:
 build          Builds OpenFaaS function containers
 cloud          OpenFaaS Cloud commands
 deploy         Deploy OpenFaaS functions
 help           Help about any command
 invoke         Invoke an OpenFaaS function
 list           List OpenFaaS functions
 login          Log in to OpenFaaS gateway
 logout         Log out from OpenFaaS gateway
 new            Create a new template in the current folder with the name given as name
 push           Push OpenFaaS functions to remote registry (Docker Hub)
 remove         Remove deployed OpenFaaS functions
 store          OpenFaaS store commands
 template       Downloads templates from the specified github repo
 version        Display the clients version information

Flags:
     --filter string   Wildcard to match with function names in YAML file
 -h, --help            help for faas-cli
     --regex string    Regex to match with function names in YAML file
 -f, --yaml string     Path to YAML file describing function(s)

Use "faas-cli [command] --help" for more information about a command.

これで、OpenFaaSマニフェストを正常に取得し、FaaS CLIをインストールしました。これを使用して、ターミナルからOpenFaaSインスタンスを管理できます。

`〜/ faas +`ディレクトリには、 `+`リリースからのファイルが含まれています。これは、OpenFaaSをDocker Swarmにデプロイできるようになったことを意味します。 その前に、Let’s Encryptを設定してOpenFaaSのセットアップを保護するTraefikを含むように展開マニフェストファイルを変更しましょう。

ステップ2-Traefikの構成

Traefikは、Let’s Encryptが提供するSSLサポートを備えたDocker対応リバースプロキシです。 SSLプロトコルは、ノード間で送受信するデータを暗号化することにより、Swarmクラスターと安全に通信できるようにします。

TraefikをOpenFaaSで使用するには、OpenFaaS展開マニフェストを変更してTraefikを含め、OpenFaaSにサービスをインターネットに直接公開する代わりにTraefikを使用するように指示する必要があります。

`+〜/ faas +`ディレクトリに戻って、テキストエディターでOpenFaaSデプロイメントマニフェストを開きます。

cd ~/faas
nano ~/faas/docker-compose.yml

OpenFaaSデプロイメントは、 `+ services +`ディレクティブで定義されたいくつかのサービスで構成され、OpenFaaS、OpenFaaS APIとWeb UI、およびPrometheusとAlertManager(メトリックの処理用)の実行に必要な依存関係を提供します。

+ services`セクションの最初に、デプロイメントに + traefik:v1.6 + イメージを使用する + traefik`という新しいサービスを追加します。

〜/ faas / docker-compose.yml

version: "3.3"
services:


   gateway:
        ...

Traefikイメージはhttps://hub.docker.com/_/traefik/[Traefik Docker Hubリポジトリ]から取得されます。ここでは、使用可能なすべてのイメージのリストを見つけることができます。

次に、 `+ command +`ディレクティブを使用してDockerにTraefikを実行するよう指示します。 これによりTraefikが実行され、Docker Swarmと連携するように設定され、Let’s Encryptを使用してSSLが提供されます。 次のフラグはTraefikを構成します。

  • +-docker。* +:これらのフラグはTraefikにDockerを使用し、Docker Swarmクラスターで実行することを指定するよう指示します。

  • +-web = true +:このフラグはTraefik Web UIを有効にします。

  • +-defaultEntryPoints +`および `+-entryPoints +:これらのフラグは、使用するエントリポイントとプロトコルを定義します。 私たちの場合、これにはポート `+ 80 `のHTTPとポート ` 443 +`のHTTPSが含まれます。

  • +-acme。* +:これらのフラグは、Trefikにhttps://letsencrypt.org/docs/client-options/[ACME]を使用してLet’s Encrypt証明書を生成し、SSLでOpenFaaSクラスターを保護するよう指示します。

`-acme.domains +`および `-acme.email `フラグの `+`ドメインプレースホルダーを、OpenFaaSへのアクセスに使用するドメインに置き換えてください。 複数のドメインをコンマとスペースで区切って指定できます。 電子メールアドレスは、証明書の有効期限アラートを含むSSL通知およびアラート用です。 この場合、Traefikは証明書の更新を自動的に処理するため、期限切れアラートを無視できます。

次のコードブロックを + image of`ディレクティブの下、および + gateway`の上に追加します。

〜/ faas / docker-compose.yml

...
   traefik:
       image: traefik:v1.6
       command: -c --docker=true
           --docker.swarmmode=true
           --docker.domain=traefik
           --docker.watch=true
           --web=true
           --defaultEntryPoints='http,https'
           --entryPoints='Name:https Address::443 TLS'
           --entryPoints='Name:http Address::80'
           --acme=true
           --acme.entrypoint='https'
           --acme.httpchallenge=true
           --acme.httpchallenge.entrypoint='http'
           --acme.domains=', '
           --acme.email=''
           --acme.ondemand=true
           --acme.onhostrule=true
           --acme.storage=/etc/traefik/acme/acme.json
...

`+ command `ディレクティブを設定したら、インターネットに公開するポートをTraefikに伝えましょう。 Traefikはオペレーションにポート「+8080」を使用しますが、OpenFaaSは非セキュア通信にポート「80」を使用し、セキュア通信にポート「443」を使用します。

次の `+ ports `ディレクティブを ` command `ディレクティブの下に追加します。 `:+`表記により、左側のポートがTraefikによってインターネットに公開され、右側のコンテナーのポートにマップされることが保証されます。

〜/ faas / docker-compose.yml

       ...
       command:
           ...

           -
           -
           -
       ...

次に、 `+ volumes `ディレクティブを使用して、Dockerを実行しているホストからTraefikにDockerソケットファイルをマウントします。 Dockerソケットファイルは、Docker APIと通信して、コンテナを管理し、コンテナの数やIPアドレスなどのコンテナに関する詳細を取得します。 また、「 acme +」というボリュームをマウントします。これについては、この手順の後半で定義します。

`+ networks `ディレクティブは、OpenFaaSと一緒にデプロイされる ` functions +`ネットワークを使用するようTraefikに指示します。 このネットワークにより、機能がAPIを含むシステムの他の部分と通信できるようになります。

`+ deploy +`ディレクティブは、DockerにDocker SwarmマネージャーノードでのみTraefikを実行するよう指示します。

`+ ports +`ディレクティブの下に次のディレクティブを追加します。

〜/ faas / docker-compose.yml

       ...
       volumes:
           - "/var/run/docker.sock:/var/run/docker.sock"
           - "acme:/etc/traefik/acme"
       networks:
           - functions
       deploy:
           placement:
               constraints: [node.role == manager]

この時点で、 `+ traefik +`サービスブロックは次のようになります。

〜/ faas / docker-compose.yml

version: "3.3"
services:
   traefik:
       image: traefik:v1.6
       command: -c --docker=true
           --docker.swarmmode=true
           --docker.domain=traefik
           --docker.watch=true
           --web=true
           --defaultEntryPoints='http,https'
           --entryPoints='Name:https Address::443 TLS'
           --entryPoints='Name:http Address::80'
           --acme=true
           --acme.entrypoint='https'
           --acme.httpchallenge=true
           --acme.httpchallenge.entrypoint='http'
           --acme.domains=', '
           --acme.email=''
           --acme.ondemand=true
           --acme.onhostrule=true
           --acme.storage=/etc/traefik/acme/acme.json
       ports:
           - 80:80
           - 8080:8080
           - 443:443
       volumes:
           - "/var/run/docker.sock:/var/run/docker.sock"
           - "acme:/etc/traefik/acme"
       networks:
         - functions
       deploy:
         placement:
           constraints: [node.role == manager]

   gateway:
       ...

この構成により、TraefikがOpenFaaSで展開されることが保証されますが、Traefikと連携するようにOpenFaaSを構成する必要もあります。 デフォルトでは、 `+ gateway `サービスはポート ` 8080 +`で実行されるように設定されていますが、これはTraefikと重複しています。

`+ gateway +`サービスは、関数のデプロイ、実行、管理に使用できるAPIゲートウェイを提供します。 (Prometheusを介して)メトリックと自動スケーリングを処理し、Web UIをホストします。

私たちの目標は、インターネットに直接公開する代わりにTraefikを使用して `+ gateway +`サービスを公開することです。

次のような `+ gateway +`サービスを見つけます。

〜/ faas / docker-compose.yml

...
   gateway:
       ports:
           - 8080:8080
       image: openfaas/gateway:0.8.7
       networks:
           - functions
       environment:
           functions_provider_url: "http://faas-swarm:8080/"
           read_timeout:  "300s"        # Maximum time to read HTTP request
           write_timeout: "300s"        # Maximum time to write HTTP response
           upstream_timeout: "300s"     # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
           dnsrr: "true"               # Temporarily use dnsrr in place of VIP while issue persists on PWD
           faas_nats_address: "nats"
           faas_nats_port: 4222
           direct_functions: "true"    # Functions are invoked directly over the overlay network
           direct_functions_suffix: ""
           basic_auth: "${BASIC_AUTH:-true}"
           secret_mount_path: "/run/secrets/"
           scale_from_zero: "false"
       deploy:
           resources:
               # limits:   # Enable if you want to limit memory usage
               #     memory: 200M
               reservations:
                   memory: 100M
           restart_policy:
               condition: on-failure
               delay: 5s
               max_attempts: 20
               window: 380s
           placement:
               constraints:
                   - 'node.platform.os == linux'
       secrets:
           - basic-auth-user
           - basic-auth-password
...

`+ gateway `サービスが直接公開されないように、サービスから ` ports +`ディレクティブを削除します。

次に、次の `+ lables `ディレクティブを ` gateway `サービスの ` deploy `セクションに追加します。 このディレクティブは、Traefik上のポート「+8080」上の「+ / ui」、「+ / system」、および「+ / functions」エンドポイントを公開します。

〜/ faas / docker-compose.yml

       ...
       deploy:

               -
               -
           resources:
           ...

「+ / ui 」エンドポイントはOpenFaaS Web UIを公開します。これはhttps://www.digitalocean.com/community/tutorials/how-to-install-and-secure-openfaas-using-docker-swarm- on-ubuntu-16-04#step-6-%E2%80%94-using-the-openfaas-web-ui [ステップ6]このチュートリアル。 ` / system`エンドポイントはOpenFaaSの管理に使用されるAPIエンドポイントであり、` + / function s`エンドポイントは機能を管理および実行するためのAPIエンドポイントを公開します。 https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-openfaas-using-docker-swarm-on-ubuntu-16-04#step-5-%E2%80%94このチュートリアルの-using-the-openfaas-api [Step 5]では、OpenFaaS APIについて詳しく説明しています。

変更後、 `+ gateway +`サービスは次のようになります。

〜/ faas / docker-compose.yml

...
   gateway:
       image: openfaas/gateway:0.8.7
       networks:
           - functions
       environment:
           functions_provider_url: "http://faas-swarm:8080/"
           read_timeout:  "300s"        # Maximum time to read HTTP request
           write_timeout: "300s"        # Maximum time to write HTTP response
           upstream_timeout: "300s"     # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
           dnsrr: "true"               # Temporarily use dnsrr in place of VIP while issue persists on PWD
           faas_nats_address: "nats"
           faas_nats_port: 4222
           direct_functions: "true"    # Functions are invoked directly over the overlay network
           direct_functions_suffix: ""
           basic_auth: "${BASIC_AUTH:-true}"
           secret_mount_path: "/run/secrets/"
           scale_from_zero: "false"
       deploy:
           labels:
               - traefik.port=8080
               - traefik.frontend.rule=PathPrefix:/ui,/system,/function
           resources:
               # limits:   # Enable if you want to limit memory usage
               #     memory: 200M
               reservations:
                   memory: 100M
           restart_policy:
               condition: on-failure
               delay: 5s
               max_attempts: 20
               window: 380s
           placement:
               constraints:
                   - 'node.platform.os == linux'
       secrets:
           - basic-auth-user
           - basic-auth-password
...

最後に、Let’s Encrypt証明書の保存に使用する「+ acme +」ボリュームを定義します。 空のボリュームを定義できます。つまり、コンテナを破棄するとデータは保持されません。 コンテナを破棄すると、次回Traefikを起動したときに証明書が再生成されます。

ファイルの最後の行に次の `+ volumes +`ディレクティブを追加します。

〜/ faas / docker-compose.yml

...
volumes:
   acme:

完了したら、ファイルを保存してテキストエディターを閉じます。 この時点で、OpenFaaS展開とDocker Swarmを保護するためにTraefikを設定しました。 これで、SwarmクラスターにOpenFaaSとともにデプロイする準備が整いました。

ステップ3-OpenFaaSの展開

OpenFaaS展開マニフェストを準備したので、これを展開してOpenFaaSの使用を開始する準備が整いました。 デプロイするには、 `+ deploy_stack.sh +`スクリプトを使用します。 このスクリプトはLinuxおよびmacOSオペレーティングシステムで使用することを目的としていますが、OpenFaaSディレクトリにはhttps://github.com/openfaas/faas/blob/master/deploy_stack.ps1[Windows]およびhttpsの適切なスクリプトもあります。 ://github.com/openfaas/faas/blob/master/deploy_stack.ps1 [ARMシステム]。

OpenFaaSをデプロイする前に、Swarmのマシンの1つでスクリプトからDockerコマンドを実行するように `+ docker-machine +`に指示する必要があります。 このチュートリアルでは、https://www.digitalocean.com/community/tutorials/how-to-create-a-cluster-of-docker-containers-with-docker-swarm-and-digitalocean-on-ubuntuを使用してみましょう-16-04#step-3-%E2%80%94-initializing-the-cluster-manager [ウォームマネージャー]。

`+ docker-machine use +`コマンドが設定されている場合、それを使用できます:

docker-machine use

そうでない場合は、次のコマンドを使用します。

eval $(docker-machine env )

`+ deploy_stack.sh +`スクリプトは、構成ファイル、ネットワーク設定、サービス、OpenFaaSサーバーでの承認のための資格情報など、OpenFaaSが期待どおりに動作するために必要なすべてのリソースをデプロイします。

スクリプトを実行してみましょう。展開が完了するまでに数分かかります。

~/faas/deploy_stack.sh

出力には、展開プロセスで作成されたリソースのリストと、OpenFaaSサーバーおよびFaaS CLIコマンドへのアクセスに使用する資格情報が表示されます。

これらの資格情報は、チュートリアル全体でWeb UIおよびAPIにアクセスするために必要になるため、書き留めてください。

OutputAttempting to create credentials for gateway..
roozmk0y1jkn17372a8v9y63g
q1odtpij3pbqrmmf8msy3ampl
[Credentials]
username:
password:
echo -n  | faas-cli login --username= --password-stdin

Enabling basic authentication for gateway..

Deploying OpenFaaS core services
Creating network func_functions
Creating config func_alertmanager_config
Creating config func_prometheus_config
Creating config func_prometheus_rules
Creating service func_alertmanager
Creating service func_traefik
Creating service func_gateway
Creating service func_faas-swarm
Creating service func_nats
Creating service func_queue-worker
Creating service func_prometheus

エラーが表示された場合は、画面の指示に従ってエラーを解決してから、チュートリアルを続けてください。

続行する前に、展開スクリプトで提供されるコマンドを使用して、OpenFaaSサーバーでFaaS CLIを認証しましょう。

スクリプトはコマンドに提供する必要のあるフラグを出力しましたが、FaaS CLIはゲートウェイサーバーが ` + localhost + `:

echo -n  | faas-cli login --username= --password-stdin --gateway

出力には、許可の成功に関するメッセージが含まれます。

OutputCalling the OpenFaaS server to validate the credentials...
credentials saved for admin https://example.com

この時点で、Docker Swarmクラスターに完全に機能するOpenFaaSサーバーがデプロイされ、新しくデプロイされたサーバーを使用するようにFaaS CLIが構成されています。 OpenFaaSの使用方法をテストする前に、いくつかのサンプル関数をデプロイして始めましょう。

ステップ4-OpenFaaSサンプル関数のデプロイ

当初、OpenFaaSには機能がデプロイされていません。 テストと使用を開始するには、いくつかの機能が必要です。

OpenFaaSプロジェクトはいくつかのサンプル関数をホストしており、https://github.com/openfaas/faas/tree/master/sample-functions [利用可能な関数とOpenFaaSリポジトリの展開マニフェスト]のリストを見つけることができます。 サンプル関数には、関数が実行されているノードに関する情報を表示するための + nodeinfo +、渡されたリクエストの単語数をカウントするための + wordcount +、渡されたマークダウン入力を変換するための `+ markdown +`が含まれます。 HTML出力へ。

`〜/ faas +`ディレクトリにある ` stack.yml +`マニフェストは、上記の関数とともにいくつかのサンプル関数をデプロイします。 FaaS CLIを使用して展開できます。

次の `+ faas-cli +`コマンドを実行します。このコマンドは、スタックマニフェストへのパスとOpenFaaSサーバーのアドレスを取得します。

faas-cli deploy -f ~/faas/stack.yml --gateway https://

出力には、展開が成功したかどうかを示すステータスコードとメッセージが含まれます。

OutputDeploying: wordcount.

Deployed. 200 OK.
URL: https:///function/wordcount

Deploying: base64.

Deployed. 200 OK.
URL: https:///function/base64

Deploying: markdown.

Deployed. 200 OK.
URL: https:///function/markdown

Deploying: hubstats.

Deployed. 200 OK.
URL: https:///function/hubstats

Deploying: nodeinfo.

Deployed. 200 OK.
URL: https:///function/nodeinfo

Deploying: echoit.

Deployed. 200 OK.
URL: https:///function/echoit

エラーが表示された場合は、画面上の指示に従ってエラーを解決してください。

スタックの展開が完了したら、すべての機能をリストし、それらが展開されて使用できる状態であることを確認します。

faas-cli list --gateway https://

出力には、レプリカ番号と呼び出し回数とともに、関数のリストが含まれます。

OutputFunction                        Invocations     Replicas
markdown                        0               1
wordcount                       0               1
base64                          0               1
nodeinfo                        0               1
hubstats                        0               1
echoit                          0               1

ここに関数が表示されない場合は、 `+ faas-cli deploy +`コマンドが正常に実行されたことを確認してください。

サンプルOpenFaaS関数を使用して、API、Web UI、およびCLIの使用方法をテストおよび実証できるようになりました。 次のステップでは、OpenFaaS APIを使用して機能を一覧表示して実行することから始めます。

ステップ5-OpenFaaS APIの使用

OpenFaaSには、サーバーレス機能の管理と実行に使用できる強力なAPIが付属しています。 APIを設計、テスト、文書化するためのツールであるhttps://swagger.io/[Swagger]を使用してAPIドキュメントを参照し、APIを使用して関数を一覧表示して実行します。

Swaggerを使用すると、APIドキュメントを調べて、使用可能なエンドポイントとその使用方法を確認できます。 OpenFaaSリポジトリーには、https://github.com/openfaas/faas/blob/master/api-docs/swagger.yml [Swagger API仕様]があり、これをSwaggerエディターで使用して仕様を変換できます。人間が読める形式に。

Webブラウザーを「+ http://editor.swagger.io/+」に移動します。 次の画面で歓迎されるはずです。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/swagger_welcome.png [Swagger Editorウェルカムページ]

ここには、サンプルSwagger仕様のソースコードを含むテキストエディターと、人間が読めるAPIドキュメントが右側にあります。

OpenFaaS Swagger仕様をインポートしましょう。 トップメニューで、[ファイル]ボタンをクリックし、[* URLのインポート*]をクリックします。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/swagger_editor.png [Swagger Editor Import URL]

Swagger API仕様のアドレスを入力する必要があるポップアップが表示されます。 ポップアップが表示されない場合は、Webブラウザでポップアップが有効になっていることを確認してください。

フィールドに、Swagger OpenFaaS API仕様へのリンクを入力します: + https:// raw.githubusercontent.com / openfaas / faas / master / api-docs / swagger.yml +

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/swagger_editor_url.png [Swagger Editor入力URL]

  • OK *ボタンをクリックすると、SwaggerエディターにOpenFaaSのAPIリファレンスが表示されます。これは次のようになります。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/swagger_openfaas.png [Swagger Editor OpenFaaS API仕様]

左側にはAPIリファレンスファイルのソースが表示され、右側には簡単な説明とともにエンドポイントのリストが表示されます。 エンドポイントをクリックすると、そのパラメーターの詳細、使用するメソッド、可能な応答など、エンドポイントに関する詳細が表示されます。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/swagger_endpoint_details.png [Swagger Editorエンドポイントの詳細]

使用可能なエンドポイントとそれらが期待するパラメーターがわかったら、それらを使用して機能を管理できます。

次に、 `+ curl `コマンドを使用してAPIと通信するため、ターミナルに戻ります。 ` -u `フラグを使用すると、ステップ3で取得した `+`ペアを渡すことができますが、 `+ -X `フラグはリクエストメソッドを定義します。 エンドポイントURLである ` https:/// system / functions +`も渡します:

curl -u : -X  https:///system/functions

APIドキュメントで各エンドポイントに必要なメソッドを確認できます。

ステップ4では、出力に表示されるはずのいくつかのサンプル関数をデプロイしました。

Output[{"name":"base64","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"base64","availableReplicas":0,"labels":{"com.openfaas.function":"base64","function":"true"}},{"name":"nodeinfo","image":"functions/nodeinfo:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"nodeinfo","function":"true"}},{"name":"hubstats","image":"functions/hubstats:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"hubstats","function":"true"}},{"name":"markdown","image":"functions/markdown-render:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"markdown","function":"true"}},{"name":"echoit","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"cat","availableReplicas":0,"labels":{"com.openfaas.function":"echoit","function":"true"}},{"name":"wordcount","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"wc","availableReplicas":0,"labels":{"com.openfaas.function":"wordcount","function":"true"}}]

このような出力が表示されない場合、またはエラーが表示される場合は、画面の指示に従って問題を解決してからチュートリアルを続行してください。 推奨される方法と正しい認証情報を使用して、正しいエンドポイントにリクエストを送信していることを確認してください。 次のコマンドを使用して、 `+ gateway +`サービスのログを確認することもできます。

docker service logs func_gateway

デフォルトでは、 `+ curl `呼び出しに対するAPIレスポンスは、改行なしの生のJSONを返しますが、これは人間が読める形式ではありません。 解析するには、 ` curl `の応答を ` jq +`ユーティリティにパイプします。これにより、JSONが人間が読み取れる形式に変換されます。

curl -u : -X  https:///system/functions | jq

出力は人間が読める形式になりました。 APIで関数を管理および呼び出すために使用できる関数名、呼び出しの数、Dockerに関連するラベルやレプリカの数などの情報を確認できます。

Output[
 {
   "name": "base64",
   "image": "functions/alpine:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "base64",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "base64",
     "function": "true"
   }
 },
 {
   "name": "nodeinfo",
   "image": "functions/nodeinfo:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "nodeinfo",
     "function": "true"
   }
 },
 {
   "name": "hubstats",
   "image": "functions/hubstats:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "hubstats",
     "function": "true"
   }
 },
 {
   "name": "markdown",
   "image": "functions/markdown-render:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "markdown",
     "function": "true"
   }
 },
 {
   "name": "echoit",
   "image": "functions/alpine:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "cat",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "echoit",
     "function": "true"
   }
 },
 {
   "name": "wordcount",
   "image": "functions/alpine:latest",
   "invocationCount": 0,
   "replicas": 1,
   "envProcess": "wc",
   "availableReplicas": 0,
   "labels": {
     "com.openfaas.function": "wordcount",
     "function": "true"
   }
 }
]

APIの「+ / function / 」エンドポイントを使用して、これらの関数の1つを取得して実行しましょう。 このエンドポイントはPOSTメソッドで利用できます。` -d + `フラグを使用すると、関数にデータを送信できます。

たとえば、次の「+ curl 」コマンドを実行して、「 echoit 」機能を実行します。これは、OpenFaaSに付属しており、リクエストとして送信した文字列を出力します。 文字列 `” Sammy The Shark “+`を使用して以下を実演できます。

curl -u : -X  https:///function/ -d ""

出力には、「+ Sammy The Shark」が表示されます。

OutputSammy The Shark

エラーが表示された場合は、画面上のログに従って問題を解決してからチュートリアルを続行してください。 `+ gateway`サービスのログを確認することもできます。

この時点で、OpenFaaS APIを使用して機能を管理および実行しました。 それでは、OpenFaaS Web UIを見てみましょう。

ステップ6-OpenFaaS Web UIの使用

OpenFaaSには、新しい機能を追加したり、インストールされた機能を実行したりできるWeb UIが付属しています。 このステップでは、FaaSストアからQRコードを生成する機能をインストールし、サンプルコードを生成します。

まず、Webブラウザで「+ https:/// ui / +」を指定します。 「見つかりません」エラーを回避するには、末尾のスラッシュが必要であることに注意してください。

HTTP認証ダイアログボックスで、ステップ3でOpenFaaSを展開するときに取得したユーザー名とパスワードを入力します。

ログインすると、画面の左側に利用可能な機能が表示され、新しい機能をインストールするために使用される* Deploy New Functions *ボタンが表示されます。

  • Deploy New Functions *をクリックして、新しい関数を展開します。 FaaSストアウィンドウが表示されます。このウィンドウには、ワンクリックでインストールできるコミュニティでテストされた機能があります。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/openfaas_func_store.png [OpenFaaS Functionsストア]

これらの関数に加えて、Dockerイメージから関数を手動でデプロイすることもできます。

このチュートリアルでは、FaaSストアから* QRコードジェネレーター*機能をデプロイします。 リスト内の* QR Code Generator-Go アイテムを見つけてクリックし、ウィンドウの下部にある Deploy *ボタンをクリックします。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/openfaas_qr.png [OpenFaaS QR Code Generator関数]

[デプロイ]をクリックすると、[新しい関数のデプロイ]ウィンドウが閉じて、関数がデプロイされます。 ウィンドウの左側のリストには、* + qrcode-go + *関数のリストが表示されます。 このエントリをクリックして選択します。 メイン関数ウィンドウには、関数を呼び出すオプションとともに、関数名、レプリカの数、呼び出し回数、およびイメージが表示されます。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/openfaas_qr_code.png [OpenFaaS QR Code Function]

ドメインのURLを含むQRコードを生成してみましょう。 [リクエスト本文]フィールドに、生成するQRコードのコンテンツを入力します。この例では、これは*“ example.com” *になります。 完了したら、[呼び出し]ボタンをクリックします。

  • Text または JSON *出力オプションのいずれかを選択すると、関数はファイルのコンテンツを出力しますが、これは使用できないか、人間が読める形式ではありません。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/qr_generated_code.png [OpenFaaSが生成したQRコード]

応答をダウンロードできます。 これは、QRコードを含むPNGファイルになります。 これを行うには、*ダウンロード*オプションを選択し、もう一度*呼び出し*をクリックします。 その後すぐに、QRコードをダウンロードして、選択した画像ビューアーで開くことができます。

image:https://assets.digitalocean.com/articles/openfaas_ubuntu_1604/qr_image_two.png [生成されたQRコード]

FaaSストアまたはDockerイメージから機能をデプロイすることに加えて、独自の機能を作成することもできます。 次のステップでは、FaaSコマンドラインインターフェイスを使用してPython関数を作成します。

ステップ7-FaaS CLIを使用して関数を作成する

前の手順で、OpenFaaSサーバーと連携するようにFaaS CLIを構成しました。 FaaS CLIは、APIを介して、またはWeb UIを使用するのと同じように、OpenFaaSの管理と機能のインストールと実行に使用できるコマンドラインインターフェイスです。

Web UIまたはAPIと比較して、FaaS CLIには、独自の機能を作成するために使用できる多くのプログラミング言語のテンプレートがあります。 また、関数コードに基づいてコンテナーイメージを構築し、Docker Hubなどのイメージレジストリにイメージをプッシュすることもできます。

この手順では、関数を作成し、Docker Hubに公開してから、OpenFaaSサーバーで実行します。 この関数は、リクエストとして渡された入力を返すデフォルトの `+ echoit +`関数に似ています。

Pythonを使用して関数を記述します。 Pythonの詳細については、https://www.digitalocean.com/community/tutorial_series/how-to-code-in-python-3 [Python 3のチュートリアルのチュートリアルシリーズ]をご覧ください。 Python eBookでのコーディング方法

新しい関数を作成する前に、FaaS関数を保存するディレクトリを作成してナビゲートしましょう。

mkdir ~/faas-functions
cd ~/faas-functions

次のコマンドを実行して、 `+ echo-input`という新しいPython関数を作成します。 後でDocker Hubに関数をプッシュするため、「++」をDocker Hubユーザー名に置き換えてください。

faas-cli new  --lang  --prefix  --gateway

出力には、正常な関数作成に関する確認が含まれます。 テンプレートをダウンロードしていない場合、CLIは現在のディレクトリにテンプレートをダウンロードします。

Output2018/05/13 12:13:06 No templates found in current directory.
2018/05/13 12:13:06 Attempting to expand templates from https://github.com/openfaas/templates.git
2018/05/13 12:13:11 Fetched 12 template(s) : [csharp dockerfile go go-armhf node node-arm64 node-armhf python python-armhf python3 python3-armhf ruby] from https://github.com/openfaas/templates.git
Folder:  created.
 ___                   _____           ____
/ _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
     |_|


Function created in folder:
Stack file written: .yml

+ faas-cli new +`コマンドの結果は、関数のコードと `+ echo-input.yml`ファイルを含む新しく作成された +〜/ faas-functions / echo-input`ディレクトリです。 このファイルには、機能に関する情報(使用言語、名前、デプロイ先のサーバー)が含まれています。

`+〜/ faas-functions / echo-input`ディレクトリに移動します:

cd ~/faas-fucntions/echo-input

ディレクトリの内容を表示するには、次を実行します。

ls

ディレクトリには2つのファイルが含まれています。関数のコードが含まれる `+ handler.py `と、関数に必要なPythonモジュールが含まれる ` requirements.txt +`です。

現在、デフォルト以外のPythonモジュールは必要ないため、 `+ requirements.txt `ファイルは空です。 それを確認するには、 ` cat +`コマンドを使用します:

cat requirements.txt

次に、リクエストを文字列として返す関数を作成しましょう。

`+ handler.py +`ファイルにはサンプルハンドラーコードが既にあり、受け取った応答を文字列として返します。 コードを見てみましょう。

nano handler.py

デフォルトの関数は「+ handle 」と呼ばれ、呼び出されたときに関数に渡されるリクエストを含む単一のパラメーター「 req +」を取ります。 この関数は1つのことだけを行い、渡された要求を応答として返します。

def handle(req):
   """handle a request to the function
   Args:
       req (str): request body
   """

   return req

次のように、 `+ return +`ディレクティブの文字列を置き換えて、追加のテキストを含めるように変更します。

   return "Received message: " + req

完了したら、ファイルを保存してテキストエディターを閉じます。

次に、関数のソースコードからDockerイメージを作成しましょう。 + echo-input.yml`ファイルがある + faas-functions`ディレクトリに移動します:

cd ~/faas-functions

次のコマンドは、関数のDockerイメージを作成します。

faas-cli build -f

出力には、ビルドの進行状況に関する情報が含まれます。

Output[0] > Building echo-input.
Clearing temporary build folder: ./build/echo-input/
Preparing ./echo-input/ ./build/echo-input/function
Building: sammy/echo-input with python template. Please wait..
Sending build context to Docker daemon  7.168kB
Step 1/16 : FROM python:2.7-alpine
---> 5fdd069daf25
Step 2/16 : RUN apk --no-cache add curl     && echo "Pulling watchdog binary from Github."     && curl -sSL https://github.com/openfaas/faas/releases/download/0.8.0/fwatchdog > /usr/bin/fwatchdog     && chmod +x /usr/bin/fwatchdog     && apk del curl --no-cache
---> Using cache
---> 247d4772623a
Step 3/16 : WORKDIR /root/
---> Using cache
---> 532cc683d67b
Step 4/16 : COPY index.py           .
---> Using cache
---> b4b512152257
Step 5/16 : COPY requirements.txt   .
---> Using cache
---> 3f9cbb311ab4
Step 6/16 : RUN pip install -r requirements.txt
---> Using cache
---> dd7415c792b1
Step 7/16 : RUN mkdir -p function
---> Using cache
---> 96c25051cefc
Step 8/16 : RUN touch ./function/__init__.py
---> Using cache
---> 77a9db274e32
Step 9/16 : WORKDIR /root/function/
---> Using cache
---> 88a876eca9e3
Step 10/16 : COPY function/requirements.txt .
---> Using cache
---> f9ba5effdc5a
Step 11/16 : RUN pip install -r requirements.txt
---> Using cache
---> 394a1dd9e4d7
Step 12/16 : WORKDIR /root/
---> Using cache
---> 5a5893c25b65
Step 13/16 : COPY function           function
---> eeddfa67018d
Step 14/16 : ENV fprocess="python index.py"
---> Running in 8e53df4583f2
Removing intermediate container 8e53df4583f2
---> fb5086bc7f6c
Step 15/16 : HEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1
---> Running in b38681a71378
Removing intermediate container b38681a71378
---> b04c045b0994
Step 16/16 : CMD ["fwatchdog"]
---> Running in c5a11078df3d
Removing intermediate container c5a11078df3d
---> bc5f08157c5a
Successfully built bc5f08157c5a
Successfully tagged sammy/echo-input:latest
Image: /echo-input built.
[0] < Building echo-input done.
[0] worker done.

エラーが発生した場合は、関数を展開する前に画面上の指示に従って解決してください。

OpenFaaS機能をデプロイするには、コンテナ化する必要があります。 アプリケーションをコンテナ化すると、アプリケーションの実行に必要な環境を簡単に再現でき、アプリケーションを簡単に展開、スケーリング、および更新できます。

このチュートリアルでは、無料のソリューションであるDocker Hubを使用しますが、独自のプライベートレジストリを含む任意のコンテナレジストリを使用できます。

次のコマンドを実行して、作成したイメージをDocker Hubの指定されたリポジトリにプッシュします。

faas-cli push -f

インターネット接続速度に応じて、プッシュには数分かかります。 出力には、画像のアップロードの進行状況が含まれます。

Output[0] > Pushing echo-input.
The push refers to repository [docker.io/sammy/echo-input]
320ea573b385: Pushed
9d87e56f5d0c: Pushed
6f79b75e7434: Pushed
23aac2d8ecf2: Pushed
2bec17d09b7e: Pushed
e5a0e5ab3be6: Pushed
e9c8ca932f1b: Pushed
beae1d55b4ce: Pushed
2fcae03ed1f7: Pushed
62103d5daa03: Mounted from library/python
f6ac6def937b: Mounted from library/python
55c108c7613c: Mounted from library/python
e53f74215d12: Mounted from library/python
latest: digest: sha256:794fa942c2f593286370bbab2b6c6b75b9c4dcde84f62f522e59fb0f52ba05c1 size: 3033
[0] < Pushing echo-input done.
[0] worker done.

最後に、イメージをDocker Hubにプッシュすると、そのイメージを使用してOpenFaaSサーバーに機能をデプロイできます。

関数をデプロイするには、 `+ deploy +`コマンドを実行します。このコマンドは、関数を説明するマニフェストへのパスとOpenFaaSサーバーのアドレスを取得します。

faas-cli deploy -f  --gateway

出力には、展開のステータスと、展開する機能の名前および展開ステータスコードが表示されます。

OutputDeploying: .

Deployed. 200 OK.
URL:

デプロイが成功すると、「+ 200+」ステータスコードが表示されます。 エラーが発生した場合は、提供される指示に従って問題を解決してから続行してください。

この時点で、関数がデプロイされ、使用できる状態になります。 呼び出して、期待どおりに機能していることをテストできます。

FaaS CLIで関数を呼び出すには、関数名とOpenFaaSアドレスを渡して `+ invoke +`コマンドを使用します。 コマンドを実行した後、関数に送信するリクエストを入力するよう求められます。

次のコマンドを実行して、 `+ echo-input +`関数を呼び出します:

faas-cli invoke echo-input --gateway

関数に送信するリクエストを入力するよう求められます。

OutputReading from STDIN - hit (Control + D) to stop.

次のように、関数に送信するテキストを入力します。

Sammy The Shark!

完了したら、「+ ENTER 」を押してから「 CTRL + D 」を押してリクエストを終了します。 ターミナルの「 CTRL + D +」ショートカットは、ファイルの終わり(EOF)を登録するために使用されます。 EOFが受信されると、OpenFaaS CLIは端末からの読み取りを停止します。

数秒後、コマンドは関数の応答を出力します:

OutputReading from STDIN - hit (Control + D) to stop.
Sammy The Shark!
Received message: Sammy The Shark!

出力が表示されない場合、またはエラーが発生する場合は、前述の手順に戻って、説明どおりに機能を展開したことを確認し、画面の指示に従って問題を解決します。

この時点で、Web UI、API、およびCLIの3つのメソッドを使用して関数を操作しました。 これらの方法のいずれかを使用して機能を実行できると、既存のワークフローに機能を統合する方法を柔軟に決定できます。

結論

このチュートリアルでは、サーバーレスアーキテクチャとOpenFaaSを使用して、OpenFaaS API、Web UI、CLIを使用してアプリケーションをデプロイおよび管理しました。 また、Let’s Encryptを使用してTraefikを利用してSSLを提供することにより、インフラストラクチャを保護しました。

OpenFaaSプロジェクトの詳細については、https://www.openfaas.com/ [website]およびhttps://docs.openfaas.com/[project’s official documentation]をご覧ください。