Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Limita l'accesso all'origine dell'URL di una AWS Lambda funzione
CloudFront fornisce il controllo dell'accesso all'origine (OAC) per limitare l'accesso all'origine dell'URL di una funzione Lambda.
Argomenti
Crea un nuovo OAC
Completa i passaggi descritti nei seguenti argomenti per configurare un nuovo OAC in. CloudFront
Importante
Se utilizzi PUT
o POST
metodi con l'URL della funzione Lambda, gli utenti devono calcolare il corpo SHA256 del corpo e includere il valore hash del payload del corpo della richiesta nell'x-amz-content-sha256
intestazione quando inviano la richiesta a. CloudFront Lambda non supporta payload non firmati.
Argomenti
Prerequisiti
Prima di creare e configurare OAC, è necessario disporre di una CloudFront distribuzione con un URL della funzione Lambda come origine. Per utilizzare OAC, è necessario specificare AWS_IAM
come valore per il parametro. AuthType
Per ulteriori informazioni, consulta Usa l'URL di una funzione Lambda.
Concedi CloudFront l'autorizzazione per accedere all'URL della funzione Lambda
Prima di creare un OAC o configurarlo in una CloudFront distribuzione, assicurati che CloudFront disponga dell'autorizzazione per accedere all'URL della funzione Lambda. Esegui questa operazione dopo aver creato una CloudFront distribuzione, ma prima di aggiungere l'OAC all'URL della funzione Lambda nella configurazione di distribuzione.
Nota
Per aggiornare la policy IAM per l'URL della funzione Lambda, devi usare il AWS Command Line Interface ()AWS CLI. La modifica della policy IAM nella console Lambda non è supportata al momento.
Il AWS CLI comando seguente concede al CloudFront service principal (cloudfront.amazonaws.com
) l'accesso all'URL della funzione Lambda. L'Condition
elemento della policy consente di accedere CloudFront a Lambda solo quando la richiesta è per conto della CloudFront distribuzione che contiene l'URL della funzione Lambda. Questa è la distribuzione con l'origine dell'URL della funzione Lambda a cui vuoi aggiungere OAC.
Esempio : AWS CLI comando per aggiornare una policy per consentire l'accesso in sola lettura a una CloudFront distribuzione con OAC abilitato
Il AWS CLI comando seguente consente alla CloudFront distribution (
) di accedere alla tua E1PDK09ESKHJWT
Lambda.FUNCTION_URL_NAME
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::
123456789012
:distribution/E1PDK09ESKHJWT
" \ --function-nameFUNCTION_URL_NAME
Nota
Se crei una distribuzione e questa non dispone dell'autorizzazione per l'URL della funzione Lambda, puoi scegliere Copia il comando CLI dalla CloudFront console e quindi immettere questo comando dal tuo terminale a riga di comando. Per ulteriori informazioni, consulta Concessione dell'accesso alla funzione Servizi AWS nella Guida per gli AWS Lambda sviluppatori.
Crea l'OAC
Per creare un OAC, puoi utilizzare l' AWS Management Console, AWS CloudFormation AWS CLI, o l' CloudFront API.
Impostazioni avanzate per il controllo dell'accesso all'origine
La funzionalità CloudFront OAC include impostazioni avanzate destinate solo a casi d'uso specifici. Usa le impostazioni consigliate a meno che tu non abbia una necessità specifica per le impostazioni avanzate.
OAC contiene un'impostazione denominata Signing behavior (nella console) o SigningBehavior
(nell'API, nella CLI e). AWS CloudFormation Questa impostazione offre le seguenti opzioni:
- Firma sempre le richieste di origine (impostazione consigliata)
-
Si consiglia di utilizzare questa impostazione, denominata Richieste di firma (consigliata) nella console, oppure
always
nell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Con questa impostazione, firma CloudFront sempre tutte le richieste inviate all'URL della funzione Lambda. - Non firmare le richieste di origine
-
Questa impostazione è denominata Non firmare le richieste nella console, oppure
never
nell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Usa questa impostazione per disattivare l'OAC per tutte le origini in tutte le distribuzioni che utilizzano questo OAC. Ciò consente di risparmiare tempo e fatica rispetto alla rimozione di un OAC da tutte le origini e le distribuzioni che lo utilizzano, una per una. Con questa impostazione, CloudFront non firma alcuna richiesta inviata all'URL della funzione Lambda.avvertimento
Per utilizzare questa impostazione, l'URL della funzione Lambda deve essere accessibile pubblicamente. Se usi questa impostazione con un URL della funzione Lambda non accessibile pubblicamente, non CloudFront puoi accedere all'origine. L'URL della funzione Lambda restituisce gli errori CloudFront e li CloudFront trasmette ai visualizzatori. Per ulteriori informazioni, consulta il modello di sicurezza e autenticazione per la URLs funzione Lambda nella Guida per AWS Lambda l'utente.
- Non ignorare l'intestazione del visualizzatore (client)
Authorization
-
Questa impostazione è denominata Non sovrascrivere l'intestazione di autorizzazionenella console, oppure
no-override
nell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Utilizzate questa impostazione quando desiderate firmare CloudFront le richieste di origine solo quando la richiesta del visualizzatore corrispondente non include un'Authorization
intestazione. Con questa impostazione, CloudFront trasmette l'Authorization
intestazione della richiesta del visualizzatore quando ne è presente una, ma firma la richiesta di origine (aggiungendo la propriaAuthorization
intestazione) quando la richiesta del visualizzatore non include un'intestazione.Authorization
avvertimento
-
Se utilizzi questa impostazione, devi specificare la firma Signature Version 4 per l'URL della funzione Lambda anziché il nome o il CNAME della CloudFront distribuzione. Quando CloudFront inoltra l'
Authorization
intestazione dalla richiesta del visualizzatore all'URL della funzione Lambda, Lambda convalida la firma rispetto all'host del dominio URL Lambda. Se la firma non è basata sul dominio URL Lambda, l'host nella firma non corrisponderà all'host utilizzato dall'origine dell'URL Lambda. Ciò significa che la richiesta avrà esito negativo, con conseguente errore di convalida della firma.
-
Per trasmettere l'
Authorization
intestazione dalla richiesta del visualizzatore, è necessario aggiungere l'Authorization
intestazione a una politica di cache per tutti i comportamenti della cache che utilizzano la funzione Lambda URLs associata a questo controllo di accesso all'origine.
-
Codice modello di esempio
Se la tua CloudFront origine è l'URL di una funzione Lambda associata a un OAC, puoi usare il seguente script Python per caricare file nella funzione Lambda con il metodo. POST
Questo codice presuppone che tu abbia configurato l'OAC con il comportamento di firma predefinito impostato su Firma sempre le richieste di origine e che non sia stata selezionata l'impostazione dell'intestazione Do not override authorization.
Questa configurazione consente all'OAC di gestire correttamente l'autorizzazione SigV4 con Lambda utilizzando il nome host Lambda. Il payload viene firmato utilizzando SigV4 dall'identità IAM autorizzata per l'URL della funzione Lambda, che è designato come tipo. IAM_AUTH
Il modello dimostra come gestire i valori hash del payload firmati in x-amz-content-sha256 intestazione per le POST
richieste dal lato client. In particolare, questo modello è progettato per gestire i payload dei dati dei moduli. Il modello consente il caricamento sicuro dei file su un URL CloudFront della funzione Lambda e AWS utilizza meccanismi di autenticazione per garantire che solo le richieste autorizzate possano accedere alla funzione Lambda.
Il codice include le seguenti funzionalità:
-
Soddisfa il requisito per l'inclusione dell'hash del payload nel x-amz-content-sha256 intestazione
-
Utilizza l'autenticazione SigV4 per un accesso sicuro Servizio AWS
-
Supporta il caricamento di file utilizzando dati di moduli composti da più parti
-
Include la gestione degli errori per le eccezioni delle richieste
import boto3 from botocore.auth import SigV4Auth from botocore.awsrequest import AWSRequest import requests import hashlib import os def calculate_body_hash(body): return hashlib.sha256(body).hexdigest() def sign_request(request, credentials, region, service): sigv4 = SigV4Auth(credentials, service, region) sigv4.add_auth(request) def upload_file_to_lambda(cloudfront_url, file_path, region): # AWS credentials session = boto3.Session() credentials = session.get_credentials() # Prepare the multipart form-data boundary = "------------------------boundary" # Read file content with open(file_path, 'rb') as file: file_content = file.read() # Get the filename from the path filename = os.path.basename(file_path) # Prepare the multipart body body = ( f'--{boundary}\r\n' f'Content-Disposition: form-data; name="file"; filename="{filename}"\r\n' f'Content-Type: application/octet-stream\r\n\r\n' ).encode('utf-8') body += file_content body += f'\r\n--{boundary}--\r\n'.encode('utf-8') # Calculate SHA256 hash of the entire body body_hash = calculate_body_hash(body) # Prepare headers headers = { 'Content-Type': f'multipart/form-data; boundary={boundary}', 'x-amz-content-sha256': body_hash } # Create the request request = AWSRequest( method='POST', url=cloudfront_url, data=body, headers=headers ) # Sign the request sign_request(request, credentials, region, 'lambda') # Get the signed headers signed_headers = dict(request.headers) # Print request headers before sending print("Request Headers:") for header, value in signed_headers.items(): print(f"{header}: {value}") try: # Send POST request with signed headers response = requests.post( cloudfront_url, data=body, headers=signed_headers ) # Print response status and content print(f"\nStatus code: {response.status_code}") print("Response:", response.text) # Print response headers print("\nResponse Headers:") for header, value in response.headers.items(): print(f"{header}: {value}") except requests.exceptions.RequestException as e: print(f"An error occurred: {e}") # Usage cloudfront_url = "https://d111111abcdef8.cloudfront.net" file_path = r"filepath" region = "us-east-1" # example: "us-west-2" upload_file_to_lambda(cloudfront_url, file_path, region)