Làm cách nào để tải các mô-đun npm trong AWS Lambda?


147

Tôi đã tạo một số chức năng Lambda bằng trình chỉnh sửa dựa trên web. Càng xa càng tốt. Bây giờ tôi muốn bắt đầu mở rộng những người có mô-đun (chẳng hạn như Q cho lời hứa). Tôi không thể tìm ra cách đưa các mô-đun ra Lambda để chúng có thể được sử dụng bởi các chức năng của tôi.

Tôi đã đọc qua điều này nhưng dường như liên quan đến việc thiết lập EC2 và chạy các chức năng Lambda từ đó. Có một cơ chế để tải lên một zip khi tạo một chức năng nhưng dường như liên quan đến việc gửi lên các chức năng được phát triển cục bộ. Vì tôi đang làm việc trong trình soạn thảo dựa trên web có vẻ như là một quy trình công việc kỳ lạ.

Làm thế nào tôi có thể đơn giản triển khai một số mô-đun để sử dụng trong các chức năng Lambda của mình?


7
Tất cả được giải thích trong các tài liệu ở đây - docs.aws.amazon.com/lambda/latest/dg/ Kẻ
arcseldon

Câu trả lời:


196

Bạn không thể tải các mô-đun NPM mà không tải lên một .ziptệp, nhưng thực tế bạn có thể đưa quá trình này xuống hai dòng lệnh nhanh.

Đây là cách thực hiện:

  1. Đặt (các) tệp chức năng Lambda của bạn trong một thư mục riêng. Điều này là do bạn cài đặt npmcác gói cục bộ cho Lambda và bạn muốn có thể cô lập và kiểm tra những gì bạn sẽ tải lên Lambda.

  2. Cài đặt các gói NPM cục bộ npm install packageNametrong khi bạn đang ở trong thư mục Lambda riêng mà bạn đã tạo ở bước # 1.

  3. Đảm bảo rằng chức năng của bạn hoạt động khi chạy cục bộ: node lambdaFunc.js(bạn có thể chỉ cần nhận xét hai export.handlerdòng trong mã của mình để điều chỉnh mã của bạn để chạy với Node cục bộ).

  4. Chuyển đến thư mục của Lambda và nén nội dung , đảm bảo không bao gồm chính thư mục đó.

    zip -r lambdaFunc.zip .
    
  5. Nếu bạn đã aws-clicài đặt, mà tôi khuyên bạn nên có nếu bạn muốn làm cho cuộc sống của mình dễ dàng hơn, bây giờ bạn có thể nhập lệnh này:

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

    (không có trích dẫn xung quanh phần lambdaFunc ở trên trong trường hợp bạn tự hỏi như tôi đã làm)

  6. Bây giờ bạn có thể nhấp vào kiểm tra trong bảng điều khiển Lambda.

  7. Tôi đề nghị thêm một bí danh ngắn cho cả hai lệnh trên. Đây là những gì tôi có trong tôi cho lệnh cập nhật Lambda dài hơn nhiều:

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

10
Bạn có thể cần phải nói rõ ràng khu vực mà bạn đang nhắm mục tiêu: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
Mặc dù có vẻ như còn nhiều việc phải làm, nhưng để vượt qua điều này, đó thực sự là cách tốt hơn để xây dựng các biểu thức lambda này ... cảm ơn rất nhiều!
Mike Perrenoud

9
Tôi đã phải sử dụng --zip-file fileb://so với --zip-file file://trong khi sử dụng các bước này
McLovin

2
Đảm bảo rằng bạn chỉ nén nội dung của thư mục và bạn thực hiện điều đó từ CLI (sử dụng lệnh 'nén' từ công cụ tìm của Mac sẽ KHÔNG hoạt động ).
Yarin

2
Điều này cực kỳ hữu ích .. ít nhất hai điều còn thiếu để làm việc này cho tôi ... 1) nó --zip-file fileb:thay vì filecho tôi. 2) trên MacOS, dường như là với 3 dấu gạch chéo, ví dụ nhưfileb:///Users/wio/Documents
Tobi

29

Một .ziptệp được yêu cầu để bao gồm các mô-đun npm trong Lambda. Và bạn thực sự không nên sử dụng trình soạn thảo web Lambda cho bất kỳ điều gì - như với bất kỳ mã sản xuất nào, bạn nên phát triển cục bộ, cam kết git, v.v.

DONG CHAY CUA TOI:

1) Các hàm Lambda của tôi thường là các tiện ích trợ giúp cho một dự án lớn hơn, vì vậy tôi tạo một thư mục / aws / lambdas trong đó để chứa chúng.

2) Mỗi thư mục lambda cá nhân chứa một index.js tập tin chứa mã chức năng, một package.json tập tin xác định phụ thuộc, và / node_modules thư mục con. (Tệp pack.json không được Lambda sử dụng, nó chỉ để chúng ta có thể chạy npm installlệnh cục bộ .)

gói.json:

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

3) Tôi .gitignore tất cả các thư mục node_modules và các tệp .zip để các tệp được tạo từ cài đặt npm và nén không làm lộn xộn repo của chúng tôi.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Tôi chạy npm installtừ trong thư mục để cài đặt các mô-đun và phát triển / kiểm tra chức năng cục bộ.

5) Tôi .zip thư mục lambda và tải nó qua bàn điều khiển.

( QUAN TRỌNG: Không sử dụng tiện ích 'nén' của Mac từ Finder để nén tệp! Bạn phải chạy zip từ CLI từ bên trong thư mục gốc - xem tại đây )

zip -r ../yourfilename.zip * 

GHI CHÚ:

Bạn có thể gặp sự cố nếu bạn cài đặt các mô-đun nút cục bộ trên máy Mac của mình, vì một số mô-đun dành riêng cho nền tảng có thể không thành công khi được triển khai vào môi trường dựa trên Linux của Lambda. (Xem https://stackoverflow.com/a/29994851/165673 )

Giải pháp là biên dịch các mô-đun trên phiên bản EC2 được khởi chạy từ AMI tương ứng với thời gian chạy Lambda Node.js mà bạn đang sử dụng (Xem danh sách thời gian chạy Lambda và AMI tương ứng của chúng ).


Xem thêm Gói triển khai AWS Lambda trong Node.js - AWS Lambda



9

Hy vọng điều này sẽ giúp, với khung Serverless, bạn có thể làm một cái gì đó như thế này:

  1. Thêm những thứ này vào tệp serverless.yml của bạn:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Sau đó, tạo chức năng Lambda của bạn, triển khai nó bằng cách serverless deploy, gói có trong serverless.yml sẽ ở đó cho bạn.

Để biết thêm thông tin về serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/


trước tiên bạn cần cài đặt nóserverless plugin install --name pluginName
Liad Livnat

1

mô-đun npm phải được gói trong gói nodejs của bạn và tải lên AWS Lambda Layer dưới dạng zip, sau đó bạn sẽ cần tham khảo mô-đun / js của mình như bên dưới và sử dụng các phương thức có sẵn từ nó. const mymodule = Yêu cầu ('/ opt / nodejs / MyLogger');

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.