ãã XNUMX ã€ã®å ±éã®ç¹åŸŽã¯ãã³ãŒããæå°éã«æããŠéäžããåŸåãããããšã§ãããããããµãŒããŒã¬ã¹ ã³ã³ãã¥ãŒãã£ã³ã°ããµãŒãã¹ãšããŠã®æ©èœ (FaaS) ãšåŒã°ããããšãããçç±ã§ãã
æŽå²çã«ãAWS Lambda 㧠FaaS ãæäŸããæåã®ã¯ã©ãŠããããã€ããŒã¯ Amazon ã§ãã£ãããããã®ååãä»ããããŸããã ä»ã®ã¯ã©ãŠã ãµãŒãã¹ ãããã€ããŒãåæ§ã®ãã®ãæäŸããŠããŸãã
- Google ã®ã¯ã©ãŠãæ©èœ
- Microsoft ã® Azure é¢æ°
ãããã®äŒæ¥ã¯ãããããµãŒããŒã¬ã¹ ã³ã³ãã¥ãŒãã£ã³ã°ãèªåã¹ã±ãŒãªã³ã°ãæäŸããå®éã«äœ¿çšããåã ãæéãæ¯æããŸããã顧客ãèªç€Ÿè£œåã«å²ã蟌ãã§ããŸãã ãã ãããµãŒããŒã¬ã¹ ã³ã³ãã¥ãŒãã£ã³ã°ã«ã¯ç¡æã®ãªãŒãã³ãœãŒã¹ã®ä»£æ¿æ段ããããŸãã ããã¯æ³šç®ã«å€ããŸãïŒ
- ãã©ããããŒã
Apache OpenWhisk IBMã®ã€ã³ãã¥ããŒã¿ãŒã§éçºãããã 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 ã®èŠæ±ã«å¿ã㊠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 ã䜿çšããŠä»®æ³ãã·ã³ãç°¡åã«ã€ã³ã¹ããŒã«ããŠã¿ãŸãããã ãŸã èšå®ããŠããªãå Žåã¯ã次ã䜿çšã§ããŸã
$ 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 ã¯éåžžã«äœ¿ãããããã»ãšãã©ãªãŒããŒããããªãã»ãŒåã FaaS ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸã§ããŸãã ãã³ã㌠ããã¯ã€ã³ãæé€ããããŒã«ã«ã«ã€ã³ã¹ããŒã«ããããšããä»»æã®äŸ¿å©ãªã¯ã©ãŠã ãœãªã¥ãŒã·ã§ã³ ãããã€ããŒã«ã€ã³ã¹ããŒã«ããããšãã§ããŸãã ããã°ã©ãã³ã°èšèªã®éžæãèªç±ã§ãã
ãã®èšäºã§ã¯ Fn ã®åºæ¬ã«ã€ããŠã®ã¿èª¬æããŸãããç¬èªã®ã©ã³ã¿ã€ã ã®äœæã¯éåžžã«ç°¡åã§ãFn ããŒã ãã©ã³ãµãŒã䜿çšããããä¿è·ã®ããã« Fn ããããã·ã®èåŸã«é 眮ããããšã§ãã¢ãŒããã¯ãã£å šäœãããåºç¯å²ã«å±éã§ããŸãã
åºæïŒ habr.com