

 Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dalla Patch 198. Le UDF Python esistenti continueranno a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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

# UDF Lambda scalari
<a name="udf-creating-a-lambda-sql-udf"></a>

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

Il comando [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md) 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](r_CREATE_EXTERNAL_FUNCTION.md).

I tipi di dati di input e restituiti per le UDF Lambda possono essere i seguenti:
+  SMALLINT 
+  INTEGER 
+  BIGINT 
+  DECIMAL 
+  REAL 
+  DOUBLE PRECISION 
+  CHAR 
+  VARCHAR 
+  BOOLEAN 
+  DATE 
+  TIMESTAMP 

Anche gli alias per questi tipi sono validi. Per un elenco completo dei tipi di dati e dei relativi alias, consulta [Tipi di dati](c_Supported_data_types.md).

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

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.](https://aws.amazon.com/lambda/pricing)  
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. 

## Sicurezza e autorizzazioni delle UDF
<a name="udf-lambda-security"></a>

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](r_GRANT.md) e [REVOKE](r_REVOKE.md).

## Configurazione del parametro di autorizzazione per le funzioni Lambda definite dall'utente
<a name="udf-lambda-authorization"></a>

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](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles.html) 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
<a name="udf-lambda-create-iam"></a>

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 politiche, consulta le [politiche Identity-based IAM AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html) nella *AWS Lambda Developer Guide*.
+ 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](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) nella *Guida per l'utente di IAM*.

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

------
#### [ JSON ]

****  

  ```
  {
      "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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-api-permissions-ref.html) 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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 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
<a name="udf-lambda-associate-iam"></a>

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](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) nella *Guida alla gestione di Amazon Redshift*.

### Inclusione del ruolo IAM nel comando
<a name="udf-lambda-include-iam"></a>

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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles.html).

## Utilizzo dell'interfaccia JSON tra Amazon Redshift e AWS Lambda
<a name="udf-lambda-json"></a>

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 |  Description  | 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. | 
| user | 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 |  Description  | 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/A | 

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 informazioni sulle sicurezza e sulle autorizzazioni delle UDF, consulta [Sicurezza e autorizzazioni delle UDF](udf-security-and-privileges.md).
+ 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.