Node.js Lambda 함수를 위한 계층 작업
Lambda 계층은 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브입니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.
-
계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.
-
Lambda에서 계층을 생성합니다.
-
계층을 함수에 추가합니다.
이 주제에는 외부 라이브러리 종속성이 있는 Node.js Lambda 계층을 올바르게 패키징하고 생성하는 방법에 대한 단계와 지침이 포함되어 있습니다.
사전 조건
이 섹션의 단계를 수행하려면 다음이 필요합니다.
-
Node.js 20
및 npm 패키지 관리자. Node.js 설치에 대한 자세한 내용은 Node.js 설명서의 패키지 관리자를 통해 Node.js 설치 를 참조하세요.
이 주제에서는 aws-lambda-developer-guide GitHub 리포지토리의 layer-nodejs
layer-nodejs
샘플 애플리케이션은 lodashlayer
디렉터리는 계층을 생성하는 스크립트를 포함합니다. function
디렉터리에는 계층이 작동하는지 테스트하는 샘플 함수가 들어 있습니다. 이 문서는 이 계층을 생성, 패키징, 배포 및 테스트하는 방법을 안내합니다.
Lambda 런타임 환경과 Node.js 계층 호환성
Node.js 계층에서 코드를 패키징할 때 코드와 호환되는 Lambda 런타임 환경을 지정합니다. 런타임과의 코드 호환성을 평가하려면 코드가 설계된 Node.js 버전, 운영 체제, 명령 세트 아키텍처를 고려하세요.
Lambda Node.js 런타임은 Node.js 버전과 운영 체제를 지정합니다. 이 문서에서는 AL2023 기반의 Node.js 20 런타임을 사용합니다. 런타임 버전에 대한 자세한 내용은 지원되는 런타임 섹션을 참조하세요. Lambda 함수를 생성할 때 명령 세트 아키텍처를 지정합니다. 이 문서에서는 arm64
아키텍처를 사용합니다. Lambda의 아키텍처에 대한 자세한 내용은 Lambda 함수에 대한 명령 세트 아키텍처의 선택 및 구성 섹션을 참조하세요.
패키지에 제공된 코드를 사용하는 경우 각 패키지 관리자는 독립적으로 호환성을 정의합니다. 대부분의 Node.js 개발은 운영 체제 및 명령 세트 아키텍처와 독립적으로 작동하도록 설계되었습니다. 또한 새 Node.js 버전에서 호환성 문제가 발생하는 일은 흔하지 않습니다. Node.js 버전, 운영 체제 또는 명령 세트 아키텍처와의 패키지 호환성을 평가하는 것보다 패키지 간 호환성을 평가하는 데 더 많은 시간을 할애해야 합니다.
때로는 Node.js 패키지에 컴파일된 코드가 포함되어 있는데, 이를 위해서는 운영 체제와 명령 세트 아키텍처 호환성을 고려해야 합니다. 패키지의 코드 호환성을 평가해야 하는 경우 패키지와 해당 설명서를 검토해야 합니다. NPM의 패키지는 package.json
매니페스트 파일의 engines
, os
및 cpu
필드를 통해 호환성을 지정할 수 있습니다. package.json
파일에 대한 자세한 내용은 NPM 설명서의 package.json
Node.js 런타임의 계층 경로
함수에 계층을 추가하면 Lambda는 계층 콘텐츠를 해당 실행 환경으로 추출합니다. 레이어가 특정 폴더 경로에 종속성을 패키징하는 경우 Node.js 실행 환경은 모듈을 인식하고 함수 코드에서 모듈을 참조할 수 있습니다.
모듈이 선택되도록 하려면 다음 폴더 경로 중 하나에 레이어 .zip 파일로 패키징합니다. 이러한 파일은 /opt
에 저장되고 폴더 경로는 PATH
환경 변수에 로드됩니다.
nodejs/node_modules
nodejs/node
X
/node_modules
예를 들어 이 자습서에서 생성하는 결과 레이어 .zip 파일의 디렉터리 구조는 다음과 같습니다.
layer_content.zip
└ nodejs
└ node20
└ node_modules
└ lodash
└ <other potential dependencies>
└ ...
nodejs/node20/node_modules
디렉터리에 lodash
계층 콘텐츠의 패키징
이 예에서는 lodash
라이브러리를 계층 .zip 파일로 패키징합니다. 다음 단계를 완료하여 계층 콘텐츠를 설치하고 패키징합니다.
계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
-
sample-apps/layer-nodejs
디렉터리에 필요한 샘플 코드가 포함된 GitHub의 aws-lambda-developer-guide리포지토리를 복제합니다. git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-nodejs
샘플 앱의layer
디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.cd aws-lambda-developer-guide/sample-apps/layer-nodejs/layer
-
package.json
파일에lodash
가 나열되어 있는지 확인합니다. 이 파일은 계층에 포함하려는 종속성을 정의합니다. 이 파일을 업데이트하여 계층에 원하는 종속성을 포함할 수 있습니다.참고
이 단계에서 사용되는
package.json
은 Lambda 계층에 업로드된 후 종속성과 함께 저장되거나 사용되지 않습니다. 계층 패키징 프로세스에서만 사용되며, Node.js 애플리케이션이나 게시된 패키지에서와 같이 실행 명령 및 호환성을 지정하지 않습니다. -
layer
디렉터리에서 스크립트를 실행할 수 있는 쉘 권한이 있는지 확인합니다.chmod 744 1-install.sh && chmod 744 2-package.sh
-
다음 명령을 사용하여 1-install.sh
스크립트를 실행합니다. ./1-install.sh
이 스크립트는
npm install
을 실행하며, 이는package.json
을 읽고 내부에 정의된 종속성을 다운로드합니다.예 1-install.sh
npm install .
-
다음 명령을 사용하여 2-package.sh
스크립트를 실행합니다. ./2-package.sh
이 스크립트는
node_modules
디렉터리의 내용을nodejs/node20
이라는 새 디렉터리에 복사합니다. 그런 다음nodejs
디렉터리의 내용을layer_content.zip
라는 파일로 압축합니다. 이는 계층의 .zip 파일입니다. Node.js 런타임의 계층 경로 섹션에 표시된 것처럼 파일의 압축을 풀고 올바른 파일 구조가 포함되어 있는지 확인할 수 있습니다.예 2-package.sh
mkdir -p nodejs/node20 cp -r node_modules nodejs/node20/ zip -r layer_content.zip nodejs
계층의 생성
이전 섹션에서 생성한 layer_content.zip
파일을 가져와 Lambda 계층으로 업로드합니다. AWS Command Line Interface(AWS CLI)를 통해 AWS Management Console 또는 Lambda API를 사용하여 계층을 업로드할 수 있습니다. 계층 .zip 파일을 업로드할 때 다음 PublishLayerVersion AWS CLI 명령에서 nodejs20.x
을 호환 런타임으로, arm64
를 호환 아키텍처로 지정합니다.
aws lambda publish-layer-version --layer-name nodejs-lodash-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes nodejs20.x \ --compatible-architectures "arm64"
응답에서 arn:aws:lambda:us-east-1:
처럼 보이는 123456789012
:layer:nodejs-lodash-layer:1LayerVersionArn
에 유의하세요. 이 자습서의 다음 단계인 함수에 계층을 추가할 때 이 Amazon 리소스 이름(ARN)이 필요합니다.
함수에 계층 추가
함수 코드에 lodash
라이브러리를 사용하는 샘플 Lambda 함수를 배포한 다음 생성한 계층을 연결합니다. 함수를 배포하려면 실행 역할이 필요합니다. 자세한 내용은 실행 역할로 Lambda 함수 권한 정의 단원을 참조하십시오. 기존 실행 역할이 없으면 접을 수 있는 섹션의 단계를 따르세요. 그렇지 않은 경우 다음 섹션으로 건너뛰어 기능을 배포하세요.
실행 역할을 만들려면
-
IAM 콘솔에서 역할 페이지
를 엽니다. -
역할 생성을 선택합니다.
-
다음 속성을 사용하여 역할을 만듭니다.
-
신뢰할 수 있는 엔터티 – Lambda.
-
권한 – AWSLambdaBasicExecutionRole.
-
역할 이름 –
lambda-role
.
AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.
-
샘플 함수 코드_.findLastIndex
메서드를 사용하여 객체 배열을 읽습니다. 객체를 기준과 비교하여 일치하는 인덱스를 찾습니다. 그런 다음 Lambda 응답에서 객체의 인덱스와 값을 반환합니다.
import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
Lambda 함수를 배포하려면 다음을 수행합니다.
-
function/
디렉터리로 이동합니다. 현재layer/
디렉터리에 있는 경우 다음 명령을 실행하세요.cd ../function-js
-
다음 명령을 사용하여 .zip 파일 배포 패키지를 생성합니다.
zip my_deployment_package.zip index.mjs
-
함수를 배포합니다. 다음 AWS CLI 명령에서
--role
파라미터를 실행 역할 ARN으로 바꿉니다.aws lambda create-function --function-name nodejs_function_with_layer \ --runtime nodejs20.x \ --architectures "arm64" \ --handler index.handler \ --role
arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://my_deployment_package.zip -
계층을 함수에 연결합니다. 다음 AWS CLI 명령에서
--layers
파라미터를 이전에 기록해 둔 계층 버전 ARN으로 바꿉니다.aws lambda update-function-configuration --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1
" -
다음 AWS CLI 명령으로 함수를 간접적으로 간접 호출하여 작동하는지 확인합니다.
aws lambda invoke --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{}' response.json
다음과 유사한 출력 화면이 표시되어야 합니다.
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
출력
response.json
파일은 응답에 대한 세부 정보를 포함합니다.
이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.
Lambda 계층을 삭제하려면 다음을 수행합니다.
-
Lambda 콘솔의 계층 페이지
를 엽니다. -
생성한 계층을 선택합니다.
-
삭제를 선택한 다음 삭제를 다시 선택합니다.
Lambda 함수를 삭제하려면
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
생성한 함수를 선택합니다.
-
작업, 삭제를 선택합니다.
-
텍스트 입력 필드에
confirm
를 입력하고 Delete(삭제)를 선택합니다.