Permintaan Python di AWS Lambda tidak dapat terhubung ke situs di belakang proksi

Saya memiliki fungsi AWS Lambda yang perlu terhubung ke situs web internal yang berada di belakang proxy. Dalam kode saya, saya melakukan hal berikut:

from botocore.vendored import requests

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

Menjalankan ini memberi saya pesan kesalahan berikut:

HTTPSConnectionPool(host='myproxyhost', port=443): Percobaan ulang maksimum terlampaui dengan url: myurl.json (Disebabkan oleh ProxyError('Tidak dapat terhubung ke proxy.', gaierror(-2, 'Nama atau layanan tidak diketahui')))

Saya telah mencoba mengganti URL proksi dengan google.com untuk mengonfirmasi bahwa saya dapat terhubung ke situs lain (tanpa proksi).

Sepertinya ruang alamat yang dijalankan Lambda diblokir oleh proksi.

Apakah ada hal lain yang perlu saya atur dengan permintaan dan lambda agar ini berfungsi?


person William Ross    schedule 14.11.2017    source sumber
comment
Anda dapat menambahkan https_proxy sebagai variabel lingkungan ke fungsi lambda Anda. itu seharusnya berhasil untuk Anda.   -  person Usman Azhar    schedule 15.11.2017
comment
apakah situs web internal Anda berjalan dalam VPC. Jika demikian, Anda dapat mengonfigurasi lambda agar berjalan dalam VPC yang sama, dan menyelesaikan nama internal..   -  person toske    schedule 15.11.2017
comment
Situs web proksi yang saya coba sambungkan bukan bagian dari VPC   -  person William Ross    schedule 16.11.2017


Jawaban (3)


EDIT: Setelah membaca pertanyaan lagi saya menyadari bahwa kesalahan ini disebabkan oleh resolusi nama (-2, 'Name or service not known'). Jika Anda menggunakan Route53 internal untuk VPC Anda, solusi di bawah ini akan tetap berfungsi karena fungsi lambda akan menggunakan server DNS VPC.

Tampaknya fungsi lambda tidak berjalan di subnet yang sama dengan instans proksi Anda atau grup keamanan memblokir koneksi. Untuk memperbaikinya:

  • Buat grup keamanan untuk mengizinkan fungsi lambda terhubung ke port 443 pada host proksi Anda
  • Perbarui fungsi lambda Anda untuk menggunakan grup keamanan AND untuk dieksekusi di dalam subnet Anda:

Skrip ini harus melakukannya:

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

Kemudian tetapkan grup keamanan yang dibuat ke instans Anda.

Semoga ini bisa membantu

person Filipe    schedule 25.11.2017
comment
Terima kasih atas informasinya... sedang bereksperimen dengannya sekarang. - person William Ross; 27.11.2017
comment
Memberi Anda penghargaan atas jawabannya karena ini mengarahkan saya ke arah yang benar. Dapat memperoleh koneksi ke URL yang diproksi dari VPC yang berbeda, sehingga membuat saya yakin bahwa VPC yang saya gunakan memiliki kesalahan konfigurasi grup keamanan. - person William Ross; 28.11.2017

Kita dapat menggunakan variabel lingkungan lambda dan menambahkan https_proxy sebagai variabel lingkungan ke fungsi lambda. Dimana fungsi lambda Anda dapat mengakses situs web melalui proxy.

person Usman Azhar    schedule 15.11.2017
comment
Bukankah ini hanya menetapkan pasangan nilai kunci yang dapat dikenali dalam kode? Apakah ada manfaat lain? - person William Ross; 21.11.2017
comment
Ini setara dengan menjalankan ekspor http_proxy ‹value› , dan dapat digunakan dengan atau tanpa kode. Anda tidak perlu membaca dan mengaturnya lagi secara eksplisit dalam kode Anda. - person Usman Azhar; 21.11.2017

Ada dua anak di antaranya security groups, dan subnets. Anda perlu mengizinkan lambda Anda untuk mengakses subnet proxy dengan menyediakan grup keamanan. Berikut adalah tutorial langkah demi langkah...

person Michał Zaborowski    schedule 21.11.2017
comment
Sepertinya tutorial itu ditujukan ketika fungsi Lambda perlu terhubung ke sesuatu di VPC, namun situs yang perlu saya sambungkan tidak ada di VPC, tetapi memerlukan proxy. Ketika saya memiliki EC2 dengan peran yang sama dengan Lambda, EC2 dapat menjangkau Lambda dengan menggunakan perintah curl dan tautan ke situs yang ingin saya sambungkan. - person William Ross; 22.11.2017
comment
maaf karena melewatkan intinya - aws lambda outbound connection. Misalnya tutorial ini medium.com/@ philippholly/ - person Michał Zaborowski; 22.11.2017