Consentire alle funzioni Lambda l'accesso alle risorse in un Amazon VPC
Con Amazon Virtual Private Cloud (Amazon VPC), puoi creare reti private nel tuo Account AWS per ospitare risorse come istanze Amazon Elastic Compute Cloud (Amazon EC2), istanze Amazon Relational Database Service (Amazon RDS) e istanze Amazon ElastiCache. Puoi consentire alla tua funzione Lambda di accedere alle risorse ospitate in un Amazon VPC collegando la funzione al VPC tramite le sottoreti private che contengono le risorse. Segui le istruzioni riportate nelle sezioni seguenti per collegare una funzione Lambda a un Amazon VPC utilizzando la console Lambda, la AWS Command Line Interface (AWS CLI) o AWS SAM.
Nota
Ogni funzione Lambda viene eseguita all'interno di un VPC di proprietà e gestito dal servizio Lambda. Questi VPC vengono gestiti automaticamente da Lambda e non sono visibili ai clienti. La configurazione della funzione per accedere ad altre risorse AWS in un Amazon VPC non ha alcun effetto sul VPC gestito da Lambda all'interno del quale viene eseguita la funzione.
Sezioni
Autorizzazioni IAM richieste
Per collegare una funzione Lambda a un Amazon VPC nel tuo Account AWS, Lambda necessita delle autorizzazioni per creare e gestire le interfacce di rete che utilizza per consentire alla funzione di accedere alle risorse del VPC.
Le interfacce di rete create da Lambda sono note come Hyperplane Elastic Network Interfaces o Hyperplane ENI. Per ulteriori informazioni su queste interfacce di rete, consulta Informazioni sulle Hyperplane Elastic Network Interface (ENI).
Puoi assegnare alla tua funzione le autorizzazioni di cui ha bisogno collegando la policy gestita da AWS AWSLambdaVPCAccessExecutionRole al ruolo di esecuzione della funzione. Quando crei una nuova funzione nella console Lambda e la colleghi a un VPC, Lambda aggiunge automaticamente questa policy di autorizzazioni per tuo conto.
Se preferisci creare la tua policy di autorizzazioni IAM, assicurati di aggiungere tutte le seguenti autorizzazioni e di consentirle su tutt le risorse ("Resource": "*"):
-
ec2:CreateNetworkInterface
-
ec2:DescribeNetworkInterfaces
-
ec2:DescribeSubnets
-
ec2:DeleteNetworkInterface
-
ec2:AssignPrivateIpAddresses
-
ec2:UnassignPrivateIpAddresses
Tieni presente che il ruolo della tua funzione necessita di queste autorizzazioni solo per creare le interfacce di rete, non per richiamare la tua funzione. Puoi comunque richiamare correttamente la funzione quando è collegata a un Amazon VPC, anche se si rimuovono queste autorizzazioni dal ruolo di esecuzione della funzione.
Per collegare la tua funzione a un VPC, Lambda deve anche verificare le risorse di rete utilizzando il tuo ruolo utente IAM. Assicurati che il tuo ruolo utente disponga delle seguenti autorizzazioni IAM:
-
ec2:DescribeSecurityGroups
-
ec2:DescribeSubnets
-
ec2:DescribeVpcs
-
ec2:GetSecurityGroupsForVpc
Nota
Le autorizzazioni Amazon EC2 concesse al ruolo di esecuzione della funzione vengono utilizzate dal servizio Lambda per collegare la funzione a un VPC. Tuttavia, stai anche concedendo implicitamente queste autorizzazioni al codice della tua funzione. Ciò significa che il codice della funzione è in grado di effettuare queste chiamate API Amazon EC2. Per ulteriori informazioni su come seguire la best practice di sicurezza, consulta Best practice di sicurezza.
Collegamento di funzioni Lambda a un Amazon VPC nel tuo Account AWS
Collega la tua funzione a un Amazon VPC del tuo Account AWS utilizzando la console Lambda, la AWS CLI o AWS SAM. Se utilizzi la AWS CLI o AWS SAM o se colleghi una funzione esistente a un VPC utilizzando la console Lambda, assicurati che il ruolo di esecuzione della funzione disponga delle autorizzazioni necessarie elencate nella sezione precedente.
Le funzioni Lambda non possono connettersi direttamente a un VPC con la tenancy dell'istanza dedicata. Per connetterti alle risorse in un VPC dedicato, esegui il peering a un secondo VPC con la tenancy predefinita
Accesso a Internet se collegato a un VPC
Per impostazione predefinita, le funzioni Lambda hanno accesso a Internet pubblico. Quando si collega la funzione a un VPC, può accedere solo alle risorse disponibili all'interno di tale VPC. Per concedere alla funzione l'accesso a Internet, è inoltre necessario configurare il VPC per l'accesso a Internet. Per ulteriori informazioni, consulta Abilitare l'accesso a Internet per funzioni Lambda connesse a un VPC.
Supporto IPv6
La funzione può connettersi alle risorse nelle sottoreti VPC dual-stack su IPv6. Per impostazione predefinita, questa opzione è disabilitata. Per consentire il traffico IPv6 in uscita, usa la console o l'opzione --vpc-config Ipv6AllowedForDualStack=true con il comando create-function
Nota
Per consentire il traffico IPv6 in uscita in un VPC, tutte le sottoreti connesse alla funzione devono essere sottoreti dual-stack. Lambda non supporta connessioni IPv6 in uscita per sottoreti solo IPv6 in un VPC, connessioni IPv6 in uscita per funzioni che non sono connesse a un VPC.
È possibile aggiornare il codice della funzione per connettersi esplicitamente alle risorse di sottorete tramite IPv6. Il seguente esempio di Python apre un socket e si connette a un server IPv6.
Esempio — Connettiti al server IPv6
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()
Best practice per utilizzare Lambda con Amazon VPC
Per garantire che la configurazione del VPC Lambda soddisfi le linee guida delle best practice, segui i consigli nelle sezioni seguenti.
Best practice di sicurezza
Per collegare la tua funzione Lambda a un VPC, devi assegnare al ruolo di esecuzione della funzione una serie di autorizzazioni Amazon EC2. Queste autorizzazioni sono necessarie per creare le interfacce di rete utilizzate dalla funzione per accedere alle risorse nel VPC. Tuttavia, stai anche concedendo implicitamente queste autorizzazioni al codice della tua funzione. Ciò significa che il codice della funzione ha l'autorizzazione per effettuare queste chiamate API Amazon EC2.
Per seguire il principio dell'accesso con privilegio minimo, aggiungi una policy di negazione come quella riportata nell'esempio seguente al ruolo di esecuzione della funzione. Questa policy impedisce al codice della tua funzione di effettuare chiamate alle API di Amazon EC2, pur consentendo al servizio Lambda di gestire le risorse VPC per tuo conto. La policy utilizza la chiave di condizione lambda:SourceFunctionArn, che si applica solo alle chiamate API effettuate dal codice della funzione durante l'esecuzione. Per ulteriori informazioni, consulta Utilizzo dell'ARN della funzione di origine per controllare il comportamento di accesso alla funzione.
AWS fornisce gruppi di sicurezza e liste di controllo degli accessi (ACL) di rete per aumentare la sicurezza del VPC. I gruppi di sicurezza controllano il traffico in entrata e in uscita per le tue risorse, mentre le liste di controllo degli accessi di rete controllano il traffico in entrata e in uscita per le tue sottoreti. I gruppi di sicurezza forniscono un controllo di accesso sufficiente per la maggior parte delle sottoreti. Se desideri un livello di sicurezza aggiuntivo per il tuo VPC, puoi utilizzare le liste di controllo degli accessi di rete. Per linee guida generali sulle best practice di sicurezza per l'utilizzo di Amazon VPC, consulta Best practice di sicurezza per il tuo VPC nella Guida per l'utente di Amazon Virtual Private Cloud.
Best practice sulle prestazioni
Quando colleghi la tua funzione a un VPC, Lambda verifica se esiste una risorsa di rete disponibile (Hyperplane ENI) a cui può connettersi. Le Hyperplane ENI sono associate a una particolare combinazione di gruppi di sicurezza e sottoreti VPC. Se hai già collegato una funzione a un VPC, specificare le stesse sottoreti e gli stessi gruppi di sicurezza quando colleghi un'altra funzione implica che Lambda può condividere le risorse di rete ed evitare la necessità di creare una nuova Hyperplane ENI. Per ulteriori informazioni sulle Hyperplane ENI e sul loro ciclo di vita, consulta Informazioni sulle Hyperplane Elastic Network Interface (ENI).
Informazioni sulle Hyperplane Elastic Network Interface (ENI)
Una Hyperplane ENI è una risorsa gestita che funge da interfaccia di rete tra la tua funzione Lambda e le risorse a cui desideri che la tua funzione si connetta. Il servizio Lambda crea e gestisce queste ENI automaticamente quando colleghi la tua funzione a un VPC.
Le Hyperplane ENI non sono direttamente visibili all'utente e non è necessario configurarle o gestirle. Tuttavia, conoscerne il funzionamento può aiutarti a comprendere il comportamento della tua funzione quando la colleghi a un VPC.
La prima volta che si collega una funzione a un VPC utilizzando una particolare combinazione di sottorete e gruppo di sicurezza, Lambda crea una Hyperplane ENI. Anche altre funzioni del tuo account che utilizzano la stessa combinazione di sottorete e gruppo di sicurezza possono utilizzare questa ENI. Laddove possibile, Lambda riutilizza le ENI esistenti per ottimizzare l'utilizzo delle risorse e ridurre al minimo la creazione di nuove ENI. Ogni Hyperplane ENI supporta fino a 65.000 connessioni/porte. Se il numero di connessioni supera questo limite, Lambda ridimensiona automaticamente il numero di ENI in base al traffico di rete e ai requisiti di simultaneità.
Per le nuove funzioni, mentre Lambda crea una Hyperplane ENI, la funzione rimane nello stato In sospeso e non è possibile richiamarla. La funzione passa allo stato Attivo solo quando l'Hyperplane ENI è pronta, il che può richiedere diversi minuti. Per le funzioni esistenti, non è possibile eseguire ulteriori operazioni per tale funzione, ad esempio la creazione di versioni o l'aggiornamento del codice della funzione, ma è possibile continuare a richiamare le sue versioni precedenti.
Nell'ambito della gestione del ciclo di vita ENI, Lambda può eliminare e ricreare le ENI per bilanciare il carico del traffico di rete tra le ENI o per risolvere problemi riscontrati nei controlli dell’integrità ENI. In aggiunta, se una funzione Lambda rimane inattiva per 14 giorni, Lambda recupera le Hyperplane ENI non utilizzate e imposta lo stato della funzione su Inactive. L'invocazione successiva avrà esito negativo e la funzione entrerà di nuovo nello stato in sospeso fino a quando Lambda non completa la creazione o l'allocazione di una Hyperplane ENI. Ti consigliamo di non basare il tuo design sulla persistenza delle ENI.
Quando aggiorni una funzione per rimuovere la configurazione VPC, Lambda richiede fino a 20 minuti per eliminare l'Hyperplane ENI collegata. Lambda elimina l'ENI solo se nessun'altra funzione (o versione della funzione pubblicata) utilizza l'Hyperplane ENI.
Per eliminare l'Hyperplane ENI, Lambda si basa sulle autorizzazioni del ruolo di esecuzione della funzione. Se elimini il ruolo di esecuzione prima che Lambda abbia eliminato l'Hyperplane ENI, Lambda non sarà più in grado di eliminare l'Hyperplane ENI. Puoi eseguire manualmente l'eliminazione.
Utilizzo dei tasti di condizione IAM per le impostazioni VPC
È possibile utilizzare chiavi di condizione Lambda specifiche per le impostazioni VPC per fornire controlli di autorizzazione aggiuntivi per le funzioni Lambda. Ad esempio, è possibile richiedere che tutte le funzioni dell'organizzazione siano connesse a un VPC. È inoltre possibile specificare le sottoreti e i gruppi di sicurezza che gli utenti della funzione possono e non possono utilizzare.
Lambda supporta inoltre le seguenti chiavi di condizione nelle policy IAM:
-
lambda:VpcIds – Consenti o nega uno o più VPC.
-
lambda:SubnetIds – Consenti o nega una o più sottoreti.
-
lambda:SecurityGroupIds – Consenti o nega uno o più gruppi di sicurezza.
Le operazioni API Lambda CreateFunction e UpdateFunctionConfiguration supportano queste chiavi di condizione. Per ulteriori informazioni sull'uso delle chiavi di condizione nelle policy IAM, consulta elementi della policy IAM JSON: condizione nella Guida per l'utente di IAM.
Suggerimento
Se la funzione include già una configurazione VPC da una richiesta API precedente, è possibile inviare una richiesta UpdateFunctionConfiguration senza la configurazione VPC.
Policy di esempio con chiavi di condizione per le impostazioni VPC
Negli esempi seguenti viene illustrato come utilizzare le chiavi di condizione per le impostazioni VPC. Dopo aver creato un'istruzione delle policy con le restrizioni desiderate, aggiungere l'istruzione delle policy per l'utente o il ruolo di destinazione.
Assicurarsi che gli utenti distribuiscano solo funzioni connesse a VPC
Per garantire che tutti gli utenti distribuiscano solo funzioni connesse a VPC, è possibile negare le operazioni di creazione e aggiornamento delle funzioni che non includono un ID VPC valido.
Si noti che l'ID VPC non è un parametro di input per la richiesta CreateFunction o UpdateFunctionConfiguration. Lambda recupera il valore dell'ID VPC in base ai parametri della sottorete e del gruppo di sicurezza.
Negare agli utenti l'accesso a specifici VPC, sottoreti o gruppi di sicurezza
Per negare agli utenti l'accesso a specifici VPC, utilizzare StringEquals per verificare il valore della condizione lambda:VpcIds. Nell'esempio seguente viene negato agli utenti l'accesso a vpc-1 e vpc-2.
Per negare agli utenti l'accesso a subnet specifiche, utilizzare StringEquals per verificare il valore della condizione lambda:SubnetIds. Nell'esempio seguente viene negato agli utenti l'accesso a subnet-1 e subnet-2.
{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
Per negare agli utenti l'accesso a specifici gruppi di sicurezza, utilizzare StringEquals per verificare il valore della condizione lambda:SecurityGroupIds. Nell'esempio seguente viene negato agli utenti l'accesso a sg-1 e sg-2.
{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }
Consenti agli utenti di creare e aggiornare funzioni con impostazioni VPC specifiche
Per consentire agli utenti di accedere a specifici VPC, utilizzare StringEquals per verificare il valore della condizione lambda:VpcIds. L'esempio seguente consente agli utenti di accedere a vpc-1 e vpc-2.
Per consentire agli utenti di accedere a sottoreti specifiche, utilizzare StringEquals per verificare il valore della condizione lambda:SubnetIds. L'esempio seguente consente agli utenti di accedere a subnet-1 e subnet-2.
{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
Per consentire agli utenti di accedere a gruppi di sicurezza specifici, utilizzare StringEquals per verificare il valore della condizione lambda:SecurityGroupIds. L'esempio seguente consente agli utenti di accedere a sg-1 e sg-2.
{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }
Tutorial VPC
Nelle esercitazioni seguenti è possibile connettere una funzione Lambda alle risorse del VPC.