2017-11-14 34 views
6

Tôi có chức năng AWS Lambda cần kết nối với trang web nội bộ nằm sau proxy. Trong mã của tôi, tôi đang làm như sau:Yêu cầu Python trong AWS Lambda không thể kết nối với trang web phía sau proxy

from botocore.vendored import requests 

https_proxy = "https://myproxy:myport" 
proxyDict = { 
      "https" : https_proxy 
    } 
request.get("https://myurl.json", proxies=proxyDict) 

Chạy này mang lại cho tôi thông báo lỗi sau:

HTTPSConnectionPool (host = 'myproxyhost', port = 443): Max lần thử lại vượt quá với url: myurl. json (Do ProxyError gây ra ('Không thể kết nối với proxy.', gaierror (-2, 'Tên hoặc dịch vụ không biết')))

Tôi đã thử thay thế URL proxy bằng google.com để xác nhận tôi có thể kết nối các trang web khác (không có proxy).

Dường như không gian địa chỉ mà Lambda chạy nó bị chặn bởi proxy.

Có điều gì khác mà tôi cần phải đặt với yêu cầu và lambda để làm việc này không?

+2

Bạn có thể thêm https_proxy làm biến môi trường cho hàm lambda của mình. nó sẽ làm việc cho bạn. –

+0

là trang web nội bộ của bạn đang chạy trong VPC. Nếu vậy, bạn có thể cấu hình lambda để chạy trong cùng một VPC, và giải quyết tên nội bộ .. – toske

+0

Trang web được ủy quyền mà tôi đang cố gắng kết nối không phải là một phần của VPC –

Trả lời

1

Chúng tôi có thể sử dụng biến môi trường lambda và có thể thêm https_proxy dưới dạng biến môi trường vào hàm lambda. Chức năng lambda của bạn có thể truy cập trang web qua proxy.

+0

Điều này không chỉ thiết lập một cặp khóa-giá trị có thể được công nhận trong mã? Liệu nó có một số lợi ích khác? –

+0

Nó tương đương với việc chạy xuất khẩu http_proxy và có thể được sử dụng có hoặc không có mã. Bạn không cần phải đọc và đặt lại nó một cách rõ ràng trong mã của bạn. –

1

Có hai người con trong số họ security groupssubnets. Bạn cần cho phép lambda của bạn truy cập mạng con của proxy bằng cách cung cấp nhóm bảo mật. Here là hướng dẫn từng bước ...

+0

Có vẻ như hướng dẫn đó là khi hàm Lambda cần kết nối với một thứ gì đó trong VPC, tuy nhiên trang web tôi cần kết nối không có trong VPC, nhưng là yêu cầu một proxy. Khi tôi có EC2 có cùng vai trò được gắn với Lambda, EC2 có thể truy cập Lambda bằng cách sử dụng lệnh curl và liên kết tới trang web mà tôi muốn kết nối. –

+0

xin lỗi vì đã bỏ lỡ điểm - 'kết nối outbound lambda '. Ví dụ: hướng dẫn này https://medium.com/@philippholly/aws-lambda-enable-outgoing-internet-access-within-vpc-8dd250e11e12 –

1

EDIT: Sau khi đọc lại câu hỏi, tôi nhận thấy lỗi là do độ phân giải tên (-2, 'Name or service not known'). Nếu bạn đang sử dụng Route53 bên trong cho VPC của bạn, giải pháp dưới đây vẫn hoạt động như hàm lambda sẽ sử dụng các máy chủ DNS của VPC.

Có vẻ như hàm lambda không chạy trên cùng một mạng con của cá thể proxy của bạn hoặc nhóm bảo mật đang chặn kết nối. Để khắc phục điều đó:

  • Tạo một nhóm an ninh để cho phép các chức năng lambda để kết nối với cổng 443 trên máy chủ proxy của bạn
  • Cập nhật chức năng lambda của bạn để sử dụng mà nhóm an ninh được thực hiện bên trong subnet của bạn:

kịch bản này nên làm điều đó:

#!/bin/bash 
# Fill the variables bellow with your vpc and subnet id 
VPC_ID="" 
SUBNET_IDS="" 
FUNCTION_NAME="" 

SEC_GROUP=$(aws ec2 create-security-group --group-name 'lambda-proxy' --vpc-id $VPC_ID --description 'Lambda/proxy communication' --output text) 
aws ec2 authorize-security-group-ingress --group-id ${SEC_GROUP} --protocol tcp --port 443 
aws lambda update-function-configuration --function-name $FUNCTION_NAME --vpc-config SubnetIds=$SUBNET_IDS,SecurityGroupIds=$SEC_GROUP 

Sau đó gán vào nhóm bảo mật tạo ra để in của bạn tance.

Hy vọng điều này sẽ giúp

+0

Cảm ơn thông tin ... đang thử nghiệm ngay bây giờ. –

+1

Cung cấp cho bạn tín dụng cho câu trả lời vì điều này đang hướng tôi đi đúng hướng. Đã có thể nhận được kết nối tới URL proxy từ một VPC khác, khiến tôi tin rằng VPC tôi đang chạy hết có một cấu hình sai nhóm bảo mật. –

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