Visual Studio Code를 사용하여 Node.js용 Cloud Functions로 로컬 개발

1. 개요

Google Cloud Functions는 이벤트 기반 서버리스 컴퓨팅 플랫폼입니다. Cloud Functions를 사용하면 리소스를 프로비저닝하거나 변화하는 요구사항을 처리하기 위해 확장하는 것에 대해 걱정하지 않고 코드를 작성할 수 있습니다.

JavaScript로 작성된 Cloud Functions는 Google Cloud Platform의 Node.js 환경에서 실행됩니다. 표준 Node.js 런타임에서 Cloud 함수를 실행하여 이동성과 로컬 테스트를 사용 설정할 수 있습니다.

둘러보기

이 Codelab에서는 지정된 온도가 허용되는지 아니면 너무 뜨거운지 보고하는 Node.js용 Cloud 함수를 만듭니다. 로컬 머신에서 Visual Studio Code를 사용하여 Cloud 함수를 만들고 테스트하고 디버그합니다. 마지막으로 Google Cloud Platform에 함수를 배포합니다.

학습할 내용

  • Node.js용 함수 프레임워크
  • 로컬에서 HTTP Cloud 함수를 만들고 테스트합니다.
  • 로컬 머신에서 HTTP 함수를 디버그합니다.
  • 로컬 머신에서 HTTP 함수를 배포합니다.

2. 설정 및 요구사항

기본 요건

비용

이 Codelab에서는 배포된 Cloud 함수를 한 번만 호출하면 되지만, Cloud Functions API 가격 책정 정보를 참조하여 청구 방식에 대해 알아보는 것이 좋습니다.

많은 Google API가 비용 없이 사용될 수 있지만 Google Cloud Platform (즉, 제품 및 API) 사용은 무료가 아닙니다. Cloud Functions를 사용하려면 활성 결제 계정이 필요합니다. 특정 Google Cloud Platform (GCP) 제품에는 '항상 무료' 등급이 포함되며, 이를 초과할 경우에만 결제가 발생할 수 있습니다. 이 Codelab에서는 각 Cloud Functions 호출이 이 무료 등급에 해당합니다. 1개월 내 총 사용량이 한도 내로 유지되는 한 비용이 발생하지 않습니다.

3. Node.js용 함수 프레임워크 설치

Node.js용 함수 프레임워크는 Google Cloud Functions팀에서 제공하는 포팅 가능한 Node.js 함수를 작성하기 위한 오픈소스 FaaS (Function as a Service) 프레임워크입니다.

함수 프레임워크를 사용하면 다음을 포함한 여러 다양한 환경에서 실행되는 가벼운 함수를 만들 수 있습니다.

  • Google Cloud Functions
  • 로컬 개발 머신
  • Cloud Run 및 GKE의 Cloud Run
  • Knative 기반 환경

새 node.js 앱을 만듭니다.

npm init

기본값을 수락하는 동안 index.js을 앱의 진입점으로 사용해야 합니다.

이제 Node.js용 함수 프레임워크를 설치합니다.

npm install @google-cloud/functions-framework

package.json을 엽니다. 아래 예와 같이 함수 프레임워크가 종속 항목으로 나열되어 있는지 확인합니다.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

이제 함수 프레임워크가 성공적으로 설치되었습니다. 이제 Cloud 함수를 만들 준비가 되었습니다.

4. 로컬에서 HTTP Cloud 함수 만들기 및 테스트

로컬 Cloud 함수 만들기

이 섹션에서는 HTTP 요청에 응답하는 HTTP 함수를 만들고 테스트합니다.

package.json 파일과 동일한 디렉터리에 index.js라는 새 파일을 만듭니다.

다음을 추가합니다.

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

이제 함수를 테스트할 준비가 되었습니다.

Visual Studio Code에서 함수 테스트

이제부터 이 Codelab에서는 Visual Studio Code 내의 통합 터미널을 사용합니다.

Visual Studio Code에서 터미널 창을 엽니다.

다음 명령어를 실행합니다.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

이 명령어는 서버가 HTTP 요청을 수신할 때 validateTemperature 함수를 호출할 준비가 된 로컬 서버를 시작합니다.

