웹사이트 검색

DigitalOcean의 서버리스 기능을 시작하는 방법


Functions는 DigitalOcean 클라우드 플랫폼에 가장 최근에 추가된 기능 중 하나입니다. DigitalOcean을 떠나지 않고 서버리스 기능을 개발할 수 있는 최고의 방법을 제공합니다. 코드는 호출 시 주문형으로 실행되므로 수동 서버 프로비저닝 및 유지 관리가 필요하지 않습니다.

이 기사에서는 DigitalOcean Functions가 무엇을 지원하는지 설명하고 자신만의 간단한 함수를 만드는 데모를 살펴봅니다. Functions에는 매월 25GiB 시간을 제공하는 무료 계층이 있으며 GiB-초는 각 함수 호출의 실행 시간을 곱한 메모리 소비로 계산됩니다.

지원되는 기능

2022년 5월에 출시된 Functions는 DigitalOcean 고객에게 서버리스 워크로드를 실행하기 위한 기본 제공 옵션을 제공합니다. 각 함수는 생성한 코드를 실행하는 자체 API 엔드포인트를 가져옵니다. 자체 서버를 설정하거나 배포 전에 프로젝트를 컨테이너화할 필요가 없습니다. 라이브 기능은 DigitalOcean의 앱 플랫폼 백엔드에서 호스팅됩니다.

Functions는 DigitalOcean의 관리형 데이터베이스와 통합되어 영구 데이터 저장을 용이하게 할 수 있습니다. 또한 터미널에서 코드를 배포하고 테스트할 수 있는 포괄적인 CLI와 함께 제공됩니다.

플랫폼의 초기 버전은 다섯 가지 프로그래밍 환경을 지원합니다.

  • 1.17 이동
  • Node.js 14
  • Node.js 14(AWS Lambda 함수와 호환 가능)
  • PHP 8
  • 파이썬 3.9

코드를 함수로 배포하려면 이러한 언어 중 하나로 코드를 작성하는 데 익숙해야 합니다. 향후 더 많은 런타임이 지원될 수 있습니다.

설정하기

DigitalOcean의 웹 제어판 또는 개발자 중심 CLI인 Doctl을 사용하여 새로운 기능을 시작할 수 있습니다. 이 기사의 목적을 위해 터미널 기반 Doctl 접근 방식에 초점을 맞추고 있습니다. 이것은 Functions의 모든 기능을 노출하고 가장 단순한 사용 사례를 제외한 모든 용도의 경로입니다. 계속하기 전에 최신 버전의 Doctl이 설치되어 있고 DigitalOcean 계정에 인증되었는지 확인하세요.

DigitalOcean Functions를 처음 사용하는 경우 몇 가지 추가 설정 단계를 완료해야 합니다. 먼저 Doctl의 serverless 확장 설치를 완료합니다. 이것은 기능 개발 및 배포에 대한 전체 지원을 추가합니다.

$ doctl serverless install
Downloading...Unpacking...Installing...Cleaning up...
Done

다음으로 서버리스 기능을 DigitalOcean 계정에 연결합니다.

$ doctl serverless connect
Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'

이제 함수 작성을 시작할 준비가 되었습니다. serverless status 명령을 실행하여 모든 것이 작동하는지 확인합니다.

$ doctl serverless status
Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'
Sandbox version is 3.1.1-1.2.1

위에 표시된 출력은 Functions 지원이 설치되었고 사용할 준비가 되었음을 확인합니다.

serverless 명령은 sandbox의 별칭입니다. 작성 시점에 두 키워드는 동일한 기능을 가지며 DigitalOcean 문서 전체에서 상호 교환적으로 사용됩니다. 이 가이드에서는 서버리스를 표준화하고 있습니다.

함수 만들기

다음 명령을 사용하여 새 Functions 프로젝트를 만듭니다.

$ doctl serverless init --language js demo-project
A local sandbox area 'demo-project' was created for you.
You may deploy it by running the command shown on the next line:
  doctl sandbox deploy demo-project

이 명령은 작업 디렉터리의 demo-project 내에 새 JavaScript 함수를 생성합니다. 이 디렉토리의 내용을 검사하여 Doctl이 귀하를 위해 스캐폴드한 것을 확인하십시오.

$ tree demo-project
demo-project
├── packages
│   └── sample
│       └── hello
│           └── hello.js
└── project.yml

