Timeout SQS da Lambda all'interno di VPC
Ho un Lambda che deve essere su un VPC per parlare con risorse protette come RDS e AWSDocumentDB. Deve anche essere in grado di vedere il mondo esterno per alcune chiamate ad API di terze parti. Per fare ciò, ho utilizzato la procedura guidata VPC per creare un VPC con sottoreti sia pubbliche che private. La procedura guidata ha anche creato e collegato un gateway Internet.
Successivamente ho collegato la mia istanza Lambda, RDS e il cluster DocumentDb al VPC. Da allora, tuttavia, non sono stato in grado di parlare con le mie code SQS dall'interno del mio lambda utilizzando NodeJS aws-sdk.
Voglio aggiungere che ho letto e implementato alcuni punti da: AWS Lambda: Impossibile accedere a SQS Queue da una funzione Lambda con accesso VPC, tuttavia non riesco ancora a connettermi.
Ecco cosa ho:
VPC:
- VPC ha sottoreti pubbliche e private e un gateway IG. Ho usato la procedura guidata per crearlo. Non capisco molto delle basi qui.
- Configurazione VPC (mi dispiace è un collegamento, non mi consente ancora di incorporarlo).
- CIDR : la procedura guidata ha creato tutto tranne l'ultimo blocco. Non sono sicuro di averlo fatto bene o se è importante perché la procedura guidata mi ha fatto creare almeno uno e l'ho fatto per evitare la sovrapposizione dell'IP.
- Poiché si tratta di un progetto di sviluppo / prototipo, il gruppo di sicurezza collegato al VPC è "completamente aperto". Sono consentite tutte le operazioni in entrata e in uscita.
- Fammi sapere quale altra configurazione VPC mostrare perché non sono sicuro di cosa sia utile
Endpoint del servizio:
- Ho provato a creare un endpoint del servizio per SQS secondo l'articolo collegato sopra, ecco cosa ho: configurazione dell'endpoint
- Parlerò di più su come lo sto consumando nella sezione Lambda.
- L'endpoint è collegato al VPC
Lambda:
- Ho il Lambda collegato al VPC come mostrato qui .
- Questo mi permette di parlare con API di terze parti pubbliche e le mie risorse protette. Speravo che avere un SG spalancato avrebbe comunque permesso al mio lambda di parlare con SQS, ma continua a scadere.
- Non sono sicuro di quale URL utilizzare nel mio Lambda per il mio endpoint. L'esempio qui:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html sembra che utilizzi ancora l'endpoint regionale.
Codice
Ecco come appare l'invocazione SQS dal mio codice:
-
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();
-
Apprezzo qualsiasi aiuto, per favore fatemi sapere quali altre informazioni posso fornire.
Grazie!
** Modificare **
Devo anche menzionare che per aggirare l'intero problema ho iniziato a seguire la strada dell'utilizzo di SQS come destinazione Lambda. Sebbene questo inietti messaggi nella coda di destinazione, probabilmente non si ridimensionerà con il mio caso d'uso. Posso approfondire ulteriormente se necessario in quanto non è del tutto pertinente alla domanda reale.
** EDIT 8/31/20 **
Grazie per tutte le risposte, è stato di grande aiuto e mi ha portato a una risoluzione. Dirò che a chiunque altro trovi questo post deve prima guardare:
https://www.youtube.com/watch?v=JcRKdEP94jM
Questo è qualcosa che vorrei aver trovato prima di iniziare tutto questo perché, sebbene sia specificamente mirato a fornire l'accesso a Internet a lambda, passa attraverso il processo di mappatura di IG e Nat alle sottoreti che è davvero dove stavo configurando male il mio vpc. Con questo video sono andato e ho ricreato il mio intero VPC ed è molto più semplice e pulito collegare i punti. 10/10 consigliato.
Grazie ancora!
Risposte
La mia impressione su questo è che ci sia una regola mancante da qualche parte nella configurazione di rete: i pacchetti vengono rilasciati verso il tuo SQS o sulla via del ritorno (entrambi devono essere pensati hop by hop).
Le tre cose che mi vengono in mente:
- Routing: assicurati che le sottoreti e le tabelle di routing abbiano percorsi appropriati per riportare i pacchetti alla tua sottorete privata da quella in cui si trova l'endpoint SQS.
- Gruppi di sicurezza - Guarda attentamente ogni SG coinvolto. Ad esempio, l'SQS potrebbe trovarsi in una SG che ne limita l'accesso.
- ACL di rete: sono senza stato, quindi è necessario assicurarsi che entrambi i lati siano aperti e ricordare che la maggior parte delle volte saranno coinvolti numeri di porta casuali che tornano al richiedente.
In bocca al lupo!
La funzione AWS Lambda deve essere collegata a una sottorete privata nel VPC.
Amazon SQS risiede su Internet, quindi la funzione Lambda ha bisogno di un modo per accedere all'endpoint SQS.
Opzione 1: endpoint VPC
Un endpoint VPC per Amazon SQS può fornire un collegamento diretto tra un VPC e l'endpoint SQS, senza richiedere l'accesso a Internet. Una volta creato, il VPC invierà automaticamente le richieste SQS attraverso l'endpoint VPC. Questa è un'opzione carina e semplice.
Opzione 2: gateway NAT
Se disponi di risorse aggiuntive nelle sottoreti private che richiedono l'accesso a Internet, potresti considerare di collocare un gateway NAT in una sottorete pubblica . Le sottoreti private necessitano di una voce della tabella di instradamento che indirizza il traffico associato a Internet ( 0.0.0.0/0) al gateway NAT.
Si applicano costi aggiuntivi.
Opzione 3: destinazione Lambda
Se hai la funzione Lambda che comunica con successo l'SQS tramite una destinazione Lambda, questa sembra un'opzione eccellente ! Non l'ho provato, ma sembra che il servizio Lambda sia responsabile dell'invio dell'output direttamente a SQS, senza dover attraversare il VPC o Internet. Se funziona, consiglio vivamente di continuare a usarlo. Non percepisco alcun problema di ridimensionamento utilizzando questo metodo. Tuttavia, tieni presente che funziona solo per chiamate asincrone a Lambda e non funzionerà, ad esempio, quando si richiama la funzione in modo sincrono o premendo il pulsante Test .