2016-04-08 24 views
6

Tôi đang cố gắng thực hiện một yêu cầu http từ AWS Lambda của tôi nhưng nó hết thời gian.Yêu cầu Python trong AWS Lambda định thời gian

Mã của tôi trông tương tự như thế này:

import requests 

def lambda_handler(event, context): 
    print('Im making the request') 
    request.get('http://www.google.com') 
    print('I recieved the response') 

Nhưng khi tôi kiểm tra điều này, tôi nhận được một thời gian chờ.

Đầu ra là

Im making the request 
END RequestId: id 
REPORT RequestId: id Duration: 15003.25 ms Billed Duration: 15000 ms Memory Size: 128 MB Max Memory Used: 18 MB 
2016-04-08T20:33:49.951Z id Task timed out after 15.00 seconds 

Vì vậy, tôi biết vấn đề này không phải là nó không tìm thấy các gói yêu cầu, và nó chạy mã python của tôi. Tôi chỉ tìm ra lý do tại sao nó lần ra trên yêu cầu đó.

+0

Bạn có bật truy cập VPC cho hàm Lambda của mình không? –

+0

Đúng, đã bật quyền truy cập VPC. – user2734679

Trả lời

3

Tôi gặp phải timeout problem, lý do dưới đây.

AWS document:

Khi bạn thêm cấu hình VPC để một hàm Lambda, nó chỉ có thể truy cập tài nguyên trong VPC đó. Nếu một hàm Lambda cần truy cập cả tài nguyên VPC lẫn Internet công cộng, VPC cần phải có một cá thể Phiên dịch Địa chỉ Mạng (NAT) bên trong VPC.

Có thể có một số lỗi khi bạn đặt VPC. Tôi khuyên bạn có thể theo dõi số blog này để xây dựng NAT.

4

Chức năng Lambda có quyền truy cập VPC sẽ không có quyền truy cập Internet trừ khi bạn thêm cổng NAT vào VPC của mình. Bạn nên đọc phần "Những điều cần biết" của số Lambda VPC support announcement.

Nếu bạn đã bật hỗ trợ VPC cho hàm Lambda của mình, nhưng không có cổng NAT trong VPC, thì yêu cầu của bạn là thời gian cố gắng truy cập internet.

+2

Đã thêm Cổng NAT vào VPC và tuyến đường cho 0.0.0.0 thông qua NAT đó nhưng vẫn thiếu thứ gì đó. Thời gian chờ vẫn diễn ra. – user2734679

+0

Tôi tự hỏi nếu NAT vẫn được yêu cầu nếu một Subnet công được chỉ định? –

+0

Có, nó vẫn được yêu cầu vì hàm Lambda không có địa chỉ IP công cộng. –

1

Bạn có thể tăng thời gian chờ cho các yêu cầu bằng cách làm như sau:

response = requests.get(url, timeout=60) 

Ngoài ra, bạn sẽ cần phải tăng thời gian chờ cho chức năng lambda của bạn. Để làm điều này:

  • Mở chức năng lambda của bạn trong AWS
  • Chọn 'Cấu hình', sau đó 'Advanced Settings'
  • Tăng thời gian của bạn ra khỏi thời kỳ (lên đến 5 phút)
  • Chọn 'Lưu'

Ngoài ra, tôi tin 'request.get' phải là 'requests.get'.

0

Giá trị mặc định cho thời gian chờ trong Lambda là 3 giây = 3000 micro giây. Chuyển đến Cài đặt nâng cao và thêm 5 phút. Đây có thể là vấn đề duy nhất, nếu thời gian chờ xảy ra chính xác sau 3 giây. Tất cả các lỗi khác sẽ mất nhiều hơn hoặc ít hơn thế.

+0

Chào mừng bạn đến với StackOverflow và cảm ơn sự giúp đỡ của bạn. Bạn có thể muốn làm cho câu trả lời của bạn tốt hơn bằng cách thêm một số giải thích. –

0

Theo mặc định, AWS Lambda có 3 giây hết thời gian chờ vì vậy nếu mã của bạn chạy hơn 3 giây, nó sẽ tự động hết thời gian chờ bạn lỗi này.

Bạn có thể tăng thời gian chờ cho hàm lambda lên tới 5 phút (300 giây - AWS có thể tăng giới hạn này trong tương lai) và điều đó sẽ giải quyết vấn đề.

Mã của bạn phải phản ánh yêu cầu.get thay vì request.get

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