3 directories, 2 files

project.yml 파일은 함수 프로젝트와 그것이 제공하는 엔드포인트를 구성하는 곳입니다.

targetNamespace: ''
parameters: {}
packages:
  - name: sample
    environment: {}
    parameters: {}
    annotations: {}
    actions:
      - name: hello
        binary: false
        main: ''
        runtime: 'nodejs:default'
        web: true
        parameters: {}
        environment: {}
        annotations: {}
        limits: {}

스타터 템플릿은 sample이라는 하나의 패키지를 구성합니다. 이 패키지에는 노드 런타임을 사용하여 실행되는 hello라는 단일 작업(엔드포인트)이 있습니다. 이 작업의 소스 코드는 packages/sample/hello/hello.js에 저장됩니다. 다음으로 이 파일을 살펴보겠습니다.

function main(args) {
    let name = args.name || 'stranger'
    let greeting = 'Hello ' + name + '!'
    console.log(greeting)
    return {"body": greeting}
}

이것은 일반 JavaScript 코드입니다. 함수가 호출될 때마다 main() 함수가 호출됩니다. 사용자 요청에서 HTTP GET 및 POST 데이터로 제출된 인수가 포함된 개체를 받습니다. 작업, 패키지 및 project.yml 파일의 최상위 프로젝트에 대한 parameters 필드를 사용하여 정적 인수도 구성할 수 있습니다.

함수는 문제에 대한 HTTP 응답을 설명하는 개체를 반환해야 합니다. body 필드는 응답에 포함되는 데이터가 됩니다.

함수 호출 및 배포

이 프로젝트를 실행할 준비가 되었습니다. 이 명령어를 사용하여 함수를 배포합니다.

$ doctl serverless deploy .
Deploying '/home/james/@scratch/demo-project'
  to namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a'
  on host 'https://faas-lon1-917a94a7.doserverless.co'
Deployment status recorded in '.nimbella'

Deployed functions ('doctl sbx fn get <funcName> --url' for URL):
  - sample/hello

서버리스 배포 명령은 함수가 포함된 디렉터리의 경로인 하나의 인수를 사용합니다. 프로젝트의 루트가 이미 작업 디렉토리인 경우 .를 사용하십시오.

이제 CLI를 사용하여 함수를 테스트할 수 있습니다.

$ doctl serverless functions invoke sample/hello -p name:howtogeek
{
    "body": "Hello howtogeek!"
}

-p 매개변수는 코드로 전달되는 인수를 설정합니다. 이 예는 함수의 반환 값이 HTTP 응답 본문이 되는 방법을 보여줍니다.

다음으로 함수에 대한 실제 API 요청을 시도합니다. 다음 명령을 사용하여 해당 URL을 찾을 수 있습니다.

$ URL=$(doctl serverless functions get sample/hello --url)

curl 또는 선호하는 HTTP 클라이언트를 사용하여 이 끝점에 도달합니다.

$ curl $URL?name=howtogeek
Hello howtogeek!

name 쿼리 문자열 매개 변수가 함수에 성공적으로 전달되었습니다.

함수 수정

지금까지는 수정 없이 DigitalOcean의 샘플 코드를 사용하고 있습니다. 이것은 서버리스 여행에서 당신을 멀리 데려가지 않을 것입니다! hello.js 파일을 다음과 같이 편집합니다.

function main(args) {
    return {
        body: {
            value: (args.value * 2),
            timestamp: Date.now()
        },
        headers: {
            "Content-Type": "application/json"
        }
    };
}

함수를 재배포합니다.

$ doctl serverless deploy .

이 함수는 value 요청 매개변수에 의해 제공된 숫자를 순진하게 두 배로 만듭니다. 또한 각 응답 본문에 타임스탬프가 포함되어 있습니다. headers 필드는 응답 개체에서 올바른 JSON Content-Type을 적용하는 데 사용됩니다.

이전과 동일한 스타일로 Doctl 또는 curl을 사용하여 이 함수를 호출할 수 있습니다.

$ curl $URL?value=2
{
  "timestamp": 1654784122966,
  "value": 4
}

각 변경 후 함수를 수동으로 재배포하는 것은 지루하고 시간이 많이 걸리는 작업입니다. 파일을 수정한 후 변경 사항을 자동으로 배포하도록 작업하는 동안 watch 명령을 실행합니다.

