2017-08-27 15 views
12

Tôi muốn theo these tipstôi không thể chỉ triển khai một hàm với serverless-framework 1.20.2

và chỉ triển khai lại chức năng của tôi, như các serverless.yml đã không được thay đổi.

Tuy nhiên, nó chỉ bị treo ở giai đoạn Serverless: Uploading function. Mãi mãi, rõ ràng.

Toàn bộ triển khai (với sls deploy) hoạt động, dù chậm.

Làm cách nào để gỡ lỗi điều này, vì dường như không có thông báo lỗi?

EDIT

Khi tôi sử dụng sls deploy dự án của tôi mất khoảng 4 phút và 15 giây để triển khai.

Nó có vẻ khá dài đối với tôi, vì vậy tôi nghĩ tôi sẽ sử dụng sls deploy function -f myFunction thay vào đó, được cho là nhanh hơn nhiều.

Tuy nhiên, khi tôi thử sls deploy function -f myFunction, dường như chỉ treo mãi mãi trên Serverless: Uploading function: myFunction.

Tôi không biết cách gỡ lỗi đó.

Có vẻ như sử dụng 'tiết', với Serverless: Uploading function: myFunction --verbose không tạo sự khác biệt, các thư được trả lại giống nhau.

tôi sẽ cố gắng chờ đợi và xem liệu, cuối cùng, các triển khai chức năng hoàn ...

Vâng, tôi chờ đợi, và nó không: sau khoảng 8 30 phút tôi nhận được thông báo lỗi sau:

Serverless Error --------------------------------------- Connection timed out after 120000ms Get Support -------------------------------------------- Docs: docs.serverless.com Bugs: github.com/serverless/serverless/issues Forums: forum.serverless.com Chat: gitter.im/serverless/serverless Your Environment Information ----------------------------- OS: linux Node Version: 7.10.0 Serverless Version: 1.20.2

kỳ quặc khác: khi treo, nó đọc:

Serverless: Uploading function: myFunction (12.05 MB)...

Nhưng chức năng riêng của mình chỉ là 3.2 kB, và không bao gồm bất kỳ gói.

Khi tôi sử dụng sls deploy, kích thước hiển thị là như nhau:

Serverless: Uploading service .zip file to S3 (12.05 MB)...

Điều gì có thể xảy ra với chức năng của mình triển khai?

EDIT 2

Như @dashmug gợi ý, có một vấn đề config trong serverless.yml.

Trong thư mục functions của dự án không có máy chủ của tôi, tôi muốn có một số phổ biến là package.jsonnode_modules. Sau đó, mỗi chức năng có thể nhập các mô-đun khi cần thiết.

Tôi đã cố gắng theo dõi the official guide.

serverless.yml của tôi là như vậy:

functions: 
    myFunction: 
    package: 
     exclude: 
     - 'functions/node_modules/**' 
     - '!functions/node_modules/module1_I_want_to_include/**' 
     - '!functions/node_modules/module2_I_want_to_include/**' 

Bây giờ tôi nhận được, với sls deploy:

Serverless: Uploading service .zip file to S3 (31.02 MB)...

và chức năng hoạt động :)

Tuy nhiên, với sls deploy function -f myFunction, tôi nhận được:

Serverless: Uploading function: dispatch (1.65 MB)...

.210

Nó tải lên trong một thời gian hợp lý, nhưng các chức năng hiện nay cung cấp cho các lỗi sau:

Unable to import module 'functions/myFunction': Error

+0

