Node.js로 Lambda 함수 구축

Node.js로 Lambda 함수 구축 (Building Lambda functions with Node.js)

AWS Lambda에서 Node.js를 사용해 JavaScript 코드를 실행할 수 있어요. Lambda는 이벤트를 처리하도록 작성한 코드를 실행하는 Node.js용 런타임을 제공해요. 코드는 여러분이 관리하는 AWS Identity and Access Management(IAM) 역할의 자격 증명을 사용하는 AWS SDK for JavaScript를 포함한 환경에서 실행돼요. Node.js 런타임에 포함된 SDK 버전에 대한 자세한 내용은 런타임 포함 SDK 버전을 참고하세요.

출처: AWS Lambda 개발자 안내서

본문

Lambda는 다음 Node.js 런타임을 지원해요.

이름 식별자 운영 체제 지원 종료 날짜 함수 생성 차단 함수 업데이트 차단
Node.js 26 nodejs26.x Amazon Linux 2023 예정 없음 예정 없음 예정 없음
Node.js 24 nodejs24.x Amazon Linux 2023 2028년 4월 30일 2028년 6월 1일 2028년 7월 1일
Node.js 22 nodejs22.x Amazon Linux 2023 2027년 4월 30일 2027년 6월 1일 2027년 7월 1일

Node.js 함수 생성

  1. Lambda 콘솔을 열어요.
  2. 함수 생성(Create function) 을 선택해요.
  3. 다음 설정을 구성해요.
    • 함수 이름(Function name) : 함수 이름을 입력해요.
    • 런타임(Runtime) : Node.js 24.x 를 선택해요.
  4. 함수 생성(Create function) 을 선택해요.

콘솔은 index.mjs 라는 단일 소스 파일이 있는 Lambda 함수를 만들어요. 이 파일을 편집하고 내장 코드 편집기에서 파일을 더 추가할 수 있어요. 배포(DEPLOY) 섹션에서 배포(Deploy) 를 선택해 함수의 코드를 업데이트해요. 그리고 테스트 이벤트(TEST EVENTS) 섹션에서 테스트 이벤트 생성(Create test event) 을 선택해 코드를 실행해요.

index.mjs 파일은 이벤트 객체와 컨텍스트 객체를 받는 handler 함수를 내보내요. 이것이 함수가 호출될 때 Lambda가 호출하는 핸들러 함수예요. Node.js 함수 런타임은 Lambda에서 호출 이벤트를 받아 핸들러에 전달해요. 함수 구성에서 핸들러 값은 index.handler 예요.

함수 코드를 저장하면 Lambda 콘솔이 .zip 파일 아카이브 배포 패키지를 만들어요. 콘솔 외부(IDE 사용)에서 함수 코드를 개발할 때는 코드를 Lambda 함수에 업로드하기 위해 배포 패키지를 만들어야 해요.

함수 런타임은 호출 이벤트와 함께 컨텍스트 객체를 핸들러에 전달해요. 컨텍스트 객체는 호출, 함수, 실행 환경에 대한 추가 정보를 담고 있어요. 환경 변수에서 더 많은 정보를 얻을 수 있어요.

Lambda 함수에는 CloudWatch Logs 로그 그룹이 함께 제공돼요. 함수 런타임은 각 호출에 대한 세부 정보를 CloudWatch Logs로 보내요. 호출 중 함수가 출력하는 로그도 중계해요. 함수가 오류를 반환하면 Lambda는 오류 형식을 지정해 호출자에게 반환해요.

런타임 포함 SDK 버전 (Runtime-included SDK versions)

지원되는 모든 Lambda Node.js 런타임에는 AWS SDK for JavaScript v3의 특정 마이너 버전이 포함돼 있어요. 최신 버전이 아니에요. 런타임에 포함되는 특정 마이너 버전은 런타임 버전과 여러분의 AWS 리전에 따라 달라져요. 사용 중인 런타임에 포함된 SDK의 특정 버전을 찾으려면 다음 코드로 Lambda 함수를 만들어보세요.

예제 index.mjs

import packageJson from '@aws-sdk/client-s3/package.json' with { type: 'json' };

export const handler = async () => ({ version: packageJson.version });

다음 형식의 응답을 반환해요.

