Node.js Lambda 함수를 위한 계층 작업
Lambda 계층을 사용하여 여러 함수에서 재사용하려는 코드와 종속성을 패키징합니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.
-
계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.
-
Lambda에서 계층을 생성합니다.
-
계층을 함수에 추가합니다.
계층 콘텐츠 패키징
계층을 생성하려면 다음 요구 사항을 충족하는 .zip 파일 아카이브로 패키지를 번들링합니다.
-
Lambda 함수에 사용하려는 것과 동일한 Node.js 버전을 사용하여 계층을 빌드합니다. 예를 들어, Node.js 22를 사용하여 계층을 빌드하는 경우 함수에 Node.js 22 런타임을 사용합니다.
-
계층의 .zip 파일은 다음 디렉터리 구조 중 하나를 사용해야 합니다.
-
nodejs/node_modules
-
nodejs/node
(여기서X
/node_modulesX
는 Node.js 버전(예:node22
))
자세한 내용은 각 Lambda 런타임에 대한 계층 경로 섹션을 참조하세요.
-
-
계층의 패키지는 Linux와 호환되어야 합니다. Lambda 함수는 Amazon Linux에서 실행됩니다.
npm
을 사용하여 설치한 타사 Node.js 라이브러리(axios
, lodash
등)나 자체 JavaScript 모듈을 포함하는 계층을 생성할 수 있습니다.
npm 패키지를 사용하여 계층을 생성하려면 다음을 수행하세요.
-
필요한 디렉터리 구조를 생성하고 해당 디렉터리에 패키지를 직접 설치합니다.
mkdir -p nodejs npm install --prefix nodejs lodash axios
이 명령은 Lambda에 필요한 구조인
nodejs/node_modules
디렉터리에 패키지를 직접 설치합니다. -
계층 콘텐츠를 .zip 파일로 압축합니다.
.zip 파일의 디렉터리 구조는 다음과 같아야 합니다.
nodejs/ ├── package.json ├── package-lock.json └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)
참고
파일의 루트 수준에
nodejs
디렉터리가 포함되어 있고 그 안에node_modules
가 있는지 확인하세요. 이 구조는 Lambda가 패키지를 찾아서 가져올 수 있도록 합니다.-
nodejs/
디렉터리의package.json
및package-lock.json
파일은 npm의 종속성 관리를 위해 사용되지만 Lambda의 계층 기능에는 필요하지 않습니다. 설치된 각 패키지에는 Lambda가 패키지를 가져오는 방식을 정의하는 자체package.json
파일이 이미 포함되어 있습니다.
자체 코드를 사용하여 계층을 생성하려면 다음을 수행하세요.
-
계층에 필요한 디렉터리 구조를 생성합니다.
mkdir -p nodejs/node_modules/validator cd nodejs/node_modules/validator
-
사용자 지정 모듈에 대한
package.json
파일을 생성하여 해당 모듈을 가져오는 방법을 정의합니다.예 nodejs/node_modules/validator/package.json
{ "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
-
JavaScript 모듈 파일을 생성합니다.
예 nodejs/node_modules/validator/index.mjs
export function validateOrder(orderData) { // Validates an order and returns formatted data const requiredFields = ['productId', 'quantity']; // Check required fields const missingFields = requiredFields.filter(field => !(field in orderData)); if (missingFields.length > 0) { throw new Error(`Missing required fields: ${missingFields.join(', ')}`); } // Validate quantity const quantity = orderData.quantity; if (!Number.isInteger(quantity) || quantity < 1) { throw new Error('Quantity must be a positive integer'); } // Format and return the validated data return { productId: String(orderData.productId), quantity: quantity, shippingPriority: orderData.priority || 'standard' }; } export function formatResponse(statusCode, body) { // Formats the API response return { statusCode: statusCode, body: JSON.stringify(body) }; }
-
계층 콘텐츠를 .zip 파일로 압축합니다.
.zip 파일의 디렉터리 구조는 다음과 같아야 합니다.
nodejs/ └── node_modules/ └── validator/ ├── package.json └── index.mjs
-
함수에서 모듈을 가져와서 사용합니다. 예시:
import { validateOrder, formatResponse } from 'validator'; export const handler = async (event) => { try { // Parse the order data from the event body const orderData = JSON.parse(event.body || '{}'); // Validate and format the order const validatedOrder = validateOrder(orderData); return formatResponse(200, { message: 'Order validated successfully', order: validatedOrder }); } catch (error) { if (error instanceof Error && error.message.includes('Missing required fields')) { return formatResponse(400, { error: error.message }); } return formatResponse(500, { error: 'Internal server error' }); } };
다음 테스트 이벤트를 사용하여 함수를 간접적으로 호출할 수 있습니다.
{ "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }
예상 응답:
{ "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }
Lambda에서 계층 생성
AWS CLI 또는 Lambda 콘솔을 사용하여 계층을 게시할 수 있습니다.
함수에 계층 추가
샘플 애플리케이션
Lambda 계층을 사용하는 방법의 자세한 예는 AWS Lambda Developer Guide GitHub 리포지토리의 layer-nodejs