Cloud Functions를 새로운 Node.js 런타임으로 이전

이 문서에서는 Cloud Functions 코드 마이그레이션에 도움이 되도록 Node.js 런타임 버전 간의 차이점을 설명합니다.

최신 런타임으로 마이그레이션

최신 런타임으로 마이그레이션하려면 다음과 같이 합니다.

  1. 이 문서에서 대상 런타임에 대해 읽어보고 도입된 차이점을 파악한 후 필요에 따라 코드를 변경합니다. 특히 Node.js 10 런타임에 도입된 환경 변수 변경사항에 유의하세요.
  2. 대상 Node.js 런타임을 지정하여 함수를 배포합니다.

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Node.js 14 런타임의 차이점

Node.js 14에서는 새로운 기능과 개념을 소개합니다. 하이라이트:

  • 옵셔널 체이닝. 옵셔널 체이닝은 {"hello": null}?.hello?.neat와 같습니다. 이렇게 하면 존재하지 않을 수 있는 객체의 딥 키에 안전하게 액세스할 수 있습니다.
  • Nullish coalescing. 이는 할당에 ||를 사용하는 것보다 더 안전한 ??를 도입합니다. null 또는 undefined의 경우 false로 평가되기 때문입니다.

Node.js 14 기능에 대한 자세한 내용은 여기를 참조하세요.

Node.js 12 런타임의 차이점

Node.js 12는 항상 package.json에서 prepare 스크립트를 실행하는 npm ci를 사용합니다.

npm install 사용과 npm ci 사용의 주요 차이점은 다음과 같습니다.

  • 프로젝트에는 기존 package-lock.json 또는 npm-shrinkwrap.json이 있어야 합니다.
  • 패키지 잠금의 종속 항목이 package.json의 종속 항목과 일치하지 않으면 npm ci가 패키지 잠금을 업데이트하는 대신 오류와 함께 종료됩니다.
  • node_modules가 이미 존재하는 경우 npm ci가 설치를 시작하기 전에 자동으로 삭제됩니다.

Node.js 10에서 Node.js 12로 업그레이드하려면 prepare에 사용되는 종속 항목을 devDependencies에서 dependencies로 이동합니다.

Node.js 12 이상에서는 메모리 한도가 2GiB 이상인 함수를 사용하려면 사용자가 NODE_OPTIONSmax_old_space_size로 구성해야 합니다. 예를 들면 다음과 같습니다.

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Node.js 10 런타임의 차이점

Node.js 10 런타임에는 새로운 런타임을 사용하기 위해 함수의 소스 코드를 수정해야 하는 변경사항이 도입되었습니다.

대부분의 애플리케이션은 Node 8에서 Node 10으로 업그레이드 시 코드가 변경되지 않습니다(주요 차이점은 GCF의 환경 변수 변경).

Node 10에는 비동기 반복기 및 프라미스 기반 파일 API와 같은 다양한 새 기능과 성능 개선, 보안 패치가 도입되었습니다.

로깅

Node.js 8에서 객체 또는 컬렉션을 로깅할 때 JSON.stringify를 사용하지 않은 경우 Node.js 10으로 업그레이드하면 로그 볼륨이 증가할 수 있습니다. 이로 인해 추가 비용이 발생할 수 있습니다. 로그 쓰기, 보기, 응답하기에 표시된 대로 JSON.stringify를 사용하여 로그 구문을 그룹화하는 것이 좋습니다.

환경 변수 변경사항

Node.js 10 런타임에는 런타임에서 사전 정의되는 환경 변수가 변경되었습니다. Node.js 10 런타임과 이전 런타임에서 설정된 환경 변수 간의 차이에 대한 자세한 설명은 자동으로 설정된 환경 변수를 참조하세요.

이전 Node.js 함수를 Node.js 10 런타임 이상에서 실행하려면 사용 중인 사전 정의된 환경 변수를 변경해야 할 수 있습니다. 가능한 경우 대체 변수를 사용하도록 코드를 업데이트하거나 함수를 배포할 때 환경 변수를 직접 설정하세요. 권장사항으로는 명시적으로 설정하지 않은 환경 변수를 사용하지 않는 것이 좋습니다.

다음 환경 변수는 더 이상 Node.js 10 런타임에 의해 설정되지 않습니다.

환경 변수 이전
CODE_LOCATION 함수를 배포할 때 설정합니다. 코드 위치는 /srv입니다.
ENTRY_POINT 이 변수 대신 FUNCTION_TARGET 환경 변수를 사용합니다.
GOOGLE_CLOUD_PROJECT 함수를 배포할 때 설정합니다.
GCP_PROJECT 함수를 배포할 때 설정합니다.
GCLOUD_PROJECT 함수를 배포할 때 설정합니다.
GOOGLE_CLOUD_REGION 함수를 배포할 때 설정합니다.
FUNCTION_REGION 함수를 배포할 때 설정합니다.
FUNCTION_NAME 이 변수 대신 K_SERVICE 환경 변수를 사용합니다.
FUNCTION_IDENTITY 함수를 배포할 때 설정합니다.
FUNCTION_MEMORY_MB 함수를 배포할 때 설정합니다.
FUNCTION_TIMEOUT_SEC 함수를 배포할 때 설정합니다.
FUNCTION_TRIGGER_TYPE 이 변수 대신 FUNCTION_SIGNATURE_TYPE 환경 변수를 사용합니다. 사용 세부정보는 환경 변수 사용을 참조하세요.
OLDPWD 더 이상 사용되지 않습니다.
SHLVL 더 이상 사용되지 않습니다.

Node.js 8 런타임의 차이점

Node.js 6 런타임과 Node.js 8 런타임 간에 백그라운드 함수의 서명이 변경되었으며 Node.js 10에도 이러한 변경이 계속됩니다.

Node.js 6 백그라운드 함수의 예시는 다음과 같습니다.

exports.nodejs6BackgroundFunction = (event, callback) => {
  let data = event.data;
  let context = event.context;
  // ... the rest of your function
};

event 인수에 datacontext 속성이 포함됩니다. Node.js 10 런타임에서 datacontext 속성은 event 객체에서 추출되었는데 이제는 함수 서명의 일부로 포함됩니다.

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

이 변경으로 이전에 event 인수 내에 포함되었던 datacontext 객체의 참조가 간소화됩니다. 자세한 내용은 백그라운드 함수 매개변수를 참조하세요.

Node.js 6 백그라운드 함수 서명을 사용하는 경우 새 Node.js 런타임에서 함수를 실행할 수 있도록 다음 항목을 변경하세요.

  1. (event, callback)에서 (data, context, callback)으로 함수 서명을 변경합니다.

  2. event.dataevent.context에 대한 참조를 각각 datacontext로 변경합니다.

지원 중단: Node.js 6 및 Node.js 8

Node.js 6Node.js 8 런타임은 지원 중단되었습니다. 지원되는 Node.js 버전에서 함수를 사용하려면 Node.js 10 이상으로 마이그레이션하세요.

2020년 8월 5일 이후에는 Node.js 6을 사용하는 함수 배포가 차단됩니다. 이 시점 후에도 계속 Node.js 6을 사용하는 Cloud Functions는 사용 중지될 수 있습니다.