Không đủ đáp ứng để trả lời câu trả lời, nhưng tôi khuyên bạn nên chuyển sang [Apex] (http://apex.run)? Tôi đã sử dụng nó gần một năm và có rất ít vấn đề và những vấn đề đó hoàn toàn do tôi hack vào một tính năng mà tôi muốn. :) –

+0

Ok, cảm ơn, tôi sẽ cho nó một shot – Manube

Trả lời

2

Bạn có thể làm cho quá trình triển khai tiết hơn bằng cách đi qua các lập luận --verbose đến chức năng triển khai.

Hoặc là sls deploy --verbose hoặc sls deploy -v sẽ thực hiện thủ thuật.

+0

cảm ơn @JustDanyul. Ý tôi là: triển khai toàn bộ dự án mất một lúc, vì vậy tôi nghĩ tôi sẽ tải lên chức năng mà tôi đã cập nhật. Tôi sẽ chỉnh sửa câu hỏi để làm cho nó rõ ràng hơn ... – Manube

4

Những điều tôi sẽ xem xét:

  1. Thử so sánh những gì xảy ra giữa hai:

    $ SLS_DEBUG=true sls deploy --verbose

    $ SLS_DEBUG=true sls deploy function -f myFunction --verbose

  2. Kiểm tra cấu hình serverless của bạn (đóng gói lão hóa, vv) đối với cấu trúc dự án của bạn. Một cờ đỏ là chức năng triển khai lớn như dịch vụ triển khai. Đây có thể là sự cố về cấu hình sai.

  3. Sử dụng serverless package để xem cách gói được nén. Nó có thể cung cấp một số manh mối.

  4. Bạn có đang sử dụng bất kỳ plugin nào có thể đã thay đổi cách tạo gói của bạn không?

  5. Bạn có bao nhiêu thư mục node_modules? Bạn có chỉ có một cho toàn bộ dịch vụ hoặc một cho mỗi chức năng?

+0

1. điều đó không giúp ích gì, vì chức năng 'chỉ triển khai' chỉ bị treo – Manube

+0

2. bạn chắc chắn đang làm điều gì đó: nó có lẽ là vấn đề cấu hình gói trong yaml – Manube

+0

3. có, tôi có thể thấy hai gói lớn: một gọi là 'serverless.zip', còn lại là 'myFunction.zip' – Manube

2

Tôi không thể tìm ra lý do triển khai chức năng (trái ngược với triển khai dịch vụ) sẽ bị treo. Tôi có thể đã định cấu hình sai tệp serverless.yml của mình.

Nhưng không có vấn đề lớn: Tôi có thể làm mà không cần sls deploy function -myFunction.

Vì kỳ vọng của tôi sai. Tôi nghĩ việc triển khai một hàm sẽ nhanh hơn việc triển khai một dịch vụ, bằng cách nào đó không triển khai lại thư mục node_modules.

Nhưng không có triển khai chức năng từng phần trong AWS: khi một hàm được triển khai, tất cả các mô-đun nút cần thiết cũng phải được triển khai để chức năng hoạt động.

Như đã giải thích trong serverless doc:

The Framework packages up the targeted AWS Lambda Function into a zip file.

The Framework fetches the hash of the already uploaded function .zip file and compares it to the local .zip file hash.

The Framework terminates if both hashes are the same.

That zip file is uploaded to your S3 bucket using the same name as the previous function, which the CloudFormation stack is pointing to.

tôi đã có (ngây thơ) hy vọng rằng chỉ xử lý được cập nhật sẽ được tải lên S3. Nhưng khi chức năng được đóng gói trước khi triển khai, nó cần tất cả các mô-đun và phụ thuộc của nó.

Vì vậy, theo cách tôi thấy, triển khai chức năng sẽ tiết kiệm thời gian (trái ngược với triển khai dịch vụ) chỉ khi dịch vụ có nhiều chức năng và các chức năng dịch vụ không sử dụng nhiều mô đun nodej phổ biến. Và nếu sls deploy function -f myFunction không treo, đó là :)


Vì vậy, để tăng tốc độ phát triển, các trick là sử dụng mô phỏng ẩn với một công cụ như serverless offline

serverless offline cung cấp một máy chủ địa phương, và chức năng lambda myFunction có thể truy cập được tại địa phương, bằng cách gọi http://localhost:3000/myFunction trong Postman hoặc trình duyệt

Trong hầu hết các trường hợp, sls deploy chỉ có thể được gọi một lần, sau khi xử lý được kiểm tra kỹ lưỡng ngoại tuyến.

Các vấn đề liên quan