Utilizzo di un modello AWS CloudFormation per automatizzare la configurazione di S3 Object Lambda
È possibile utilizzare un modello AWS CloudFormation per creare rapidamente un Amazon S3 Object Lambda Access Point. Il modello CloudFormation crea automaticamente risorse pertinenti, configura i ruoli AWS Identity and Access Management (IAM) e imposta una funzione AWS Lambda che gestisce automaticamente le richieste tramite il punto di accesso Lambda per oggetti. Con il modello CloudFormation, è possibile implementare best practice, migliorare la posizione di sicurezza e ridurre gli errori causati dai processi manuali.
Questo Repository GitHub
La funzione Lambda fornita nel modello non esegue alcuna trasformazione. Al contrario, restituisce gli oggetti così come sono dal bucket S3. È possibile clonare la funzione e aggiungere il proprio codice di trasformazione per modificare ed elaborare i dati quando vengono restituiti a un'applicazione. Per ulteriori informazioni sulla modifica della funzione, consulta Modifica della funzione Lambda e Scrittura di funzioni Lambda per gli access point S3 Object Lambda.
Modifica del modello
Creazione di un nuovo punto di accesso di supporto
Lambda per oggetti S3 utilizza due punti di accesso, un punto di accesso Lambda per oggetti e un punto di accesso S3 standard, denominato punto di accesso di supporto. Quando effettui una richiesta a un punto di accesso Lambda per oggetti, S3 invoca Lambda per tuo conto o delega la richiesta al punto di accesso di supporto, a seconda della configurazione di Lambda per oggetti S3. È possibile creare un nuovo punto di accesso di supporto passando il seguente parametro come parte del comando aws
cloudformation deploy
durante l'implementazione del modello.
CreateNewSupportingAccessPoint=true
Configurazione del carico utile di una funzione
È possibile configurare un payload per fornire dati supplementari alla funzione Lambda passando il seguente parametro come parte del comando aws cloudformation
deploy
al momento dell'implementazione del modello.
LambdaFunctionPayload="format=json"
Abilitazione del monitoraggio di Amazon CloudWatch
È possibile abilitare il monitoraggio di CloudWatch trasmettendo il seguente parametro come parte del comando aws cloudformation deploy
quando si distribuisce il modello.
EnableCloudWatchMonitoring=true
Questo parametro abiliterà il punto di accesso Lambda per oggetti per le metriche della richiesta Amazon S3 e creerà due allarmi CloudWatch per monitorare gli errori lato client e lato server.
Nota
L'utilizzo di Amazon CloudWatch comporta costi aggiuntivi. Per ulteriori informazioni sulle metriche delle richieste Amazon S3, consulta la sezione Monitoraggio e registrazione degli access point.
Per informazioni sui prezzi, consulta i prezzi di CloudWatch
Configurazione del provisioning simultaneo
Per ridurre la latenza, è possibile configurare la simultaneità con provisioning per la funzione Lambda che supporta il punto di accesso Lambda per oggetti modificando il modello per includere le seguenti righe in Resources
.
LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
Nota
Si dovranno sostenere costi aggiuntivi per il provisioning simultaneo. Per ulteriori informazioni sulla simultaneità con provisioning, consulta Gestione della simultaneità con provisioning di Lambda nella Guida per gli sviluppatori di AWS Lambda.
Per i dettagli sui prezzi, consulta Prezzi di AWS Lambda
Modifica della funzione Lambda
Modifica dei valori di intestazione per una richiesta GetObject
Per impostazione predefinita, la funzione Lambda inoltra tutte le intestazioni, eccetto Content-Length
ed ETag
, dalla richiesta URL prefirmata al client GetObject
. In base al codice di trasformazione nella funzione Lambda, si può scegliere di inviare nuovi valori di intestazione al client GetObject
.
È possibile aggiornare la funzione Lambda per inviare nuovi valori di intestazione passandoli nell'operazione API WriteGetObjectResponse
.
Ad esempio, se la funzione Lambda traduce il testo degli oggetti di Amazon S3 in una lingua diversa, è possibile trasmettere un nuovo valore nell'intestazione Content-Language
. Puoi fare ciò modificando la funzione writeResponse
come descritto di seguito.
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: '
my-new-language
' }).promise(); }
Per un elenco completo delle intestazioni supportate, consulta la sezione WriteGetObjectResponse
nel Riferimento API di Amazon Simple Storage Service.
Restituzione delle intestazioni dei metadati
È possibile aggiornare la funzione Lambda per inviare nuovi valori di intestazione passandoli nella richiesta dell'operazione API WriteGetObjectResponse
.
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': '
my-new-value
' }, ...headers }).promise(); }
Restituzione di un nuovo codice di stato
È possibile restituire un codice di stato personalizzato al client GetObject
passandolo nella richiesta dell'operazione API WriteGetObjectResponse
.
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode:
Integer
}).promise(); }
Per un elenco completo dei codici di stato supportati, consulta la sezione WriteGetObjectResponse
nel Riferimento API di Amazon Simple Storage Service.
Applicazione dei Range
e partNumber
all'oggetto di origine
Per impostazione predefinita, il punto di accesso Lambda per oggetti creato dal modello CloudFormation è in grado di gestire i parametri Range
e partNumber
. La funzione Lambda applica l'intervallo o il numero di parte richiesto all'oggetto trasformato. A tale scopo, è necessario scaricare l'intero oggetto ed eseguire la trasformazione. In alcuni casi, gli intervalli di oggetti trasformati potrebbero corrispondere esattamente agli intervalli di oggetti di origine. Ciò significa che la richiesta dell'intervallo di byte A-B sull'oggetto di origine e l'esecuzione della trasformazione potrebbero produrre lo stesso risultato della richiesta dell'intero oggetto, dell'esecuzione della trasformazione e della restituzione dell'intervallo di byte A-B sull'oggetto trasformato.
In questi casi, è possibile modificare l'implementazione della funzione Lambda per applicare l'intervallo o il numero di parte direttamente all'oggetto sorgente. Questo approccio riduce la latenza generale della funzione e la memoria richieste. Per ulteriori informazioni, consulta Utilizzo delle intestazioni Range e partNumber.
Disabilitazione della gestione di Range
epartNumber
Per impostazione predefinita, il punto di accesso Lambda per oggetti creato dal modello CloudFormation è in grado di gestire i parametri Range
e partNumber
. Se questo comportamento non è necessario, è possibile disabilitarlo rimuovendo le seguenti righe dal modello:
AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
Trasformazione di oggetti di grandi dimensioni
Per impostazione predefinita, la funzione Lambda elabora l'intero oggetto in memoria prima di poter avviare lo streaming della risposta a S3 Object Lambda. È possibile modificare la funzione per trasmettere la risposta in streaming mentre esegue la trasformazione. Ciò aiuta a ridurre la latenza della trasformazione e la dimensione della memoria della funzione Lambda. Per un esempio di implementazione, consulta Esempio di streaming di contenuti compressi.