Creazione di una funzione Lambda definita dall'utente scalare - Amazon Redshift

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à.

Creazione di una funzione Lambda definita dall'utente scalare

Amazon Redshift può utilizzare funzioni personalizzate definite AWS Lambda come parte delle query SQL. È possibile scrivere UDF Lambda scalari in qualsiasi linguaggio di programmazione supportato da Lambda, ad esempio Java, Go, Node.js, C# PowerShell, Python e Ruby. Oppure è possibile usare un runtime personalizzato.

Le funzioni Lambda definite dall'utente sono definite e gestite in Lambda ed è possibile controllare i privilegi di accesso per richiamare queste funzioni definite dall'utente in Amazon Redshift. È possibile richiamare più funzioni Lambda nella stessa query o richiamare la stessa funzione più volte.

Utilizzare le funzioni Lambda definite dall'utente in tutte le clausole delle istruzioni SQL in cui sono supportate le funzioni scalari. Le funzioni Lambda definite dall'utente possono essere utilizzate in qualsiasi istruzione SQL, ad esempio SELECT, UPDATE, INSERT o DELETE.

Nota

L'utilizzo di funzioni Lambda definite dall'utente può comportare costi aggiuntivi dal servizio Lambda. Ciò dipende da fattori quali il numero di richieste Lambda (richiami alle funzioni definite dall'utente) e la durata totale dell'esecuzione del programma Lambda. Tuttavia, non sono previsti costi aggiuntivi per l'utilizzo delle funzioni Lambda definite dall'utente in Amazon Redshift. Per informazioni sui prezzi di AWS Lambda, consulta AWS Lambda Prezzi.

Il numero di richieste Lambda varia a seconda della clausola di istruzione SQL specifica in cui viene utilizzata la funzioni Lambda definite dall'utente. Si supponga, ad esempio, che la funzione sia utilizzata in una clausola WHERE come la seguente.

SELECT a, b FROM t1 WHERE lambda_multiply(a, b) = 64; SELECT a, b FROM t1 WHERE a*b = lambda_multiply(2, 32)

In questo caso, Amazon Redshift chiama la prima istruzione SELECT per ogni clausola e chiama la seconda istruzione SELECT una sola volta.

Tuttavia, l'utilizzo di una funzione definita dall'utente nella parte di proiezione della query potrebbe richiamare la funzione Lambda una sola volta per ogni riga qualificata o aggregata nel set di risultati.

Registrazione di una funzione Lambda definita dall'utente

Il comando CREATE EXTERNAL FUNCTION crea i seguenti parametri:

  • (Facoltativo) Un elenco di argomenti con tipo di dati.

  • Un tipo di dati restituito.

  • Un nome di funzione della funzione esterna chiamata da Amazon Redshift.

  • Un ruolo IAM che il cluster Amazon Redshift è autorizzato ad assumere e chiamare Lambda.

  • Il nome di una funzione Lambda richiamato dalla funzione Lambda definita dall'utente.

Per informazioni su CREATE EXTERNAL FUNCTION, consultare CREATE EXTERNAL FUNCTION.

I tipi di dati di input e di restituzione per questa funzione possono essere qualsiasi tipo di dati Amazon Redshift standard.

Amazon Redshift assicura che la funzione esterna possa inviare e ricevere argomenti e risultati in batch.

Gestione della sicurezza e dei privilegi della funzione Lambda definita dall'utente

Per creare una funzione Lambda definita dall'utente, assicurati di disporre delle autorizzazioni per l'utilizzo su LANGUAGE EXFUNC. È necessario concedere o revocare esplicitamente USE ON LANGUAGE EXFUNC a utenti, gruppi o pubblici specifici.

Nell'esempio seguente viene concesso l'utilizzo su EXFUNC a PUBLIC.

grant usage on language exfunc to PUBLIC;

Nell'esempio seguente viene revocato l'utilizzo su exfunc da PUBLIC, quindi viene concesso al gruppo di utenti lambda_udf_devs.

revoke usage on language exfunc from PUBLIC; grant usage on language exfunc to group lambda_udf_devs;

Per eseguire una funzione Lambda definita dall'utente, assicurarsi di disporre delle autorizzazioni per ogni funzione chiamata. Per impostazione predefinita, l'autorizzazione per eseguire nuove funzioni Lambda definite dall'utente è concessa a PUBLIC. Per limitare l'utilizzo, revocare l'autorizzazione da PUBLIC. Quindi concedere il privilegio a individui o gruppi specifici.

Nell'esempio seguente viene revocata l'esecuzione su una funzione exfunc_sum da PUBLIC. Concede quindi l'utilizzo al gruppo di utenti lambda_udf_devs.

revoke execute on function exfunc_sum(int, int) from PUBLIC; grant execute on function exfunc_sum(int, int) to group lambda_udf_devs;

Per impostazione predefinita gli utenti con privilegi avanzati hanno tutti i privilegi.

Per ulteriori informazioni su come concedere e revocare privilegi, consultare GRANT e REVOKE.

Configurazione del parametro di autorizzazione per le funzioni Lambda definite dall'utente

Il comando CREATE EXTERNAL FUNCTION richiede l'autorizzazione per richiamare le funzioni Lambda AWS Lambda. Per avviare l'autorizzazione, specifica un ruolo AWS Identity and Access Management (IAM) quando esegui il comando CREATE EXTERNAL FUNCTION. Per ulteriori informazioni sui ruoli IAM, consultare Ruoli IAM nella Guida per l'utente di IAM.

Se è presente un ruolo IAM esistente per richiamare funzioni Lambda collegate al cluster, è possibile sostituire l'Amazon Resource Name (ARN) del ruolo nel parametro IAM_ROLE per il comando. Nelle sezioni seguenti vengono descritti i passaggi per l'uso di un ruolo IAM nel comando CREATE EXTERNAL FUNCTION.

Creazione di un ruolo IAM per Lambda

Il ruolo IAM richiede l'autorizzazione per richiamare le funzioni Lambda. Durante la creazione del ruolo IAM, fornire l'autorizzazione in uno dei modi seguenti:

  • Collegare la policy AWSLambdaRole sulla pagina Collega policy di autorizzazioni durante la creazione di un ruolo IAM. La policy AWSLambdaRole concede le autorizzazioni per richiamare funzioni Lambda, che è il requisito minimo. Per ulteriori informazioni e altre policy, consultare Policy IAM basate sull'identità per AWS Lambda nella Guida per gli sviluppatori di AWS Lambda .

  • Creare policy personalizzate da associare al ruolo IAM con l'autorizzazione lambda:InvokeFunction di tutte le risorse o di una particolare funzione Lambda con l'ARN di tale funzione. Per informazioni sulla creazione di policy IAM, consultare Creazione di policy IAM nella Guida per l'utente di IAM.

    La seguente policy di esempio consente di richiamare Lambda su una particolare funzione Lambda.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function" } ] }

    Per ulteriori informazioni sulle risorse per le funzioni Lambda, consultare Risorse e condizioni per operazioni Lambda in Documentazione di riferimento dell'API IAM.

    Dopo aver creato la policy personalizzata con le autorizzazioni richieste, è possibile collegare la policy al ruolo IAM sulla pagina Collega policy di autorizzazioni durante la creazione di un ruolo IAM.

Per i passaggi per creare un ruolo IAM, consulta Autorizzazione di Amazon Redshift ad accedere ad AWS altri servizi per tuo conto nella Amazon Redshift Management Guide.

Se non si desidera creare un nuovo ruolo IAM, è possibile aggiungere le autorizzazioni menzionate in precedenza al ruolo IAM esistente.

Associazione di un ruolo IAM al cluster

Collegare il ruolo IAM al cluster. È possibile aggiungere un ruolo a un cluster o visualizzare i ruoli associati a un cluster utilizzando la Console di gestione, la CLI o l'API di Amazon Redshift. Per ulteriori informazioni, consulta Associazione di un ruolo IAM a un cluster nella Guida alla gestione di Amazon Redshift.

Inclusione del ruolo IAM nel comando

Includere l'ARN del ruolo IAM nel comando CREATE EXTERNAL FUNCTION. Quando crei un ruolo IAM, IAM restituisce un Amazon Resource Name (ARN) per il ruolo. Per specificare un ruolo IAM, fornire l'ARN del ruolo con il parametro IAM_ROLE. Di seguito è mostrata la sintassi del parametro IAM_ROLE.

IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'

Per richiamare le funzioni Lambda che risiedono in altri account all'interno della stessa regione, consultare Concatenazione di ruoli IAM in Amazon Redshift.

Utilizzo dell'interfaccia JSON tra Amazon Redshift e AWS Lambda

Amazon Redshift utilizza un'interfaccia comune per tutte le funzioni Lambda con cui Amazon Redshift comunica.

La tabella seguente mostra l'elenco dei campi di input che le funzioni Lambda designate possono aspettarsi per il payload JSON.

Nome campo

Descrizione

Intervallo di valori
request_id Un identificatore universale univoco (UID, Universally Unique Identifier) che identifichi in modo univoco ogni richiesta di richiamo.

Un UUID valido.

cluster

L'Amazon Resource Name (ARN) del cluster database.

Un ARN del cluster valido.

Utente

Il nome dell'utente che effettua la chiamata. Un nome utente valido.

database

Il nome del database su cui è in esecuzione la query. Un nome valido del database.

funzione external_

Il nome completo della funzione esterna che effettua la chiamata. Un nome di funzione completo valido.

query_id

L'ID query della query che effettua la chiamata. Un ID query valido.

num_records

Il numero di argomenti nel payload. Un valore compreso tra 1 e 2^64.

argomenti

Il payload di dati nel formato specificato. I dati in formato array devono essere un array JSON. Ogni elemento è un record che è un array se il numero di argomenti è maggiore di 1. Utilizzando un array, Amazon Redshift mantiene l'ordine dei record nel payload.

L'ordine dell'array JSON determina l'ordine di elaborazione batch. La funzione Lambda deve elaborare gli argomenti in maniera iterativa e produrre il numero esatto di record. Di seguito è riportato un esempio di payload.

{ "request_id" : "23FF1F97-F28A-44AA-AB67-266ED976BF40", "cluster" : "arn:aws:redshift:xxxx", "user" : "adminuser", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }

L'output restituito dalla funzione Lambda contiene i seguenti campi.

Nome campo

Descrizione

Intervallo di valori
success L'indicazione di successo o fallimento per la funzione.

Un valore di "true" o "false".

error_msg

Il messaggio di errore se il valore di riuscita è "false" (se la funzione non riesce); in caso contrario, questo campo viene ignorato.

Un messaggio valido.

num_records

Il numero di record nel payload. Un valore compreso tra 1 e 2^64.

results

I risultati della chiamata nel formato specificato. N/D

Di seguito è riportato un esempio di output di una funzione Lambda:

{ "success": true, // true indicates the call succeeded "error_msg" : "my function isn't working", // shall only exist when success != true "num_records": 4, // number of records in this payload "results" : [ 1, 4, null, 7 ] }

Quando vengono richiamate le funzioni Lambda da query SQL, Amazon Redshift garantisce la sicurezza della connessione con le seguenti considerazioni:

  • Autorizzazioni GRANT e REVOKE. Per ulteriori informazioni sulla sicurezza e sui privilegi delle funzioni definite dall'utente, consultare Sicurezza e privilegi dell'UDF.

  • Amazon Redshift invia alla funzione Lambda designata solo il set minimo di dati.

  • Amazon Redshift chiama solo la funzione Lambda designata con il ruolo IAM designato.