คำขอ Python ใน AWS Lambda ไม่สามารถเชื่อมต่อกับไซต์ที่อยู่ด้านหลังพรอกซีได้

ฉันมีฟังก์ชัน AWS Lambda ที่ต้องเชื่อมต่อกับเว็บไซต์ภายในซึ่งอยู่หลังพรอกซี ในรหัสของฉันฉันกำลังทำสิ่งต่อไปนี้:

from botocore.vendored import requests

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

การรันสิ่งนี้ทำให้ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

HTTPSConnectionPool (โฮสต์ = 'myproxyhost', พอร์ต = 443): เกินลองใหม่สูงสุดด้วย url: myurl.json (เกิดจาก ProxyError ('ไม่สามารถเชื่อมต่อกับพร็อกซีได้', gaierror (-2, 'ไม่ทราบชื่อหรือบริการ')))

ฉันได้ลองแทนที่ URL พรอกซีด้วย google.com เพื่อยืนยันว่าฉันสามารถเชื่อมต่อกับไซต์อื่นได้ (โดยไม่ต้องใช้พรอกซี)

ดูเหมือนว่าพื้นที่ที่อยู่ที่ Lambda เรียกใช้จะถูกบล็อกโดยพร็อกซี

ฉันต้องตั้งค่าอย่างอื่นด้วยคำขอและแลมบ์ดาเพื่อให้สิ่งนี้ใช้งานได้หรือไม่


person William Ross    schedule 14.11.2017    source แหล่งที่มา
comment
คุณสามารถเพิ่ม https_proxy เป็นตัวแปรสภาพแวดล้อมให้กับฟังก์ชัน lambda ของคุณได้ มันควรจะได้ผลสำหรับคุณ   -  person Usman Azhar    schedule 15.11.2017
comment
เป็นเว็บไซต์ภายในของคุณที่ทำงานภายใน VPC หากเป็นเช่นนั้น คุณสามารถกำหนดค่า lambda ให้ทำงานภายใน VPC เดียวกัน และแก้ไขชื่อภายในได้   -  person toske    schedule 15.11.2017
comment
เว็บไซต์พร็อกซีที่ฉันพยายามเชื่อมต่อไม่ได้เป็นส่วนหนึ่งของ VPC   -  person William Ross    schedule 16.11.2017


คำตอบ (3)


แก้ไข: หลังจากอ่านคำถามอีกครั้ง ฉันพบว่าข้อผิดพลาดเกิดจากการแก้ไขชื่อ (-2, 'Name or service not known') หากคุณใช้ Route53 ภายในสำหรับ VPC ของคุณ วิธีแก้ไขปัญหาด้านล่างควรยังคงใช้งานได้ เนื่องจากฟังก์ชัน lambda จะใช้เซิร์ฟเวอร์ DNS ของ VPC

ดูเหมือนว่าฟังก์ชันแลมบ์ดาไม่ได้ทำงานบนซับเน็ตเดียวกันกับอินสแตนซ์พร็อกซีของคุณ หรือกลุ่มความปลอดภัยกำลังบล็อกการเชื่อมต่อ วิธีแก้ไข:

  • สร้างกลุ่มความปลอดภัยเพื่ออนุญาตให้ฟังก์ชัน lambda เชื่อมต่อกับพอร์ต 443 บนพร็อกซีโฮสต์ของคุณ
  • อัปเดตฟังก์ชันแลมบ์ดาของคุณเพื่อใช้กลุ่มความปลอดภัยนั้น AND เพื่อดำเนินการภายในเครือข่ายย่อยของคุณ:

สคริปต์นี้ควรทำ:

#!/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

จากนั้นกำหนดกลุ่มความปลอดภัยที่สร้างขึ้นให้กับอินสแตนซ์ของคุณ

หวังว่ามันจะช่วยได้

person Filipe    schedule 25.11.2017
comment
ขอบคุณสำหรับข้อมูลครับ...กำลังทดลองอยู่ครับ - person William Ross; 27.11.2017
comment
ให้เครดิตคุณสำหรับคำตอบเนื่องจากสิ่งนี้ชี้ให้ฉันไปในทิศทางที่ถูกต้อง สามารถเชื่อมต่อกับ URL พร็อกซีจาก VPC อื่นได้ ทำให้ฉันเชื่อว่า VPC ที่ฉันกำลังจะหมดมีการกำหนดค่ากลุ่มความปลอดภัยไม่ถูกต้อง - person William Ross; 28.11.2017

เราสามารถใช้ตัวแปรสภาพแวดล้อมแลมบ์ดาและสามารถเพิ่ม https_proxy เป็นตัวแปรสภาพแวดล้อมให้กับฟังก์ชันแลมบ์ดาได้ โดยที่ฟังก์ชันแลมบ์ดาของคุณสามารถเข้าถึงเว็บไซต์ผ่านทางพร็อกซี

person Usman Azhar    schedule 15.11.2017
comment
นี่ไม่ใช่แค่การตั้งค่าคู่คีย์-ค่าที่สามารถรับรู้ได้ในโค้ดใช่ไหม มันมีประโยชน์อย่างอื่นอีกไหม? - person William Ross; 21.11.2017
comment
ซึ่งเทียบเท่ากับการรันคำสั่งส่งออก http_proxy ‹value› และสามารถใช้ได้โดยมีหรือไม่มีโค้ดก็ได้ คุณไม่จำเป็นต้องอ่านและตั้งค่าอีกครั้งอย่างชัดเจนในโค้ดของคุณ - person Usman Azhar; 21.11.2017

มีเด็กสองคน security groups และ subnets คุณต้องอนุญาตให้แลมบ์ดาเข้าถึงซับเน็ตของพร็อกซีโดยระบุกลุ่มความปลอดภัย ที่นี่คือบทช่วยสอนทีละขั้นตอน...

person Michał Zaborowski    schedule 21.11.2017
comment
ดูเหมือนว่าบทช่วยสอนนั้นมีไว้สำหรับเมื่อฟังก์ชัน Lambda จำเป็นต้องเชื่อมต่อกับบางสิ่งใน VPC อย่างไรก็ตาม ไซต์ที่ฉันต้องเชื่อมต่อนั้นไม่ได้อยู่ใน VPC แต่ต้องใช้พรอกซี เมื่อฉันมี EC2 ที่มีบทบาทเดียวกันกับ Lambda อยู่ EC2 จะสามารถเข้าถึง Lambda ได้โดยใช้คำสั่ง curl และลิงก์ไปยังไซต์ที่ฉันต้องการเชื่อมต่อ - person William Ross; 22.11.2017
comment
ขออภัยที่พลาดประเด็น - aws lambda outbound connection ตัวอย่างเช่นบทช่วยสอนนี้ medium.com/@ ฟิลิปโปลลี/ - person Michał Zaborowski; 22.11.2017