AWS Lambda에서 npm 모듈을로드하는 방법은 무엇입니까?


147

웹 기반 편집기를 사용하여 여러 Lambda 함수를 만들었습니다. 여태까지는 그런대로 잘됐다. 이제 모듈 (예 : Q for promises)을 사용하여 모듈을 확장하고 싶습니다. 모듈을 Lambda로 가져 오는 방법을 알아낼 수 없으므로 내 기능으로 사용할 수 있습니다.

나는 통해 읽은 있지만 EC2를 설정하고 거기에서 람다 기능을 실행 포함 보인다. 함수를 만들 때 zip을 업로드하는 메커니즘이 있지만 로컬로 개발 된 함수를 보내는 것 같습니다. 웹 기반 편집기에서 작업하고 있기 때문에 이상한 워크 플로처럼 보입니다.

Lambda 함수에서 사용하기 위해 일부 모듈을 간단히 배포하려면 어떻게해야합니까?


7
여기 문서에 설명되어 있습니다 -docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

답변:


197

.zip파일 을 업로드하지 않고 NPM 모듈을로드 할 수는 없지만 실제로이 프로세스를 두 개의 빠른 명령 행으로 내릴 수 있습니다.

방법은 다음과 같습니다.

  1. Lambda 함수 파일을 별도의 디렉토리에 저장하십시오. 이는 npmLambda 용 패키지를 로컬로 설치 하고 Lambda에 업로드 할 내용을 격리하고 테스트 할 수 있기를 원하기 때문입니다.

  2. npm install packageName1 단계에서 생성 한 별도의 Lambda 디렉토리에 있는 동안 NPM 패키지를 로컬로 설치하십시오 .

  3. 로컬에서 실행할 때 함수가 작동하는지 확인하십시오. 코드에서 node lambdaFunc.jsexport.handler줄을 주석 처리 하여 노드에서 로컬로 실행되도록 코드를 조정할 수 있습니다.

  4. 람다의 디렉토리로 이동하여 압축 내용을 확인, 하지 디렉토리 자체를 포함 할 수 있습니다.

    zip -r lambdaFunc.zip .
    
  5. 당신이 경우 aws-cli설치 당신이 당신의 인생을 더 쉽게 만들고 싶어, 당신이 지금이 명령을 입력 할 수 있습니다,를 제안한다 :

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (내가했던 것처럼 궁금하다면 위의 lambdaFunc 부분 주위에 따옴표가 없습니다)

  6. 이제 Lambda 콘솔에서 테스트 를 클릭 할 수 있습니다 .

  7. 위의 두 명령 모두에 짧은 별칭을 추가하는 것이 좋습니다. 훨씬 긴 Lambda 업데이트 명령을 위해 내가 가지고있는 것은 다음과 같습니다.

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    

10
타겟팅하려는 지역을 명시 적으로 명시해야 할 수도 있습니다. aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
이 작업을 수행하는 것이 훨씬 더 많은 작업처럼 보이지만 실제로는 이러한 람다 식을 작성하는 훨씬 더 좋은 방법입니다 ... 많은 감사합니다!
Mike Perrenoud

9
--zip-file fileb://--zip-file file://
McLovin

2
디렉토리 의 내용 만 압축 하고 CLI에서 수행하십시오 (Mac의 파인더에서 'compress'명령을 사용하면 작동하지 않습니다 ).
Yarin

2
이것은 매우 유용했습니다 .. 나를 위해이 작업을 수행하기 위해 적어도 두 가지가 누락되었습니다 ... 1) --zip-file fileb:대신 했습니다 file. 2) MacOS에서는 3 개의 슬래시가있는 것 같습니다fileb:///Users/wio/Documents
Tobi

30

.zip파일을 포함하기 위해 필요 NPM 람다 모듈. 그리고 프로덕션 코드와 마찬가지로 Lambda 웹 편집기를 사용하지 않아야하며 로컬로 개발하고 git에 커밋해야합니다.

나의 흐름 :

1) 내 Lambda 함수는 일반적으로 더 큰 프로젝트의 도우미 유틸리티이므로 / aws / lambdas를 만듭니다. 디렉토리를 .

2) 각 개별 람다 디렉토리에는 함수 코드, 종속성을 정의 하는 package.json 파일 및 / node_modules 서브 디렉토리를 포함하는 index.js 파일이 있습니다. (lambda는 package.json 파일을 사용하지 않으므로 명령을 로컬에서 실행할 수 있습니다 .)npm install

package.json :

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3) npm 설치 및 압축에서 생성 된 파일이 저장소를 어지럽히 지 않도록 모든 node_modules 디렉토리와 .zip 파일을 .gitignore합니다.

gitignore :

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) npm install디렉토리 내에서 실행 하여 모듈을 설치하고 로컬에서 기능을 개발 / 테스트합니다.

5) 람다 디렉토리를 압축하고 콘솔을 통해 업로드하십시오.

( 중요 : Finder에서 Mac의 '압축'유틸리티를 사용하여 파일을 압축하지 마십시오! 디렉토리의 루트 내에서 CLI에서 zip을 실행해야합니다. 여기를 참조 하십시오. )

zip -r ../yourfilename.zip * 

노트:

Lambda의 Linux 기반 환경에 배포 할 때 일부 플랫폼 별 모듈이 실패 할 수 있으므로 Mac에 로컬로 노드 모듈을 설치하면 문제가 발생할 수 있습니다. ( https://stackoverflow.com/a/29994851/165673 참조 )

해결책은 사용중인 Lambda Node.js 런타임에 해당하는 AMI에서 시작된 EC2 인스턴스에서 모듈을 컴파일하는 것입니다 (이 Lambda 런타임 및 해당 AMI 목록 참조 ).


Node.js의 AWS Lambda 배포 패키지-AWS Lambda를 참조하십시오.



9

Serverless 프레임 워크를 사용하면 다음과 같이 할 수 있습니다.

  1. serverless.yml 파일에 다음을 추가하십시오.

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. 그런 다음 Lambda 함수를 생성하고로 배포하십시오 serverless deploy. serverless.yml에 포함 된 패키지가 제공됩니다.

서버리스에 대한 자세한 정보 : https://serverless.com/framework/docs/providers/aws/guide/quick-start/


먼저 설치해야합니다serverless plugin install --name pluginName
Liad Livnat

1

npm 모듈은 nodejs 패키지 내에서 번들로 묶어야하고 zip으로 AWS Lambda Layers에 업로드해야합니다. 그러면 아래에서 모듈 / js를 참조하고 사용 가능한 방법을 사용해야합니다. const mymodule = require ( '/ opt / nodejs / MyLogger');

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.