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 a un AWS Lambda origine dell'URL della funzione
CloudFront fornisce il controllo dell'accesso all'origine (OAC) per limitare l'accesso all'origine dell'URL di una funzione Lambda.
Argomenti
Creazione di un nuovo OAC
Completa i passaggi descritti nei seguenti argomenti per configurare un nuovo OAC in. CloudFront
Importante
Se utilizzi POST metodi PUT OR con l'URL della tua funzione Lambda, gli utenti devono calcolare lo SHA256 del corpo e includere il valore hash del payload del corpo della richiesta nell'intestazione quando inviano la richiesta a. x-amz-content-sha256 CloudFront Lambda non supporta i payload non firmati.
Argomenti
Prerequisiti
Prima di creare e configurare OAC, è necessario disporre di una CloudFront distribuzione con l'URL di una funzione Lambda come origine. Per utilizzare OAC, deve specificare AWS_IAM come il valore per il parametro AuthType. Per ulteriori informazioni, consulta Utilizzo dell’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 di disporre dell'autorizzazione per accedere all'URL della funzione Lambda. CloudFront Fatelo dopo aver creato una CloudFront distribuzione, ma prima di aggiungere l'OAC all'URL della funzione Lambda nella configurazione della distribuzione.
Nota
Per aggiornare la policy IAM per l’URL della funzione Lambda, devi usare AWS Command Line Interface (AWS CLI). La modifica della policy IAM nella console Lambda non è attualmente supportata.
Il AWS CLI comando seguente concede al CloudFront service principal (cloudfront.amazonaws.com) l'accesso all'URL della tua funzione Lambda. L'Conditionelemento 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 desideri aggiungere l’OAC.
Esempio: AWS CLI comando per aggiornare una policy per consentire l'accesso in sola lettura per una CloudFront distribuzione con OAC abilitato
I seguenti AWS CLI comandi consentono a CloudFront distribution () di accedere alla tua Lambda. E1PDK09ESKHJWTFUNCTION_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
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipalInvokeFunction" \ --action "lambda:InvokeFunction" \ --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 tua funzione Lambda, puoi scegliere il comando Copy CLI dalla CloudFront console e quindi inserire questo comando dal tuo terminale a riga di comando. Per ulteriori informazioni, consulta Concedere alla funzione l’accesso a Servizi AWS nella Guida per gli sviluppatori di AWS Lambda .
Creazione dell’OAC
Per creare un OAC, puoi utilizzare Console di gestione AWS, CloudFormation, the o l' AWS CLI API. CloudFront
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.
L'OAC contiene un'impostazione denominata Signing behavior (nella console) o SigningBehavior (nell'API, nella CLI e). 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
alwaysnell'API, nell'interfaccia a riga di comando e 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
nevernell'API, nell'interfaccia a riga di comando e CloudFormation. Usa questa impostazione per disattivare 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, uno per uno. 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 utilizzi questa impostazione con un URL di una funzione Lambda che 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 Modello di sicurezza e autenticazione per gli URL della funzione Lambda nella Guida per l’utente di AWS Lambda .
- Non ignorare l'intestazione del visualizzatore (client)
Authorization -
Questa impostazione è denominata Non sovrascrivere l'intestazione di autorizzazionenella console, oppure
no-overridenell'API, nell'interfaccia a riga di comando e CloudFormation. Usa questa impostazione quando desideri firmare CloudFront le richieste di origine solo quando la richiesta del visualizzatore corrispondente non include un'Authorizationintestazione. Con questa impostazione, CloudFront trasmette l'Authorizationintestazione della richiesta del visualizzatore quando è presente, ma firma la richiesta di origine (aggiungendo la propriaAuthorizationintestazione) quando la richiesta del visualizzatore non include un'intestazione.Authorizationavvertimento
-
Se utilizzi questa impostazione, devi specificare la firma Signature Version 4 per l'URL della funzione Lambda anziché il nome o il CNAME della tua CloudFront distribuzione. Quando CloudFront inoltra l'
Authorizationintestazione dalla richiesta del visualizzatore all'URL della funzione Lambda, Lambda convaliderà 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 non andrà a buon fine, causando un errore di convalida della firma.
-
Per trasmettere l’intestazione
Authorizationdalla richiesta visualizzatore, devi aggiungere l’intestazioneAuthorizationa una policy della cache per tutti i comportamenti cache che utilizzano URL della funzione Lambda associati a questo controllo di accesso origine.
-
Esempio di codice modello
Se la tua CloudFront origine è l'URL di una funzione Lambda associato a un OAC, puoi utilizzare il seguente script Python per caricare file nella funzione Lambda con il metodo. POST
Questo codice presuppone che l’OAC sia stato configurato con il comportamento di firma predefinito impostato su Firma sempre le richieste di origine e che non sia stata selezionata l’impostazione Non sovrascrivere l’intestazione di autorizzazione.
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 mostra come gestire i valori hash del payload firmato nell’intestazione x-amz-content-sha256 per le richieste POST dal lato client. Nello specifico, questo modello è progettato per gestire i payload dei dati dei moduli. Il modello consente il caricamento sicuro dei file su una funzione Lambda tramite CloudFront l'URL e utilizza meccanismi di AWS autenticazione per assicurarsi che solo le richieste autorizzate possano accedere alla funzione Lambda.
Il codice include la seguente funzionalità:
-
Soddisfa il requisito di includere l’hash del payload nell’intestazione x-amz-content-sha256
-
Utilizza l'autenticazione SIGv4 per un accesso sicuro Servizio AWS
-
Supporta caricamenti di file utilizzando dati di moduli multiparte
-
Include la gestione degli errori per le eccezioni richiesta
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)