터미널 창에 다음과 같은 출력이 표시됩니다.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

터미널 창 창에서 New Terminal 더하기 아이콘을 클릭하여 VS Code 내에 두 번째 터미널 창을 만듭니다. 함수를 제공하는 첫 번째 터미널 창과 curl을 사용하여 함수를 호출하는 두 번째 터미널 창 간에 전환합니다.

bceb65f366d837ae.png

드롭다운을 사용하여 터미널 창 간에 전환할 수 있습니다. 터미널 창에서 현재 함수를 제공하는 경우 드롭다운 목록에 node로 표시됩니다. 그렇지 않으면 zsh (또는 사용 중인 셸)을 참조합니다.

두 번째 터미널 창에서 다음 명령어를 실행하여 validateTemperature 함수를 제공하는 로컬 서버에 온도 페이로드 50을 전송합니다.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

클라우드 함수에서 다음과 같은 응답이 표시됩니다.

Temperature OK

두 번째 터미널 창에서 아래와 같이 '너무 높은' 온도 페이로드를 전송하여 함수를 다시 테스트합니다.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

클라우드 함수에서 다음과 같은 응답이 표시됩니다.

Too hot

마지막으로 페이로드가 누락된 상태로 호출하여 함수를 테스트합니다.

curl -X POST http://localhost:8080

클라우드 함수에서 다음과 같은 응답이 표시됩니다.

Too hot

온도가 제공되지 않으면 함수가 '너무 뜨거움'을 반환하지 않는 것이 좋습니다. 코드에서 버그를 발견했습니다.

함수를 제공하는 첫 번째 터미널 창에서 Ctrl + C를 눌러 함수 실행을 중지해야 합니다.

5. 로컬 머신에서 HTTP 함수 디버깅

Visual Studio Code에서 명령어 팔레트를 엽니다. Mac을 사용하는 경우 Cmd + Shift + P를 사용하세요. Windows를 사용하는 경우 Ctrl + Shift + P.를 사용합니다.

명령어 팔레트에 auto attach를 입력하고 목록에서 상단 항목을 선택합니다.

601e542b4ec9f6f9.png

이 Codelab에서는 아래 이미지와 같이 Only With Flag를 선택합니다.

b9e6b762d150e62b.png

이제 VS Code에서 함수를 제공하는 데 사용한 터미널 창을 다시 로드합니다. 오른쪽 끝에 표시되는 경고 아이콘 위로 마우스를 가져가면 됩니다.

Relaunch Terminal을 클릭합니다.

37b61e3fb546fc76.png

새로고침된 터미널 창에서 다음 명령어를 사용하여 함수를 제공하도록 함수 프레임워크를 다시 실행합니다.

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

여기서 --inspect 플래그는 Node.js에 디버깅 클라이언트를 수신 대기하도록 지시합니다. 자세한 내용은 디버깅에 관한 노드 문서를 참고하세요.

node_modules/@google-cloud/functions-framework 대신 node_modules/.bin/functions-framework를 사용하고 있습니다. 검사 모드를 사용하려면 /node_modules/.bin에서 자동으로 심볼릭 링크된 실행 파일을 사용해야 합니다.

이번에는 디버거가 연결되었음을 나타내는 주황색 상태 표시줄이 VS Code에 표시됩니다.

줄 번호 왼쪽의 여백을 클릭하여 3번째 줄에 중단점을 설정합니다.

2fbb4d5916e1dbfa.png

중단점 아이콘이 밝은 빨간색으로 표시되어 이 코드 줄에 디버거가 액세스할 수 있음을 나타냅니다.

846e6c5993cc87f9.png

두 번째 터미널 창에서 다음 curl 명령어를 실행하여 중단점을 적중합니다.

curl -X POST http://localhost:8080 

3번 줄에 노란색 강조 표시가 나타납니다. 이 강조 표시는 이 줄이 디버거에서 평가 중인 현재 문임을 나타냅니다.

206c7ed1eb189e90.png

요청에서 온도 페이로드를 제공하지 않았으므로 temp 변수 위로 마우스를 가져가 콘텐츠가 undefined인지 확인합니다.

