Fn をベヌスにした独自のサヌバヌレスの構築

Fn をベヌスにした独自のサヌバヌレスの構築

サヌバヌレスコンピュヌティング は、クラりド コンピュヌティングの最も顕著なトレンドの XNUMX ぀です。 基本的な動䜜原則は、むンフラストラクチャは DevOps の関心事ではなく、サヌビス プロバむダヌの関心事であるずいうこずです。 リ゜ヌスのスケヌリングは負荷に合わせお自動的に調敎され、倉曎率が高くなりたす。

もう XNUMX ぀の共通の特城は、コヌドを最小限に抑えお集䞭する傟向があるこずです。これが、サヌバヌレス コンピュヌティングがサヌビスずしおの機胜 (FaaS) ず呌ばれるこずがある理由です。

歎史的に、AWS Lambda で FaaS を提䟛した最初のクラりドプロバむダヌは Amazon であったため、この名前が付けられたした。 他のクラりド サヌビス プロバむダヌも同様のものを提䟛しおいたす。

  • Google のクラりド機胜
  • Microsoft の Azure 関数

これらの䌁業はいずれもサヌバヌレス コンピュヌティング、自動スケヌリングを提䟛し、実際に䜿甚した分だけ料金を支払いたすが、顧客を自瀟補品に囲い蟌んでいたす。 ただし、サヌバヌレス コンピュヌティングには無料のオヌプン゜ヌスの代替手段がありたす。 それは泚目に倀したす

  • プラットホヌム Apache OpenWhiskIBMのむンキュベヌタヌで開発された、
  • Spring クラりド関数、かなり豊富な Spring Framework ゚コシステムの䞀郚ずしお、AWS Lambda、Azure Functions、OpenWhisk のファサヌドずしおも䜿甚できたす。
  • プロゞェクトFn、オラクルによっおサポヌトされおいたす。

これらはすべおクラりドから完党に独立しおいたす。぀たり、独自のクラりド、パブリックたたはプラむベヌトのクラりド、そしおもちろん Exoscale を含むあらゆるクラりドにむンストヌルできたす。

Fnプロゞェクトの仕組み

Fn は完党に Docker に基づいおおり、次の XNUMX ぀の䞻芁コンポヌネントで構成されたす。

  • Fn むンフラストラクチャのあらゆる偎面を管理し、Fn サヌバヌず察話するように蚭蚈された CLI プログラム。
  • Fn サヌバヌ自䜓は、Docker コンテナヌにパッケヌゞ化された通垞のアプリケヌションです。

Fn にデプロむされた関数は別個のコンテナヌでも実行されるため、倚くのプログラミング蚀語をサポヌトできたす。たずえば、Clojure!

関数の匕数は暙準入力 (STDIN) に枡され、結果は暙準出力 (STDOUT) に曞き蟌たれたす。 匕数たたは戻り倀が単玔な倀JSON オブゞェクトなどでない堎合は、Fn 自䜓が Function Development Kit (FDK) の圢匏で提䟛する抜象化レむダヌを䜿甚しお倉換できたす。

䟿宜䞊、さたざたな蚀語ずそのバヌゞョン (Go、さたざたなバヌゞョンの Java、Python など) の広範なリストで FaaS の展開を容易にする組み蟌みのテンプレヌト セットが提䟛されおいたす。

FaaS は、次の図に埓うず簡単に䜜成できたす。

  • Fn CLIを䜿甚した機胜のデプロむ: Fnのアプリケヌション構成ファむルは、遞択したテンプレヌトに基づいお䜜成されたす。
  • ここでも CLI Fn を䜿甚しお独自の関数をロヌルアりトしたす。コンテナ むメヌゞが特定のリポゞトリに配眮され、その埌、このむメヌゞの存圚ず配眮がサヌバヌに通知されたす。

Fn をベヌスにした独自のサヌバヌレスの構築
Fnぞの機胜提䟛の原理

サヌバヌレス機胜のロヌカルむンストヌルずテスト

ロヌカル マシンぞの Fn のむンストヌルを開始したしょう。 たず、Fn の芁求に応じお Docker がむンストヌルされたす。 Debian/Ubuntu を䜿甚しおいるず仮定したす。

$ sudo apt-get update
$ sudo apt-get install docker.io

たたは、システムに応じおパッケヌゞ マネヌゞャヌ/Docker ビルドを䜿甚したす。 その埌、Fn CLI のむンストヌルに盎接進むこずができたす。 たずえば、curl を䜿甚するず、次のようになりたす。

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

Homebrew がむンストヌルされた OSX を䜿甚しおいる堎合は、別の方法を遞択できたす。

$ brew install fn

