開発者ドキュメント

Ubuntu16.04でDockerSwarmを使用してOpenFaaSをインストールして保護する方法

著者は、 Write for DOnations プログラムの一環として、 Diversity in TechFundを選択して寄付を受け取りました。

序章

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

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

OpenFaaS は、サーバーレス機能を構築およびホストするための無料のオープンソースフレームワークです。 DockerSwarmKubernetesの両方が公式にサポートされているため、強力なAPI、コマンドラインインターフェイス、またはWebUIを使用してアプリケーションをデプロイできます。 Prometheus が提供する組み込みの指標が付属しており、ゼロからのスケーリングだけでなく、オンデマンドの自動スケーリングもサポートしています。

このチュートリアルでは、Ubuntu16.04で実行されているDockerSwarmでOpenFaaSをセットアップして使用し、 Let’sEncyptTraefikをセットアップしてWebUIとAPIを保護します。 これにより、クラスター内のノード間、およびOpenFaaSとそのオペレーター間の安全な通信が保証されます。

前提条件

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

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

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

リポジトリのクローンを作成するだけでなく、ターミナルから新しい機能を管理および展開するために使用できる強力なコマンドラインユーティリティであるFaaSCLIもインストールします。 これは、ほとんどの主要なプログラミング言語で独自の関数を作成するためのテンプレートを提供します。 ステップ7では、これを使用して Python 関数を作成し、OpenFaaSにデプロイします。

このチュートリアルでは、OpenFaaS v 0.8.9をデプロイします。 他のバージョンをデプロイする手順も同様である必要がありますが、プロジェクト変更ログをチェックして、重大な変更がないことを確認してください。

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

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

新しく作成された~/faasディレクトリに移動します。

  1. cd ~/faas

リポジトリのクローンを作成すると、マスターブランチから最新の変更を含むファイルを取得します。 重大な変更はマスターブランチに入る可能性があるため、本番環境での使用はお勧めしません。 代わりに、0.8.9タグを確認してみましょう。

  1. git checkout 0.8.9

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

Output
Note: checking out '0.8.9'. 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リポジトリをダウンロードし、必要なマニフェストファイルを完成させたら、FaaSCLIのインストールに進みましょう。

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

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

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

  1. less faas-cli.sh

qを押すと、プレビューを終了できます。 スクリプトの内容を確認したら、スクリプトに実行可能アクセス許可を与えて実行することにより、インストールを続行できます。 スクリプトをrootとして実行すると、PATHに自動的にコピーされます。

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

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

Output
x86_64 Downloading package https://github.com/openfaas/faas-cli/releases/download/0.6.17/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: b5597294da6dd98457434fafe39054c993a5f7e7 version: 0.6.17

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

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

  1. 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ディレクトリには、0.8.9リリースのファイルが含まれています。これは、OpenFaaSをDockerSwarmにデプロイできることを意味します。 その前に、展開マニフェストファイルを変更してTraefikを含めましょう。これにより、Let’sEncryptを設定してOpenFaaSのセットアップを保護できます。

ステップ2—Traefikを構成する

Traefikは、Let’sEncryptによって提供されるSSLサポートが付属するDocker対応のリバースプロキシです。 SSLプロトコルは、ノード間で送受信するデータを暗号化することにより、Swarmクラスターと安全に通信することを保証します。

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

~/faasディレクトリに戻り、テキストエディタでOpenFaaS展開マニフェストを開きます。

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

注: DockerComposeマニフェストファイルはYAMLフォーマットを使用します。これはタブを厳密に禁止し、インデントに2つのスペースを必要とします。 ファイルの形式が正しくない場合、マニフェストはデプロイに失敗します。

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

servicesセクションの先頭に、展開にtraefik:v1.6イメージを使用するtraefikという新しいサービスを追加します。

〜/ faas / docker-compose.yml
version: "3.3"
services:
    traefik:
        image: traefik:v1.6
    gateway:
         ...

Traefikイメージは、 Traefik Docker Hubリポジトリから取得されます。ここには、使用可能なすべてのイメージのリストがあります。

次に、commandディレクティブを使用してTraefikを実行するようにDockerに指示しましょう。 これにより、Traefikが実行され、Docker Swarmで動作するように構成され、Let’sEncryptを使用してSSLが提供されます。 次のフラグはTraefikを構成します。

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

imageディレクティブの下、および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='example.com, www.example.com'
            --acme.email='sammy@example.com'
            --acme.ondemand=true
            --acme.onhostrule=true
            --acme.storage=/etc/traefik/acme/acme.json
...

commandディレクティブを配置したら、インターネットに公開するポートをTraefikに指示しましょう。 Traefikは操作にポート8080を使用し、OpenFaaSは非セキュア通信にポート80を使用し、セキュア通信にポート443を使用します。

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

〜/ faas / docker-compose.yml
        ...
        command:
            ...
		ports:
            - 80:80
            - 8080:8080
            - 443:443
        ...

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

