Fn์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์ฒด ์„œ๋ฒ„๋ฆฌ์Šค ๊ตฌ์ถ•

Fn์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์ฒด ์„œ๋ฒ„๋ฆฌ์Šค ๊ตฌ์ถ•

์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์˜ ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง„ ์ถ”์„ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์šด์˜ ์›์น™์€ ์ธํ”„๋ผ๊ฐ€ DevOps์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋น„์Šค ์ œ๊ณต์ž์˜ ๊ด€์‹ฌ์‚ฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ ์กฐ์ •์€ ๋กœ๋“œ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์กฐ์ •๋˜๋ฉฐ ๋ณ€๊ฒฝ๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ํŠน์ง•์€ ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ง‘์ค‘ํ•˜๋Š” ๊ฒฝํ–ฅ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ…์„ ๋•Œ๋•Œ๋กœ FaaS(Function as a Service)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์—ญ์‚ฌ์ ์œผ๋กœ AWS Lambda๋ฅผ ํ†ตํ•ด FaaS๋ฅผ ์ œ๊ณตํ•œ ์ตœ์ดˆ์˜ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋Š” Amazon์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด๋„ ๋น„์Šทํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Google์˜ Cloud Functions
  • Microsoft์˜ Azure Functions

์ด๋“ค ํšŒ์‚ฌ๋Š” ๋ชจ๋‘ ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ…, ์ž๋™ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€๋งŒ ๊ณ ๊ฐ์„ ๋…์  ์ œํ’ˆ์— ๊ณ ์ •์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ…์„ ์œ„ํ•œ ๋ฌด๋ฃŒ ์˜คํ”ˆ ์†Œ์Šค ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋“ค ๋ชจ๋‘๋Š” ํด๋ผ์šฐ๋“œ์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ž์ฒด ํด๋ผ์šฐ๋“œ, ๊ณต์šฉ ํด๋ผ์šฐ๋“œ, ํ”„๋ผ์ด๋น— ํด๋ผ์šฐ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํด๋ผ์šฐ๋“œ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  Exoscale์—๋„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fn ํ”„๋กœ์ ํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹

Fn์€ ์™„์ „ํžˆ Docker๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Fn ์ธํ”„๋ผ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ๊ด€๋ฆฌํ•˜๊ณ  Fn ์„œ๋ฒ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋„๋ก ์„ค๊ณ„๋œ CLI ํ”„๋กœ๊ทธ๋žจ,
  • Fn ์„œ๋ฒ„ ์ž์ฒด๋Š” Docker ์ปจํ…Œ์ด๋„ˆ์— ํŒจํ‚ค์ง€๋œ ์ผ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

Fn์— ๋ฐฐํฌ๋œ ๊ธฐ๋Šฅ์€ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‹คํ–‰๋˜๋ฏ€๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด Clojure์™€ ๊ฐ™์€ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ธ์ˆ˜๋Š” ํ‘œ์ค€ ์ž…๋ ฅ(STDIN)์œผ๋กœ ์ „๋‹ฌ๋˜๊ณ , ๊ฒฐ๊ณผ๋Š” ํ‘œ์ค€ ์ถœ๋ ฅ(STDOUT)์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋‹จ์ˆœ ๊ฐ’(JSON ๊ฐ์ฒด ๋“ฑ)์ด ์•„๋‹Œ ๊ฒฝ์šฐ FDK(Function Development Kit) ํ˜•ํƒœ๋กœ Fn ์ž์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ํ•ด๋‹น ๋ฒ„์ „(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 -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์— ํ•„์š”ํ•œ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์„ ํƒํ•œ ์–ธ์–ด๋กœ ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ๋Ÿฐํƒ€์ž„์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

$ 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 ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€