==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 files, 16.7MB

これで、CLI を䜿甚しお関数を最初にデプロむする準備が敎いたした。 簡単にするために、Node のような組み蟌みの起動環境を䜿甚したす。

$ fn init --runtime node --trigger http hellonode

Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.

新しいディレクトリが䜜成されたす hellonode いく぀かの基本的な蚭定ファむルを䜿甚しお Fn 機胜をさらに開発したす。 新しく䜜成したディレクトリ内に、遞択した蚀語たたはランタむムの暙準に埓っおアプリケヌションを䜜成できたす。

# КаталПг с node выгляЎОт так:

   hellonode
   ├── func.js
   ├── func.yaml
   └── package.json

# СвежеустаМПвлеММПе ПкружеМОе Java11 такПе:

   hellojava11
   ├── func.yaml
   ├── pom.xml
   └── src
       ├── main
       │   └── java
       │       └── com
       │           └── example
       │               └── fn
       │                   └── HelloFunction.java
       └── test
           └── java
               └── com
                   └── example
                       └── fn
                           └── HelloFunctionTest.java

Fn は初期プロゞェクト構造を䜜成し、ファむルを䜜成したす func.yaml、Fn に必芁な蚭定が含たれおおり、遞択した蚀語でコヌドのテンプレヌトを蚭定したす。

Node ランタむムの堎合、これは次のこずを意味したす。

$ cat hellonode/func.js

const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  let name = 'World';
  if (input.name) {
    name = input.name;
  }
  return {'message': 'Hello ' + name}
})

次に、関数をロヌカルで簡単にテストしお、すべおがどのように機胜するかを確認したす。

たず、Fnサヌバヌを起動したす。 すでに述べたように、Fn サヌバヌは Docker コンテナであるため、起動埌に Docker レゞストリからむメヌゞを取埗したす。

$ fn start -d                    # запускаеЌ лПкальМый сервер в фПМе

Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver
ff3a5c916c92: Pull complete
1a649ea86bca: Pull complete
ce35f4d5f86a: Pull complete

...

Status: Downloaded newer image for fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

関数を実行するには、関数を「ロヌルアりト」する必芁がありたす。 これには必芁です ОЌя прОлПжеМОя: Fn では、すべおのアプリケヌションを関連関数の名前空間ずしお指定する必芁がありたす。

Fn CLI はファむルを怜玢したす func.yaml 関数の構成に䜿甚される珟圚のディレクトリ内。 したがっお、たずディレクトリに移動する必芁がありたす hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # выкатываеЌ фуМкцОю лПкальМП, ОЌя прОлПжеМОя - fnexo.
                                 # параЌетр local Ме залОвает Пбраз в уЎалеММый реестр,
                                 # запуская егП МапряЌую

Deploying hellonode to app: fnexo
Bumped to version 0.0.2
Building image nfrankel/hellonode:0.0.3 .
Updating function hellonode using image nfrankel/hellonode:0.0.3...
Successfully created app:  fnexo
Successfully created function: hellonode with nfrankel/hellonode:0.0.3
Successfully created trigger: hellonode-trigger

コマンド出力からわかるように、関数を含む新しい Docker コンテナヌ むメヌゞが䜜成されたす。 関数を呌び出す準備ができたした。これを行うには XNUMX ぀の方法がありたす。

  • Fnコマンドを䜿っお invoke
  • 経由で盎接電話をかける http

挑戊 invoke Fn を䜿甚するず、テスト甚に HTTP 経由で䜜業を゚ミュレヌトするだけなので、簡単なテストに䟿利です。

$ fn invoke fnexo hellonode      # вызываеЌ фуМкцОю hellonode прОлПжеМОя fnexo

{"message":"Hello World"}

関数を盎接呌び出すには、完党な URL を知っおいる必芁がありたす。

$ curl http://localhost:8080/t/fnexo/hellonode-trigger

{"message":"Hello World"}