networksディレクティブは、OpenFaaSとともに展開されるfunctionsネットワークを使用するようにTraefikに指示します。 このネットワークにより、関数はAPIを含むシステムの他の部分と通信できるようになります。

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

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='example.com, www.example.com'
            --acme.email='sammy@example.com'
            --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サービスは、Traefikと重複するポート8080で実行するように構成されています。

gatewayサービスは、機能のデプロイ、実行、管理に使用できるAPIゲートウェイを提供します。 メトリック(Prometheus経由)と自動スケーリングを処理し、WebUIをホストします。

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

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
...

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

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

〜/ faas / docker-compose.yml
		...
        deploy:
            labels:
            	- traefik.port=8080
            	- traefik.frontend.rule=PathPrefix:/ui,/system,/function
            resources:
			...            

/uiエンドポイントは、このチュートリアルのステップ6で説明されているOpenFaaSWebUIを公開します。 /systemエンドポイントはOpenFaaSの管理に使用されるAPIエンドポイントであり、/functionエンドポイントは関数を管理および実行するためのAPIエンドポイントを公開します。 このチュートリアルのステップ5では、OpenFaaSAPIについて詳しく説明しています。

変更後、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’sEncrypt証明書の保存に使用されるacmeボリュームを定義しましょう。 空のボリュームを定義できます。つまり、コンテナを破棄してもデータは保持されません。 コンテナを破棄すると、次にTraefikを起動したときに証明書が再生成されます。

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

〜/ faas / docker-compose.yml
...
volumes:
    acme:

完了したら、ファイルを保存してテキストエディタを閉じます。 この時点で、OpenFaaSデプロイメントとDockerSwarmを保護するようにTraefikを構成しました。 これで、SwarmクラスターにOpenFaaSと一緒にデプロイする準備が整いました。

ステップ3—OpenFaaSの導入

OpenFaaSデプロイメントマニフェストを準備したので、それをデプロイしてOpenFaaSの使用を開始する準備が整いました。 デプロイするには、deploy_stack.shスクリプトを使用します。 このスクリプトは、LinuxおよびmacOSオペレーティングシステムで使用することを目的としていますが、OpenFaaSディレクトリには、WindowsおよびARMシステムに適したスクリプトもあります。

OpenFaaSをデプロイする前に、Swarm内のマシンの1つでスクリプトからDockerコマンドを実行するようにdocker-machineに指示する必要があります。 このチュートリアルでは、スウォームマネージャーを使用してみましょう。

docker-machine useコマンドを構成している場合は、次のコマンドを使用できます。

  1. docker-machine use node-1

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

  1. eval $(docker-machine env node-1)

deploy_stack.shスクリプトは、構成ファイル、ネットワーク設定、サービス、OpenFaaSサーバーでの認証用のクレデンシャルなど、OpenFaaSが期待どおりに機能するために必要なすべてのリソースを展開します。

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

  1. ~/faas/deploy_stack.sh

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

Web UIとAPIにアクセスするためにチュートリアル全体で必要になるため、これらの資格情報を書き留めます。

Output
Attempting to create credentials for gateway.. roozmk0y1jkn17372a8v9y63g q1odtpij3pbqrmmf8msy3ampl [Credentials] username: admin password: your_openfaas_password echo -n your_openfaas_password | faas-cli login --username=admin --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サーバーでFaaSCLIを認証しましょう。

スクリプトはコマンドに提供する必要のあるフラグを出力しましたが、FaaS CLIはゲートウェイサーバーが[で実行されていると想定しているため、OpenFaaSサーバーのアドレスにフラグ--gatewayを追加する必要があります。 X222X] :

  1. echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin --gateway https://example.com

出力には、承認の成功に関するメッセージが含まれています。

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

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

ステップ4—OpenFaaSサンプル関数の展開

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

OpenFaaSプロジェクトはいくつかのサンプル関数をホストしており、OpenFaaSリポジトリ使用可能な関数のリストとそれらのデプロイメントマニフェストを見つけることができます。 サンプル関数には、関数が実行されているノードに関する情報を表示するnodeinfo、渡されたリクエストの単語数をカウントするwordcountmarkdownなどがあります。 、渡されたマークダウン入力をHTML出力に変換するため。

~/faasディレクトリのstack.ymlマニフェストは、上記の関数に加えて、いくつかのサンプル関数をデプロイします。 FaaSCLIを使用してデプロイできます。

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

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

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

Output
Deploying: wordcount. Deployed. 200 OK. URL: https://example.com/function/wordcount Deploying: base64. Deployed. 200 OK. URL: https://example.com/function/base64 Deploying: markdown. Deployed. 200 OK. URL: https://example.com/function/markdown Deploying: hubstats. Deployed. 200 OK. URL: https://example.com/function/hubstats Deploying: nodeinfo. Deployed. 200 OK. URL: https://example.com/function/nodeinfo Deploying: echoit. Deployed. 200 OK. URL: https://example.com/function/echoit

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

スタックのデプロイが完了したら、すべての関数をリストして、それらがデプロイされ、使用できる状態になっていることを確認します。

  1. faas-cli list --gateway https://example.com