97979025f4bf2842.png

다음 문을 실행하려면 스텝 오버 아이콘을 클릭합니다.

현재 문이 if 문의 else 부분으로 이동합니다.

cf0e8ce7e0388f98.png

이 데모에서는 사양에 따라 모든 요청이 온도 판독값을 전송해야 한다고 가정합니다. 온도 측정값이 제공되지 않는 경우 함수에서 예외를 발생시켜야 합니다.

연결 해제 버튼을 클릭하여 디버거를 연결 해제합니다.

1070d059775ad769.png

첫 번째 터미널 창에서 Ctrl + C를 눌러 실행 중인 함수 제공을 중지합니다.

온도가 정의되지 않은 경우 예외를 발생시키는 if 문을 추가하도록 함수를 업데이트합니다.

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

첫 번째 터미널 창에서 디버거 연결을 방지하기 위해 --inspect 플래그 없이 다음 명령어를 실행하여 클라우드 함수를 다시 실행합니다.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

두 번째 터미널 창에서 다음 명령어를 실행하여 예외가 발생했는지 확인합니다.

curl -X POST http://localhost:8080 

요청에서 다음과 같은 출력이 반환됩니다.

Temperature is undefined

첫 번째 터미널 창에는 함수에서 로깅한 오류도 표시됩니다.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

이제 첫 번째 터미널 창에서 Ctrl + C를 눌러 함수 실행을 중지할 수 있습니다.

6. 로컬 머신에서 Google Cloud로 HTTP 함수 배포

로컬 머신에서 Cloud 함수를 만들고, 테스트하고, 디버그했으므로 이제 Google Cloud에 배포할 준비가 되었습니다.

다음 명령어를 실행하여 2단계에서 만든 프로젝트를 로컬에서 사용하고 있는지 확인합니다.

gcloud config get-value project

2단계에서 지정한 프로젝트가 활성 구성이 아닌 경우 다음 명령어를 실행합니다.

gcloud config set project <project-name-created-step-2>

터미널 창에서 다음 명령어를 실행합니다.

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

여기서 매개변수는 다음과 같이 설명됩니다.

  • deploy validateTemperature - 이름이 validateTemperature이고 진입점이 validateTemperature인 Cloud 함수를 배포하는 gcloud 하위 명령어
  • --trigger-http - 트리거 이벤트 유형
  • --runtime nodejs12 - 이 함수의 타겟 런타임
  • --allow-unauthenticated - 함수를 호출하기 위한 공개 액세스를 허용합니다.

Cloud Functions API를 사용 설정하라는 메시지가 표시됩니다. y를 입력하여 API를 사용 설정합니다.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

배포가 완료되면 출력에 다음이 표시됩니다.

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

터미널 창에서 curl을 사용하여 이 공개 엔드포인트를 호출합니다.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

적절한 응답을 확인하여 클라우드 함수가 성공적으로 배포되었는지 확인합니다.

Temperature OK

7. 삭제

의도치 않은 요금이 청구되지 않도록 하려면(예: 이 Cloud 함수가 무료 등급의 월별 Cloud 함수 호출 할당량보다 더 많이 호출됨) Cloud 함수를 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.

Cloud Functions를 삭제하려면 https://console.cloud.google.com/functions/에서 Cloud Functions Cloud 콘솔로 이동합니다. 2단계에서 만든 프로젝트가 현재 선택된 프로젝트인지 확인합니다.

6단계에서 배포한 validateTemperature 함수를 선택합니다. 그런 다음 삭제를 누릅니다.

4dada486485a935a.png

전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.

8. 축하합니다.

축하합니다. Codelab을 완료했습니다. Cloud Functions에서 Node.js 런타임을 지원하는 방법Cloud Functions에서 로컬 디버깅이 작동하는 방식에 대해 자세히 알아보세요.

학습한 내용

  • Node.js용 함수 프레임워크
  • 로컬에서 HTTP Cloud 함수를 만들고 테스트합니다.
  • 로컬 머신에서 HTTP 함수를 디버그합니다.
  • 로컬 머신에서 HTTP 함수를 배포합니다.