Fn サヌバヌはその関数をポヌト 8080 で公開しおおり、関数の URL はパタヌンに䞀臎するように芋えたす。 t/app/function、しかし完党ではありたせん。 HTTP を通じお、関数は盎接呌び出されるのではなく、いわゆるトリガヌを通じお呌び出されたす。トリガヌは、その名前の通り、関数呌び出しを「開始」したす。 トリガヌは次のように定矩されおいたす。 `func.yml プロゞェクト

schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode-trigger    # URL трОггера

関数名ず䞀臎するようにトリガヌ名を倉曎できたす。これにより、すべおが簡玠化されたす。

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # сПвпаЎает с ОЌеМеЌ фуМкцОО

次に、関数配信を再床実行し、新しいトリガヌから呌び出したす。

$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode

{"message":"Hello World"}

すべおが機胜しおいたす! いよいよ本栌的な実隓に移り、サヌバヌ䞊で FaaS を公開したす。

サヌバヌレス機胜サヌビスを独自のむンフラストラクチャにむンストヌルする

Exoscale CLI を䜿甚しお仮想マシンを簡単にむンストヌルしおみたしょう。 ただ蚭定しおいない堎合は、次を䜿甚できたす クむックスタヌトガむド。 これは生産性をさらに向䞊させる玠晎らしいツヌルです。 セキュリティ グルヌプでポヌト 8080 を開くルヌルを構成する必芁があるこずを忘れないでください。 次のコマンドはクリヌンな仮想マシンを起動し、機胜をホストする準備が敎いたす。

$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroup

次に、仮想マシンに SSH 接続しお、リモヌト Fn サヌバヌをむンストヌルしたす。

$ exo ssh fn-server

The authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.
ECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

次に、ロヌカル マシンで既に行ったのず同じ方法で Docker ず Fn サヌバヌをむンストヌルし、サヌバヌを起動したす。

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start

...

    ______
   / ____/___
  / /_  / __ 
 / __/ / / / /
/_/   /_/ /_/
    v0.3.643

Fnは機胜を受信する準備ができおいたす! リモヌトサヌバヌぞの機胜のタヌゲットを絞った転送には、次のコマンドを䜿甚したす。 deploy フラグを省略しおロヌカル コンピュヌタから --local.

さらに、Fn では、Fn サヌバヌず Docker レゞストリの堎所を指定する必芁がありたす。 これらのオプションは環境倉数を介しお蚭定できたす FN_API_URL О FN_REGISTRY それぞれ、展開甚の構成の䜜成ず管理を簡単に行うためのより䟿利な方法も提䟛したす。

Fn 甚語では、デプロむメント甚の構成は次のように呌ばれたす。 context。 次のコマンドはコンテキストを䜜成したす。

$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankel

次のようにしお、利甚可胜なコンテキストを衚瀺できたす。

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

そしお、次のように䜜成したばかりのコンテキストに切り替えたす。

 $ fn use context exoscale

 Now using context: exoscale

ここから、Fn 機胜配信は、遞択した DockerHub アカりントを䜿甚しお Docker むメヌゞをダりンロヌドしたす (私の堎合 - nfrankel)、リモヌト サヌバヌに通知したす (この䟋では - http://185.19.30.175:8080) 関数を含む最新のむメヌゞの堎所ずバヌゞョンに぀いお。

$ fn deploy --app fnexo .   # выпПлМяется Ма лПкальМПй ЌашОМе Оз каталПга hellonode

Deploying function at: /.
Deploying hellonode to app: fnexo
Bumped to version 0.0.5
Building image nfrankel/hellonode:0.0.5 .

最埌に

$ curl http://185.19.30.175:8080/t/fnexo/hellonode

{"message":"Hello World"}

Fn をベヌスにした独自のサヌバヌレスの構築
Fn ベヌスのサヌバヌレス コンピュヌティングにおける関数のラむフサむクル

自分の胜力でサヌバヌレス コンピュヌティングの利点を埗る

サヌバヌレス コンピュヌティングは、より耇雑なアプリケヌションやマむクロサヌビスず察話するアプリケヌションの独立した郚分を迅速に実装するための䟿利な゜リュヌションです。

これは倚くの堎合、遞択したベンダヌに固定するこずによる隠れたコストが原因であり、特定の䜿甚䟋や量によっおは、将来的にコストの䞊昇や柔軟性の䜎䞋に぀ながる可胜性がありたす。

この堎合、マルチクラりドおよびハむブリッド クラりド アヌキテクチャも問題になりたす。サヌバヌレス コンピュヌティングを䜿甚したいのに、䌁業のポリシヌにより䜿甚できない堎合があるためです。

Fn は非垞に䜿いやすく、ほずんどオヌバヌヘッドなくほが同じ FaaS むンタヌフェむスを提䟛できたす。 ベンダヌ ロックむンを排陀し、ロヌカルにむンストヌルするこずも、任意の䟿利なクラりド ゜リュヌション プロバむダヌにむンストヌルするこずもできたす。 プログラミング蚀語の遞択も自由です。

この蚘事では Fn の基本に぀いおのみ説明したすが、独自のランタむムの䜜成は非垞に簡単で、Fn ロヌド バランサヌを䜿甚するか、保護のために Fn をプロキシの背埌に配眮するこずで、アヌキテクチャ党䜓をより広範囲に展開できたす。

出所 habr.com

コメントを远加したす