出力には、関数のリストと、それらのレプリカ番号および呼び出しカウントが含まれます。

Output
Function 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の使用方法をテストおよびデモンストレーションできます。 次のステップでは、OpenFaaSAPIを使用して関数を一覧表示して実行することから始めます。

ステップ5—OpenFaaSAPIを使用する

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

Swaggerを使用すると、APIドキュメントを調べて、使用可能なエンドポイントとその使用方法を確認できます。 OpenFaaSリポジトリには、 Swagger API仕様があります。これは、Swaggerエディターで使用して、仕様を人間が読める形式に変換できます。

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

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

OpenFaaSSwagger仕様をインポートしてみましょう。 トップメニューで、ファイルボタンをクリックしてから、URLのインポートをクリックします。

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

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

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

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

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

次に、curlコマンドを使用してAPIと通信するので、ターミナルに戻ります。 -uフラグを使用すると、手順3で取得したadmin:your_openfaas_passwordペアを渡すことができ、-Xフラグは要求メソッドを定義します。 また、エンドポイントURLhttps://example.com/system/functionsを渡します。

  1. curl -u admin:your_openfaas_password -X GET https://example.com/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サービスのログを確認することもできます。

  1. docker service logs func_gateway

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

  1. curl -u admin:your_openfaas_password -X GET https://example.com/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/function-nameエンドポイントを使用して、これらの関数の1つを実行してみましょう。 このエンドポイントは、-dフラグを使用して関数にデータを送信できるPOSTメソッドを介して使用できます。

たとえば、次のcurlコマンドを実行して、echoit関数を実行します。この関数は、OpenFaaSに付属しており、送信した文字列をリクエストとして出力します。 文字列"Sammy The Shark"を使用して、次のことを示すことができます。

  1. curl -u admin:your_openfaas_password -X POST https://example.com/function/func_echoit -d "Sammy The Shark"

出力にはSammy The Sharkが表示されます。

Output
Sammy The Shark

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

この時点で、OpenFaaSAPIを使用して関数を管理および実行しました。 次に、OpenFaaSWebUIを見てみましょう。

ステップ6— OpenFaaSWebUIを使用する

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

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

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

ログインすると、画面の左側に使用可能な機能が表示され、新しい機能の展開ボタンを使用して新しい機能をインストールできます。

新しい関数の展開をクリックして、新しい関数を展開します。 ワンクリックでインストールできるコミュニティテスト済みの機能を提供するFaaSストアウィンドウが表示されます。

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

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

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

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

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

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

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

ステップ7—FaaSCLIを使用した関数の作成

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

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

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

Pythonを使用して関数を記述します。 Pythonの詳細については、Python3チュートリアルシリーズおよびPythoneBookでのコーディング方法をご覧ください。

新しい関数を作成する前に、FaaS関数を格納するディレクトリを作成し、そこに移動しましょう。

  1. mkdir ~/faas-functions
  2. cd ~/faas-functions

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

  1. faas-cli new echo-input --lang python --prefix your-docker-hub-username --gateway https://example.com

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

Output
2018/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: echo-input created. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| Function created in folder: echo-input Stack file written: echo-input.yml

faas-cli newコマンドの結果は、関数のコードとecho-input.ymlファイルを含む新しく作成された~/faas-fucntions/echo-inputディレクトリです。 このファイルには、関数に関する情報が含まれています。関数の言語、名前、および関数をデプロイするサーバーです。

~/faas-fucntions/echo-inputディレクトリに移動します。

  1. cd ~/faas-fucntions/echo-input

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

  1. ls

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

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

  1. cat requirements.txt

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

handler.pyファイルには、受信した応答を文字列として返すサンプルハンドラーコードが既に含まれています。 コードを見てみましょう:

  1. 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ディレクトリに移動します。

  1. cd ~/faas-functions

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

  1. faas-cli build -f echo-input.yml

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

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: your-docker-hub-username/echo-input built. [0] < Building echo-input done. [0] worker done.

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

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

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

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

  1. faas-cli push -f echo-input.yml

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

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サーバーのアドレスを取得します。

  1. faas-cli deploy -f echo-input.yml --gateway https://example.com

出力には、デプロイのステータスが、デプロイしている関数の名前とデプロイメントステータスコードとともに表示されます。

Output
Deploying: echo-input. Deployed. 200 OK. URL: https://example.com/function/echo-input

展開が成功すると、200ステータスコードが表示されます。 エラーが発生した場合は、続行する前に、提供されている手順に従って問題を修正してください。

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

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

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

  1. faas-cli invoke echo-input --gateway https://example.com

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

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

関数に送信するテキストを入力します。たとえば、次のようになります。

Sammy The Shark!

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

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

Output
Reading 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を使用してアプリケーションをデプロイおよび管理しました。 また、Traefikを利用してLet’s Encryptを使用してSSLを提供することにより、インフラストラクチャを保護しました。

OpenFaaSプロジェクトの詳細については、Webサイトおよびプロジェクトの公式ドキュメントを参照してください。

モバイルバージョンを終了