$ doctl serverless watch .
Watching '.' [use Control-C to terminate]

함수를 개발할 때 터미널 창을 열어 두십시오. 각각의 새 배포는 변경 사항을 테스트할 수 있는 시기를 알 수 있도록 메시지를 기록합니다. 이것은 함수를 개발할 때 효율적인 반복을 용이하게 합니다.

함수의 로그도 스트리밍할 수 있습니다. 이는 함수가 충돌하거나 예상대로 작동하지 않을 때 매우 중요합니다. 이 명령을 실행하여 데모 기능과 관련된 로그에 액세스하십시오.

$ doctl serverless activations logs --follow --function sample/hello

함수를 호출할 때마다 새 줄이 인쇄됩니다. 로그에는 코드가 환경의 표준 출력 및 오류 스트림으로 내보내는 메시지도 포함됩니다.

프로덕션에 배포

serverless deploy 명령은 현재 개발 전용으로 설계되었습니다. Functions 프로젝트용 Git 리포지토리를 생성하고 DigitalOcean의 앱 플랫폼을 사용하여 실행하여 프로덕션에 배포할 수 있습니다.

GitHub 또는 GitLab에서 새 프로젝트를 만들고 코드를 푸시합니다.

$ git init
$ git remote add origin git@github.com:user/repo.git
$ git add .
$ git commit -m "initial commit"
$ git push -u origin master

다음으로 DigitalOcean 제어판으로 이동하여 왼쪽 사이드바에서 앱 링크를 클릭합니다. 표시되는 앱 만들기 버튼을 클릭합니다. 다음 화면에서 프롬프트에 따라 GitHub 계정에 연결하고 새 리포지토리를 선택합니다. 파란색 다음 버튼을 누릅니다.

루트에 project.yml이 있는 경우 DigitalOcean은 리포지토리를 Functions 프로젝트로 자동 감지합니다. 계속하려면 검토로 건너뛰기 버튼을 클릭하십시오.

다음 화면에서 Functions 요금제를 사용하여 요금이 청구되는지 확인해야 합니다.

리소스 만들기를 눌러 앱을 프로비저닝하고 첫 번째 배포를 시작합니다. 진행 상황이 대시보드에 표시됩니다.

배포가 완료되면 함수의 엔드포인트에 공개적으로 액세스할 수 있습니다. 대시보드에서 앱 설정 페이지를 아래로 스크롤하여 앱의 기본 ondigitalocean.app 도메인을 찾을 수 있습니다. 이 예에서 앱의 도메인은 sea-lion-app.7ougx.ondigitalocean.app입니다.

함수는 다음 형식의 URI로 자동 노출됩니다.

<app>.ondigitalocean.app/<function-package>/<function-action>

다음 요청을 수행하여 이전에 만든 샘플 함수를 호출할 수 있습니다.

$ curl https://sea-lion-app.7ougx.ondigitalocean.app/sample/hello?value=2
{
  "timestamp": 1654786505969,
  "value": 4
}

기능이 성공적으로 배포되었습니다! 이제 앱 설정의 도메인 탭을 사용하여 기본 도메인 대신 사용자 지정 도메인을 연결할 수 있습니다.

요약

DigitalOcean Functions는 점점 더 복잡해지는 서버리스 기능 분야의 최신 경쟁자입니다. 이 플랫폼을 사용하면 VM을 관리하거나 코드를 수동으로 컨테이너화하지 않고도 서버 측 기능을 개발할 수 있습니다.

Functions는 엔드포인트를 구축하고 테스트하기 위한 포괄적인 CLI를 제공합니다. 그런 다음 독립 실행형 프로젝트 또는 더 큰 앱의 일부로 DigitalOcean의 기존 앱 플랫폼 솔루션에 기능을 배포할 수 있습니다.

기본 기능이 작동되면 DigitalOcean의 설명서를 참조하여 고급 동작 구성을 시작할 수 있습니다. project.yml 파일의 필드를 사용하여 환경 변수, 여러 작업 및 리소스 제한을 설정할 수 있으므로 상대적으로 복잡한 온디맨드 엔드포인트를 빠르고 쉽게 구축할 수 있습니다.


판권 소유. © Linux-Console.net • 2019-2024