{
  "version": "3.632.0"
}

자세한 내용은 핸들러에서 SDK for JavaScript v3 사용을 참고하세요.

TCP 연결에 keep-alive 사용 (Using keep-alive for TCP connections)

기본 Node.js HTTP/HTTPS 에이전트는 모든 새 요청에 대해 새 TCP 연결을 만들어요. 새 연결을 만드는 비용을 피하기 위해 모든 지원되는 Node.js 런타임에서 keep-alive가 기본으로 활성화돼 있어요. keep-alive는 SDK로 여러 API 호출을 하는 Lambda 함수의 요청 시간을 줄일 수 있어요.

keep-alive를 비활성화하려면 AWS SDK for JavaScript 3.x Developer Guide의 Node.js에서 keep-alive로 연결 재사용을 참고하세요. keep-alive 사용에 대한 자세한 내용은 AWS Developer Tools Blog의 모듈식 AWS SDK for JavaScript에서 HTTP keep-alive가 기본으로 켜짐을 참고하세요.

CA 인증서 로딩 (CA certificate loading)

Node.js 18까지의 Node.js 런타임 버전에서는 Lambda가 Amazon 관련 CA(인증 기관) 인증서를 자동으로 로드해서 다른 AWS 서비스와 상호작용하는 함수를 더 쉽게 만들 수 있게 해줘요. 예를 들어 Lambda는 Amazon RDS 데이터베이스에 설치된 서버 ID 인증서 검증에 필요한 Amazon RDS 인증서를 포함해요. 이 동작은 콜드 스타트 중 성능에 영향을 줄 수 있어요.

Node.js 20부터 Lambda는 기본적으로 추가 CA 인증서를 더 이상 로드하지 않아요. Node.js 20 런타임에는 /var/runtime/ca-cert.pem 에 모든 Amazon CA 인증서가 있는 인증서 파일이 포함돼 있어요. Node.js 18 이하 런타임의 동일한 동작을 복원하려면 NODE_EXTRA_CA_CERTS 환경 변수를 /var/runtime/ca-cert.pem 으로 설정해요.

최적의 성능을 위해 배포 패키지에 필요한 인증서만 번들로 묶고 NODE_EXTRA_CA_CERTS 환경 변수로 로드하는 것을 권장해요. 인증서 파일은 PEM 형식의 신뢰할 수 있는 루트 또는 중간 CA 인증서 하나 이상으로 구성돼야 해요. 예를 들어 RDS를 위해 필요한 인증서를 certificates/rds.pem 으로 코드와 함께 포함하고, NODE_EXTRA_CA_CERTS 를 /var/task/certificates/rds.pem 으로 설정해 인증서를 로드해요.

실험적 Node.js 기능 (Experimental Node.js features)

업스트림 Node.js 언어 릴리스 중 일부는 일부 실험적 기능을 기본으로 활성화해요. Lambda는 런타임 안정성과 일관된 성능을 보장하기 위해 이 기능들을 비활성화해요. 다음 표는 Lambda가 비활성화하는 실험적 기능을 보여줘요.

실험적 기능 지원되는 Node.js 버전 Lambda가 적용하는 Node.js 플래그 재활성화용 Lambda 플래그
ES 모듈에서 require를 사용한 모듈 import 지원 Node.js 20, Node.js 22, Node.js 24 --no-experimental-require-module --experimental-require-module
ES vs CommonJS 모듈 자동 감지 지원 Node.js 22, Node.js 24 --no-experimental-detect-module --experimental-detect-module

비활성화된 실험적 기능을 활성화하려면 재활성화 플래그를 NODE_OPTIONS 환경 변수에 설정해요. 예를 들어 ES 모듈 require 지원을 활성화하려면 NODE_OPTIONS 를 --experimental-require-module 로 설정해요. Lambda는 이 재정의를 감지하고 해당 비활성화 플래그를 제거해요.

중요

실험적 기능을 사용하면 불안정성과 성능 문제가 발생할 수 있어요. 이 기능들은 향후 Node.js 버전에서 변경되거나 제거될 수 있어요. 실험적 기능을 사용하는 함수는 Lambda 서비스 수준 계약(SLA) 또는 AWS Support 대상이 아니에요.

더 알아보기 (Learn more)