SQS Timeout dari Lambda dalam VPC
Saya memiliki Lambda yang perlu menggunakan VPC untuk berbicara dengan sumber daya yang dilindungi seperti RDS dan AWSDocumentDB. Ia juga harus dapat melihat dunia luar untuk beberapa panggilan ke API pihak ketiga. Untuk melakukan ini, saya menggunakan wizard VPC untuk membuat VPC yang memiliki subnet publik dan pribadi. Wizard juga membuat dan memasang Gateway Internet.
Setelah ini saya melampirkan Lambda, instance RDS dan cluster DocumentDb saya ke VPC. Sejak itu, bagaimanapun, saya tidak dapat berbicara dengan antrian SQS saya dari dalam lambda saya menggunakan NodeJS aws-sdk.
Saya ingin menambahkan bahwa saya telah membaca dan menerapkan beberapa poin dari: AWS Lambda: Tidak dapat mengakses Antrean SQS dari fungsi Lambda dengan akses VPC namun saya masih tidak dapat terhubung.
Inilah yang saya miliki:
VPC:
- VPC memiliki subnet publik dan pribadi, dan IG Gateway. Saya menggunakan wizard untuk membuatnya. Saya tidak memahami banyak hal mendasar di sini.
- VPC Config (maaf ini adalah tautan, saya belum bisa menyematkannya.)
- CIDR's - wizard membuat semua kecuali blok terakhir. Saya tidak yakin apakah saya melakukan ini dengan benar atau apakah itu penting karena wizard membuat saya membuat setidaknya satu dan saya melakukannya untuk menghindari tumpang tindih IP.
- Karena ini adalah proyek dev / prototipe, grup keamanan yang terpasang ke VPC 'terbuka lebar'. Semua masuk dan keluar diperbolehkan.
- Beri tahu saya konfigurasi VPC lain yang akan ditampilkan karena saya tidak yakin apa yang berguna
Titik Akhir Layanan:
- Saya mencoba membuat titik akhir layanan untuk SQS sesuai artikel yang ditautkan di atas, inilah yang saya miliki: konfigurasi titik akhir
- Saya akan berbicara lebih banyak tentang bagaimana saya mengkonsumsinya di bagian Lambda.
- Endpoint dilampirkan ke VPC
Lambda:
- Saya memiliki Lambda yang terpasang ke VPC seperti yang ditunjukkan di sini .
- Ini memungkinkan saya untuk berbicara dengan api pihak ke-3 publik dan sumber daya saya yang dilindungi. Itu adalah harapan saya bahwa memiliki SG terbuka lebar masih memungkinkan lambda saya untuk berbicara dengan SQS tetapi itu membuat waktu tetap habis.
- Saya tidak yakin url mana yang akan digunakan di Lambda untuk titik akhir saya. Contohnya disini:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html sepertinya masih menggunakan titik akhir regional.
Kode
Berikut adalah tampilan pemanggilan SQS dari dalam kode saya:
-
const {SQS} = require('aws-sdk'); // Constructor Init const sqs = new SQS({ apiVersion: '2012-11-05', endpoint: 'https://sqs.us-west-2.amazonaws.com', // not sure if this is 'invoking' the vpc endpoint or not region: 'us-west-2' }); // Send message await sqs.sendMessage({ MessageBody: 'Test body', QueueUrl: 'https://sqs.us-west-2.amazonaws.com/<rest of URI>', MessageAttributes: {...someAttrs} }).promise();
-
Menghargai bantuan apa pun, beri tahu saya informasi lain apa yang dapat saya berikan.
Terima kasih!
** Edit **
Saya juga harus menyebutkan bahwa untuk menghindari seluruh masalah ini saya mulai menggunakan SQS sebagai Lambda Destination. Meskipun ini menyuntikkan pesan ke dalam antrean target, kemungkinan besar tidak akan diskalakan dengan kasus penggunaan saya. Saya dapat menguraikannya lebih lanjut jika diperlukan karena ini tidak sepenuhnya berkaitan dengan pertanyaan yang sebenarnya.
** EDIT 31/8/20 **
Terima kasih atas semua tanggapannya, itu sangat membantu dan membuat saya mencapai resolusi. Saya akan mengatakan bahwa siapa pun yang menemukan posting ini harus menonton pertama:
https://www.youtube.com/watch?v=JcRKdEP94jM
Ini adalah sesuatu yang saya harap saya temukan sebelum saya memulai semua ini karena, meskipun secara khusus menargetkan untuk memberikan akses internet lambdas, ini melalui proses pemetaan IG dan Nats ke subnet yang benar-benar di mana saya salah mengonfigurasi vpc saya. Dengan video ini saya pergi dan membuat ulang seluruh VPC saya dan itu jauh lebih bersih dan lebih mudah untuk menghubungkan titik-titik. 10/10 merekomendasikan.
Terima kasih lagi!
Jawaban
Firasat saya yang satu ini adalah bahwa ada aturan yang hilang di suatu tempat dalam konfigurasi jaringan Anda - Paket dijatuhkan baik ke SQS Anda, atau dalam perjalanan kembali (keduanya perlu dipikirkan secara bertahap).
Tiga hal yang terlintas dalam pikiran:
- Perutean: Pastikan subnet dan tabel perutean memiliki rute yang sesuai untuk mendapatkan paket kembali ke subnet pribadi Anda dari titik akhir SQS.
- Grup Keamanan - Perhatikan baik-baik setiap SG yang terlibat. SQS mungkin dalam SG yang membatasi akses ke sana, misalnya.
- ACL jaringan - ini tanpa kewarganegaraan, jadi Anda harus memastikan kedua sisi terbuka, dan ingat bahwa sebagian besar waktu, akan ada nomor port acak yang terlibat kembali ke pemohon.
Semoga berhasil!
Fungsi AWS Lambda harus dipasang ke subnet pribadi di VPC.
Amazon SQS tersedia di Internet, sehingga fungsi Lambda memerlukan cara untuk mengakses titik akhir SQS.
Opsi 1: Titik Akhir VPC
Titik Akhir VPC untuk Amazon SQS dapat menyediakan tautan langsung antara VPC dan titik akhir SQS, tanpa memerlukan akses Internet. Setelah dibuat, VPC akan secara otomatis mengirim permintaan SQS ke seluruh Titik Akhir VPC. Ini adalah opsi yang bagus dan sederhana.
Opsi 2: Gateway NAT
Jika Anda memiliki sumber daya tambahan di subnet pribadi yang memerlukan akses Internet, Anda dapat mempertimbangkan untuk menempatkan Gateway NAT di subnet publik . Subnet privat memerlukan entri Tabel Rute yang mengarahkan lalu lintas terikat Internet ( 0.0.0.0/0) ke Gateway NAT.
Dikenakan biaya tambahan.
Opsi 3: Destinasi Lambda
Jika Anda memiliki fungsi Lambda yang berhasil mengkomunikasikan SQS melalui Destinasi Lambda, maka ini terdengar seperti opsi yang sangat baik ! Saya belum mencobanya, tetapi sepertinya layanan Lambda bertanggung jawab untuk mengirimkan output langsung ke SQS, tanpa harus melintasi VPC atau Internet. Jika ini berhasil, maka saya sangat menyarankan untuk tetap menggunakannya. Saya tidak melihat adanya masalah penskalaan menggunakan metode ini. Namun, harap diperhatikan bahwa ini hanya berfungsi untuk panggilan asinkron ke Lambda dan tidak akan berfungsi, misalnya, saat menjalankan fungsi secara sinkron atau dengan menekan tombol Uji .