

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

# Creare una logica di provisioning personalizzata con risorse personalizzate
<a name="template-custom-resources"></a>

Le risorse personalizzate consentono di scrivere una logica di provisioning personalizzata nei CloudFormation modelli e di CloudFormation eseguirla ogni volta che si crea, si aggiorna (se si modifica la risorsa personalizzata) o si elimina uno stack. Ciò può essere utile quando i requisiti di provisioning coinvolgono logiche o flussi di lavoro complessi che non possono essere espressi con CloudFormation i tipi di risorse integrati.

Ad esempio, potresti voler includere risorse che non sono disponibili come tipi di CloudFormation risorse. Puoi includere tali risorse utilizzando le risorse personalizzate. In questo modo, puoi comunque gestire tutte le risorse correlate in un singolo stack.

Per definire una risorsa personalizzata nel CloudFormation modello, si utilizza il tipo di `Custom::MyCustomResourceTypeName` risorsa `AWS::CloudFormation::CustomResource` or. Le risorse personalizzate richiedono una proprietà, il token di servizio, che specifica a dove vengono CloudFormation inviate le richieste, ad esempio un argomento Amazon SNS o una funzione Lambda.

I seguenti argomenti forniscono informazioni su come utilizzare le risorse personalizzate.

**Topics**
+ [Funzionamento delle risorse personalizzate](#how-custom-resources-work)
+ [Timeout di risposta](#response-timeout)
+ [CloudFormation riferimento personalizzato alla richiesta e alla risposta delle risorse](crpg-ref.md)
+ [Risorse personalizzate supportate da Amazon SNS](template-custom-resources-sns.md)
+ [Risorse personalizzate supportate da Lambda](template-custom-resources-lambda.md)

**Nota**  
Il CloudFormation registro e le risorse personalizzate offrono ciascuno i propri vantaggi. Le risorse personalizzate offrono i seguenti vantaggi:  
Non devi registrare la risorsa.
Puoi includere un’intera risorsa come parte di un modello senza registrazione.
Supportano le operazioni `Create`, `Update` e `Delete`.
Di seguito sono elencati alcuni vantaggi delle risorse basate sul registro:  
Supporta la modellazione, il provisioning e la gestione di risorse applicative di terze parti
Supporta le operazioni `Create``Read``Update`, `Delete` e `List` (`CRUDL`)
Supporta il rilevamento della deriva su tipi di risorse private e di terze parti
A differenza delle risorse personalizzate, le risorse basate sul Registro di sistema non dovranno associare un argomento Amazon SNS o una funzione Lambda per eseguire operazioni `CRUDL`. Per ulteriori informazioni, consulta [Gestione delle estensioni con il CloudFormation registro](registry.md).

## Funzionamento delle risorse personalizzate
<a name="how-custom-resources-work"></a>

Il processo generale di configurazione di una nuova risorsa prevede i passaggi descritti di seguito. In questi passaggi sono coinvolti due ruoli: il *provider di risorse personalizzate*, proprietario della risorsa personalizzata, e lo *sviluppatore del modello*, che crea un modello contenente un tipo di risorsa personalizzata. Questi ruoli possono essere svolti dalla stessa persona; in caso contrario, il provider di risorse personalizzate deve lavorare con lo sviluppatore del modello.

1. Il provider di risorse personalizzate scrive la logica che determina come gestire le richieste CloudFormation e come eseguire azioni sulla risorsa personalizzata. 

1. Il provider di risorse personalizzato crea l'argomento Amazon SNS o la funzione Lambda a cui CloudFormation inviare richieste. L’argomento Amazon SNS o la funzione Lambda devono trovarsi nella stessa Regione in cui sarà creato lo stack.

1. Il provider di risorse personalizzate comunica l’ARN dell’argomento Amazon SNS o della funzione Lambda allo sviluppatore del modello.

1. Lo sviluppatore del modello definisce la risorsa personalizzata nel proprio CloudFormation modello. tramite un token di servizio ed eventuali parametri dei dati di input. Il token di servizio e la struttura dei dati di input sono definiti dal provider di risorse personalizzate. Il token di servizio specifica l’ARN dell’argomento Amazon SNS o della funzione Lambda ed è sempre obbligatorio, ma i dati di input sono facoltativi e dipendono dalla risorsa personalizzata.

Ora, ogni volta che qualcuno utilizza il modello per creare, aggiornare o eliminare la risorsa personalizzata, CloudFormation invia una richiesta al token di servizio specificato e quindi attende una risposta prima di procedere con l'operazione stack. 

I seguenti passaggi riassumono il flusso di creazione di uno stack dal modello: 

1. CloudFormation invia una richiesta al token di servizio specificato. La richiesta include informazioni come il tipo di richiesta e un URL del bucket Amazon S3 prefirmato, a cui la risorsa personalizzata invia le risposte. Per ulteriori informazioni sugli elementi inclusi nella richiesta, consulta [CloudFormation riferimento personalizzato alla richiesta e alla risposta delle risorse](crpg-ref.md).

   I seguenti dati di esempio mostrano cosa CloudFormation include una richiesta. `Create` In questo esempio, `ResourceProperties` consente di CloudFormation creare un payload personalizzato da inviare alla funzione Lambda.

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::TestResource",
      "LogicalResourceId" : "MyTestResource",
      "ResourceProperties" : {
         "Name" : "Value",
         "List" : [ "1", "2", "3" ]
      }
   }
   ```

1. Il provider di risorse personalizzato elabora la CloudFormation richiesta e restituisce una risposta `SUCCESS` o `FAILED` all'URL prefirmato. custom resource provider fornisce la risposta in un file in formato JSON e lo carica sull'URL S3 prefirmato. Per ulteriori informazioni, consulta [Uploading objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) nella *Amazon Simple Storage Service User Guide*.

   Nella risposta, custom resource provider può anche includere coppie nome-valore a cui template developer può accedere. Ad esempio, la risposta può includere i dati di output nel caso in cui la richiesta sia andata a buon fine o un messaggio di errore nel caso in cui la richiesta abbia avuto esito negativo. Per ulteriori informazioni sulle risposte, consulta [CloudFormation riferimento personalizzato alla richiesta e alla risposta delle risorse](crpg-ref.md).
**Importante**  
Se le coppie nome-valore contengono informazioni riservate, è necessario utilizzare il campo `NoEcho` per mascherare l'output della risorsa personalizzata. Altrimenti, i valori sono visibili attraverso i valori delle proprietà di APIs quella superficie (ad esempio`DescribeStackEvents`).  
Per ulteriori informazioni sull’utilizzo di `NoEcho` per mascherare le informazioni sensibili, consulta la best practice [Non incorporare le credenziali nei modelli](security-best-practices.md#creds).

   custom resource provider è responsabile dell'ascolto e della risposta alla richiesta. Ad esempio, per le notifiche di Amazon SNS, il provider di risorse personalizzate deve ascoltare e rispondere alle notifiche inviate a un argomento ARN specifico. CloudFormation attende e ascolta una risposta nella posizione URL prefirmata.

   I seguenti dati di esempio mostrano ciò che una risorsa personalizzata può includere in una risposta:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MyTestResource",
      "PhysicalResourceId" : "TestResource1",
      "Data" : {
         "OutputName1" : "Value1",
         "OutputName2" : "Value2",
      }
   }
   ```

1. Dopo aver ricevuto una `SUCCESS` risposta, CloudFormation procede con l'operazione stack. Se viene restituita una risposta `FAILED` o nessuna risposta, l'operazione ha esito negativo. Qualsiasi dato di output dalla risorsa personalizzata viene memorizzato nella posizione dell'URL prefirmato. Lo sviluppatore del modello può recuperare tali dati utilizzando la funzione [Fn](resources-section-structure.md#resource-properties-getatt)::. GetAtt

**Nota**  
Se lo utilizzi AWS PrivateLink, le risorse personalizzate nel VPC devono avere accesso a bucket S3 CloudFormation specifici. Le risorse personalizzate devono inviare le risposte a un Amazon S3 preregistrato. Se non possono inviare risposte ad Amazon S3, CloudFormation non riceveranno alcuna risposta e l'operazione di stack avrà esito negativo. Per ulteriori informazioni, consulta [Accesso CloudFormation tramite un endpoint di interfaccia ()AWS PrivateLink](vpc-interface-endpoints.md).

## Timeout di risposta
<a name="response-timeout"></a>

Il timeout predefinito per la risorsa personalizzata è pari a 3.600 secondi (1 ora). Se durante questo periodo non viene ricevuta alcuna risposta, l’operazione di stack ha esito negativo.

Puoi modificare il valore di timeout in base a quanto tempo prevedi sarà necessario per la risposta dalla risorsa personalizzata. Per esempio, quando esegui il provisioning di una risorsa personalizzata che invoca una funzione Lambda con un tempo di risposta previsto di cinque minuti, puoi impostare un timeout di cinque minuti nel modello di stack specificando la proprietà `ServiceTimeout`. Per ulteriori informazioni, consulta [CloudFormation riferimento personalizzato alla richiesta e alla risposta delle risorse](crpg-ref.md). In questo modo, se c'è un errore nella funzione Lambda che ne causa il blocco, l'operazione stack CloudFormation fallirà dopo cinque minuti invece di attendere l'intera ora. 

Tuttavia, fai attenzione a non impostare un valore di timeout troppo basso. Per evitare timeout imprevisti, assicurati che la risorsa personalizzata disponga di tempo sufficiente per eseguire le operazioni necessarie e restituire una risposta.

# CloudFormation riferimento personalizzato alla richiesta e alla risposta delle risorse
<a name="crpg-ref"></a>

CloudFormation gestisce le risorse personalizzate tramite un protocollo di richiesta-risposta che comunica con il fornitore di risorse personalizzato. Ogni richiesta include un tipo di richiesta (`Create``Update`, o`Delete`) e segue questo flusso di lavoro di alto livello:

1. Uno sviluppatore di modelli definisce una risorsa personalizzata con un `ServiceToken` e `ServiceTimeout` nel modello e avvia un'operazione di stack.

1. CloudFormation invia una richiesta JSON al provider di risorse personalizzato tramite SNS o Lambda.

1. Il provider di risorse personalizzato elabora la richiesta e restituisce una risposta JSON a un URL del bucket Amazon S3 predefinito prima della scadenza del periodo di timeout.

1. CloudFormation legge la risposta e procede con l'operazione stack. Se non viene ricevuta alcuna risposta prima della fine del periodo di timeout, la richiesta viene considerata non riuscita e l'operazione di stack ha esito negativo.

Per ulteriori informazioni, consulta [Funzionamento delle risorse personalizzate](template-custom-resources.md#how-custom-resources-work).

Questa sezione descrive la struttura, i parametri e le risposte previste per ogni tipo di richiesta.

**Nota**  
La dimensione totale del corpo della risposta non può superare 4096 byte.

## Configurazione del modello
<a name="crpg-ref-template-setup"></a>

Quando definisce una risorsa personalizzata in un modello, lo sviluppatore del modello utilizza [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html)le seguenti proprietà:

`ServiceToken`  
ARN dell'argomento Amazon SNS o ARN della funzione Lambda della stessa regione dello stack.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ServiceTimeout`  
Il tempo massimo, in secondi, prima del timeout di un'operazione su una risorsa personalizzata. Deve essere un valore compreso tra 1 e 3600. Impostazione predefinita: 3600 secondi (1 ora).  
*Required*: No  
▬*Tipo:* stringa

Sono supportate proprietà aggiuntive delle risorse. Le proprietà delle risorse verranno incluse come `ResourceProperties` nella richiesta. Il fornitore di risorse personalizzate deve determinare quali proprietà sono valide e i relativi valori accettabili.

## Oggetto Request
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

Quando lo sviluppatore del modello crea uno stack contenente una risorsa personalizzata, CloudFormation invia una richiesta con `RequestType` set to`Create`.

Le richieste di creazione contengono i seguenti campi:

`RequestType`  
`Create`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`RequestId`  
Un ID univoco per la richiesta.  
La combinazione di `StackId` con `RequestId` costituisce un valore che puoi utilizzare per identificare in modo univoco una richiesta in una particolare risorsa personalizzata.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`StackId`  
Il nome della risorsa Amazon (ARN) che identifica lo stack che contiene la risorsa personalizzata.  
La combinazione di `StackId` con `RequestId` costituisce un valore che puoi utilizzare per identificare in modo univoco una richiesta in una particolare risorsa personalizzata.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResponseURL`  
L'URL di risposta identifica un bucket S3 predefinito che riceve risposte dal fornitore di risorse personalizzato a. CloudFormation  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceType`  
Il tipo di risorsa scelta dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation . I nomi dei tipi di risorsa personalizzata possono contenere fino a 60 caratteri e possono includere caratteri alfanumerici, oltre ai caratteri seguenti: `_@-`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`LogicalResourceId`  
Il nome (ID logico) scelto dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation .  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceProperties`  
Questo campo contiene il contenuto dell’oggetto `Properties` inviato dallo sviluppatore del modello. I suoi contenuti vengono definiti dal provider di risorse personalizzate.  
*Obbligatorio:* no  
*Tipo*: JSON object

*Esempio*

```
{
   "RequestType" : "Create",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-create-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Update ]

Quando lo sviluppatore del modello apporta modifiche alle proprietà di una risorsa personalizzata all'interno del modello e aggiorna lo stack, CloudFormation invia una richiesta al fornitore di risorse personalizzate con set to. `RequestType` `Update` Questo significa che il codice della risorsa personalizzata non deve rilevare le modifiche nelle risorse perché sa che le proprietà sono state modificate quando il tipo di richiesta è `Update`.

Le richieste di aggiornamento contengono i seguenti campi:

`RequestType`  
`Update`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`RequestId`  
Un ID univoco per la richiesta.  
La combinazione di `StackId` con `RequestId` costituisce un valore che puoi utilizzare per identificare in modo univoco una richiesta in una particolare risorsa personalizzata.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`StackId`  
Il nome della risorsa Amazon (ARN) che identifica lo stack che contiene la risorsa personalizzata.  
La combinazione di `StackId` con `RequestId` costituisce un valore che puoi utilizzare per identificare in modo univoco una richiesta in una particolare risorsa personalizzata.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResponseURL`  
L'URL di risposta identifica un bucket S3 predefinito che riceve risposte dal provider di risorse personalizzato a. CloudFormation  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceType`  
Il tipo di risorsa scelta dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation . I nomi dei tipi di risorsa personalizzata possono contenere fino a 60 caratteri e possono includere caratteri alfanumerici, oltre ai caratteri seguenti: `_@-`. Non puoi modificare il tipo durante un aggiornamento.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`LogicalResourceId`  
Il nome (ID logico) scelto dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation .  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`PhysicalResourceId`  
Un ID fisico personalizzato definito dal provider di risorse che è unico per quel provider.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceProperties`  
Questo campo contiene il contenuto dell’oggetto `Properties` inviato dallo sviluppatore del modello. I suoi contenuti vengono definiti dal provider di risorse personalizzate.  
*Obbligatorio:* no  
*Tipo*: JSON object

`OldResourceProperties`  
Usato solo per le richieste `Update`. I valori della proprietà della risorsa dichiarati precedentemente dal template developer nel modello CloudFormation .  
*Obbligatorio:* sì  
*Tipo*: JSON object

*Esempio*

```
{
   "RequestType" : "Update",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-update-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "new-string",
      "key2" : [ "new-list" ],
      "key3" : { "key4" : "new-map" }
   },
   "OldResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Delete ]

Quando lo sviluppatore del modello elimina lo stack o rimuove la risorsa personalizzata dal modello e quindi aggiorna lo stack, CloudFormation invia una richiesta con set to. `RequestType` `Delete`

Le richieste di eliminazione contengono i seguenti campi:

`RequestType`  
`Delete`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`RequestId`  
Un ID univoco per la richiesta.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`StackId`  
Il nome della risorsa Amazon (ARN) che identifica lo stack che contiene la risorsa personalizzata.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResponseURL`  
L'URL di risposta identifica un bucket S3 predefinito che riceve risposte dal provider di risorse personalizzato a. CloudFormation  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceType`  
Il tipo di risorsa scelta dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation . I nomi dei tipi di risorsa personalizzata possono contenere fino a 60 caratteri e possono includere caratteri alfanumerici, oltre ai caratteri seguenti: `_@-`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`LogicalResourceId`  
Il nome (ID logico) scelto dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation .  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`PhysicalResourceId`  
Un ID fisico personalizzato definito dal provider di risorse che è unico per quel provider.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`ResourceProperties`  
Questo campo contiene il contenuto dell’oggetto `Properties` inviato dallo sviluppatore del modello. I suoi contenuti vengono definiti dal provider di risorse personalizzate.  
*Obbligatorio:* no  
*Tipo*: JSON object

*Esempio*

```
{
   "RequestType" : "Delete",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-delete-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------

## Oggetto Response
<a name="crpg-ref-responses"></a>

Il provider di risorse personalizzato invia una risposta all'URL prefirmato per tutti i tipi di richiesta. Se il provider di risorse personalizzato non invia una risposta, CloudFormation attende il timeout dell'operazione.

La risposta deve essere un oggetto JSON con i seguenti campi:

`Status`  
Deve essere `SUCCESS` o `FAILED`.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`RequestId`  
Un ID univoco per la richiesta. Copia questo valore esattamente come appare nella richiesta.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`StackId`  
Il nome della risorsa Amazon (ARN) che identifica lo stack che contiene la risorsa personalizzata. Copia questo valore esattamente come appare nella richiesta.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`LogicalResourceId`  
Il nome (ID logico) scelto dallo sviluppatore del modello della risorsa personalizzata nel modello CloudFormation . Copia questo valore esattamente come appare nella richiesta.  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`PhysicalResourceId`  
Questo valore deve essere un identificativo univoco per il fornitore di risorse personalizzate e può avere una dimensione massima di 1 KB. Il valore deve essere una stringa non vuota e deve essere identico per tutte le risposte per la stessa risorsa.  
Quando si aggiornano risorse personalizzate, il valore restituito per `PhysicalResourceId` determina il comportamento di aggiornamento. Se il valore rimane lo stesso, lo CloudFormation considera un aggiornamento normale. Se il valore cambia, CloudFormation interpreta l'aggiornamento come sostitutivo e invia una richiesta di eliminazione alla vecchia risorsa. Per ulteriori informazioni, consulta [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).  
*Obbligatorio:* sì  
▬*Tipo:* stringa

`Reason`  
Descrive il motivo di una risposta con esito negativo.  
Necessario se `Status` è `FAILED`. Altrimenti, è facoltativo.  
*Required*: Conditional  
▬*Tipo:* stringa

`NoEcho`  
Indica se nascondere o meno l’output della risorsa personalizzata quando viene recuperata utilizzando la funzione `Fn::GetAtt`. Se impostato su `true`, tutti i valori restituiti vengono nascosti con degli asterischi (\$1\$1\$1\$1\$1), *ad eccezione di quelli archiviati nella sezione del modello `Metadata`*. CloudFormation non trasforma, modifica o omette le informazioni incluse nella sezione `Metadata`. Il valore predefinito è `false`.  
Per ulteriori informazioni sull’utilizzo di `NoEcho` per mascherare le informazioni sensibili, consulta la best practice [Non incorporare le credenziali nei modelli](security-best-practices.md#creds).  
Disponibile solo per `Update` risposte `Create` e risposte. Non è supportata per `Delete` le risposte.  
*Obbligatorio:* no  
*Tipo*: Booleano

`Data`  
Le coppie nome-valore definite dal provider di risorse personalizzate da inviare con la risposta. Puoi accedere ai valori forniti qui in base al nome nel modello con `Fn::GetAtt`.  
Disponibile solo per `Update` risposte `Create` e risposte. Non è supportata per `Delete` le risposte.  
Se le coppie nome-valore contengono informazioni riservate, è necessario utilizzare il campo `NoEcho` per mascherare l’output della risorsa personalizzata. Altrimenti, i valori sono visibili attraverso i valori delle proprietà di APIs quella superficie (ad esempio`DescribeStackEvents`).
*Obbligatorio:* no  
*Tipo*: JSON object

### Esempi di risposte di successo
<a name="crpg-ref-success-response-examples"></a>

#### `Create`e `Update` risposta
<a name="crpg-ref-success-response-example-1"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id",
   "NoEcho": true,
   "Data": {
      "key1": "value1",
      "key2": "value2"
   }
}
```

#### Risposta `Delete`
<a name="crpg-ref-success-response-example-2"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id"
}
```

### Esempio di risposta fallita
<a name="crpg-ref-failed-response-example"></a>

```
{
   "Status": "FAILED",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id",
   "PhysicalResourceId": "provider-defined-physical-id",
   "Reason": "Required failure reason string"
}
```

# Risorse personalizzate supportate da Amazon SNS
<a name="template-custom-resources-sns"></a>

L'argomento seguente mostra come configurare una risorsa personalizzata con un token di servizio che specifica l'argomento Amazon SNS a CloudFormation cui inviare le richieste. Troverai anche informazioni sulla sequenza di eventi e messaggi inviati e ricevuti come conseguenza della creazione, dell’aggiornamento e dell’eliminazione di uno stack di risorse personalizzato.

Con le risorse personalizzate e Amazon SNS, puoi abilitare scenari quali l'aggiunta di nuove risorse a uno stack e l'inserimento di dati dinamici in uno stack. Ad esempio, quando crei uno stack, CloudFormation puoi inviare una `Create` richiesta a un argomento monitorato da un'applicazione in esecuzione su un'istanza Amazon EC2. La notifica Amazon SNS abilita le attività di provisioning aggiuntive nell'applicazione, come il recupero di un pool di indirizzi IP elastici consentiti. Al termine, l'applicazione invia una risposta (e tutti i dati di output) che notifica di CloudFormation procedere con l'operazione dello stack.

Quando specifichi un argomento Amazon SNS come destinazione di una risorsa personalizzata, CloudFormation invia messaggi all'argomento SNS specificato durante le operazioni di stack che coinvolgono la risorsa personalizzata. Per elaborare questi messaggi ed eseguire le operazioni necessarie, devi disporre di un endpoint supportato sottoscritto all’argomento SNS.

Per un’introduzione alle risorse personalizzate e al loro funzionamento, consulta [Funzionamento delle risorse personalizzate](template-custom-resources.md#how-custom-resources-work). Per ulteriori informazioni su Amazon SNS e su come funziona, consulta [Amazon Simple Notification Service Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/).

## Utilizzo di Amazon SNS per creare risorse personalizzate
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [Fase 1: creazione dello stack](#crpg-walkthrough-stack-creation)
+ [Fase 2: aggiornamenti degli stack](#crpg-walkthrough-stack-updates)
+ [Fase 3: eliminazione dello stack](#crpg-walkthrough-stack-deletion)

### Fase 1: creazione dello stack
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>Lo sviluppatore del modello crea uno CloudFormation stack che contiene una risorsa personalizzata. 

   Nell’esempio di modello riportato di seguito, viene utilizzato il nome `Custom::SeleniumTester` del tipo di risorsa personalizzato per la risorsa personalizzata con ID logico `MySeleniumTest`. I nomi dei tipi di risorse personalizzati devono essere alfanumerici e possono avere una lunghezza massima di 60 caratteri. 

   Il tipo di risorsa personalizzato viene dichiarato con un token di servizio, proprietà opzionali specifiche del provider e GetAtt attributi facoltativi [Fn::](resources-section-structure.md#resource-properties-getatt) definiti dal provider di risorse personalizzato. Queste proprietà e questi attributi possono essere utilizzati per trasmettere le informazioni da template developer a custom resource provider e viceversa. Il token di servizio specifica un argomento di Amazon SNS configurato dal provider di risorse.

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```
**Nota**  
I nomi e i valori dei dati a cui si accede con `Fn::GetAtt` vengono restituiti dal provider di risorse personalizzate durante la risposta del provider a. CloudFormation Se custom resource provider è una terza parte, template developer deve ottenere i nomi dei valori restituiti da custom resource provider.

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>CloudFormation invia una notifica Amazon SNS al provider di risorse con una `"RequestType" : "Create"` che contiene informazioni sullo stack, le proprietà personalizzate delle risorse dal modello di stack e un URL S3 per la risposta.

   L'argomento SNS che viene utilizzato per inviare la notifica è compreso nel modello della proprietà `ServiceToken`. Per evitare l'utilizzo di un valore hardcoded, un template developer può utilizzare un parametro del modello in modo che il valore venga inserito all'avvio dello stack.

   Nel seguente esempio viene mostrata una richiesta `Create` della risorsa personalizzata contenente un nome di tipo risorsa personalizzato, `Custom::SeleniumTester`, creata con `LogicalResourceId` di `MySeleniumTester`:

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Per informazioni dettagliate sull’oggetto di richiesta per le richieste `Create`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>Il custom resource provider elabora i dati inviati dallo template developer e determina se la richiesta `Create` è andata a buon fine. Il provider di risorse utilizza quindi l'URL S3 inviato da CloudFormation per inviare una risposta di o. `SUCCESS` `FAILED`

   A seconda del tipo di risposta, possono essere visualizzati diversi campi in CloudFormation. Per informazioni sui campi di risposta per un particolare tipo di richiesta, consulta la documentazione relativa a quel tipo di richiesta nella sezione [Riferimento alla richiesta e alla risposta](crpg-ref.md).

   In risposta a una richiesta di creazione o aggiornamento, il provider di risorse personalizzate può restituire elementi di dati nel campo `Data` della risposta. Queste sono coppie nome/valore e i *nomi* corrispondono agli attributi `Fn::GetAtt` utilizzati con la risorsa personalizzata nel modello di stack. I *valori* sono i dati che vengono restituiti quando il template developer chiama `Fn::GetAtt` nella risorsa con il nome attributo.

   Di seguito è riportato un esempio di risposta della risorsa personalizzata:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "Data" : {
         "resultsPage" : "http://www.myexampledomain/test-results/guid",
         "lastUpdate" : "2012-11-14T03:30Z"
      }
   }
   ```

   Per informazioni dettagliate sull’oggetto della risposta per le richieste `Create`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

   Nei campi `StackId`, `RequestId` e `LogicalResourceId` il testo della richiesta deve essere copiato parola per parola.

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> CloudFormation dichiara lo stato dello stack come o. `CREATE_COMPLETE` `CREATE_FAILED` Se lo stack è stato creato con successo, lo sviluppatore del modello può utilizzare i valori di output della risorsa personalizzata creata accedendovi con [Fn](resources-section-structure.md#resource-properties-getatt)::. GetAtt

   Ad esempio, il modello di risorsa personalizzata utilizzato per illustrazione usa `Fn::GetAtt` per copiare gli output delle risorse nell'output dello stack:

   ```
   "Outputs" : {
      "topItem" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
      },
      "numRespondents" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
      }
   }
   ```

### Fase 2: aggiornamenti degli stack
<a name="crpg-walkthrough-stack-updates"></a>

Per aggiornare uno stack esistente, devi inviare un modello che specifichi gli aggiornamenti per le proprietà delle risorse dello stack, come illustrato nell'esempio seguente. CloudFormation aggiorna solo le risorse che hanno modifiche specificate nel modello. Per ulteriori informazioni, consulta [Comprendere l’aggiornamento dei comportamenti delle risorse stack](using-cfn-updating-stacks-update-behaviors.md).

Puoi aggiornare le risorse personalizzate che richiedono una sostituzione della risorsa fisica sottostante. Quando aggiorni una risorsa personalizzata in un CloudFormation modello, CloudFormation invia una richiesta di aggiornamento a quella risorsa personalizzata. Se una risorsa personalizzata richiede una sostituzione, la nuova risorsa personalizzata deve inviare una risposta con il nuovo ID fisico. Quando CloudFormation riceve la risposta, confronta il valore di `PhysicalResourceId` della vecchia e della nuova risorsa personalizzata. Se sono diversi, CloudFormation riconosce l'aggiornamento come sostitutivo e invia una richiesta di eliminazione alla vecchia risorsa, come mostrato in[Fase 3: eliminazione dello stack](#crpg-walkthrough-stack-deletion).

**Nota**  
Se non hai apportato modifiche alla risorsa personalizzata, CloudFormation non le invierà richieste durante un aggiornamento dello stack.

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>Il template developer avvia un aggiornamento dello stack contenente una risorsa personalizzata. Durante l'esecuzione di un aggiornamento, lo template developer può specificare nuove proprietà nel modello di stack.

   Di seguito è disponibile un esempio di `Update` del modello di stack tramite un tipo di risorsa personalizzata:

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
                  "http://mynewsite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```

1. <a name="crpg-walkthrough-stack-updates-provider-request"></a>CloudFormation invia una notifica Amazon SNS al provider di risorse con una `"RequestType" : "Update"` che contiene informazioni simili alla `Create` chiamata, tranne per il fatto che il `OldResourceProperties` campo contiene le vecchie proprietà della risorsa e ResourceProperties contiene le proprietà delle risorse aggiornate (se presenti).

   Di seguito è riportato un esempio di richiesta `Update`:

   ```
   {
      "RequestType" : "Update",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      },
      "OldResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Per informazioni dettagliate sull’oggetto di richiesta per le richieste `Update`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>Il provider di risorse personalizzate elabora i dati inviati da CloudFormation. La risorsa personalizzata esegue l'aggiornamento e invia una risposta `SUCCESS` o `FAILED` all'URL S3. CloudFormation quindi confronta le `PhysicalResourceIDs` vecchie e nuove risorse personalizzate. Se sono diverse, CloudFormation riconosce che l'aggiornamento richiede una sostituzione e invia una richiesta di eliminazione alla vecchia risorsa. L'esempio seguente mostra la risposta di un custom resource provider a una richiesta `Update`.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester2"
   }
   ```

   Per informazioni dettagliate sull’oggetto della risposta per le richieste `Update`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

   Nei campi `StackId`, `RequestId` e `LogicalResourceId` il testo della richiesta deve essere copiato parola per parola.

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>CloudFormation dichiara lo stato dello stack come o. `UPDATE_COMPLETE` `UPDATE_FAILED` Se l'aggiornamento ha esito negativo, viene eseguito il rollback dello stack. Se lo stack è stato aggiornato senza errori, il template developer può accedere ai nuovi valori di output delle risorse personalizzate create con `Fn::GetAtt`.

### Fase 3: eliminazione dello stack
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>Il template developer elimina un aggiornamento dello stack contenente una risorsa personalizzata. CloudFormation ottiene le proprietà attuali specificate nel modello dello stack insieme all'argomento SNS e si prepara per effettuare una richiesta al provider di risorse personalizzate.

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>CloudFormation invia una notifica Amazon SNS al provider di risorse con una `"RequestType" : "Delete"` che contiene informazioni correnti sullo stack, le proprietà personalizzate delle risorse dal modello di stack e un URL S3 per la risposta.

   Ogni volta che elimini uno stack o effettui un aggiornamento che rimuove o sostituisce la risorsa personalizzata, CloudFormation confronta le risorse personalizzate vecchie e nuove`PhysicalResourceId`. Se sono diverse, CloudFormation riconosce l'aggiornamento come sostituto e invia una richiesta di eliminazione per la vecchia risorsa (`OldPhysicalResource`), come illustrato nell'esempio seguente di richiesta. `Delete`

   ```
   {
      "RequestType" : "Delete",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      }
   }
   ```

   Per informazioni dettagliate sull’oggetto di richiesta per le richieste `Delete`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

   `DescribeStackResource`, `DescribeStackResources`e `ListStackResources` mostrano il nome definito dall'utente se è stato specificato.

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>Il provider di risorse personalizzate elabora i dati inviati da CloudFormation e determina se la `Delete` richiesta ha avuto esito positivo. Il provider di risorse utilizza quindi l'URL S3 inviato da CloudFormation per inviare una risposta di uno `SUCCESS` o`FAILED`. Per eliminare uno stack con una risorsa personalizzata, il custom resource provider deve rispondere a una richiesta di eliminazione.

   Nel seguente esempio viene mostrata la risposta di un custom resource provider a una richiesta `Delete`:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1"
   }
   ```

   Per informazioni dettagliate sull’oggetto della risposta per le richieste `Delete`, consulta l’argomento [Riferimento alla richiesta e alla risposta](crpg-ref.md).

   Nei campi `StackId`, `RequestId` e `LogicalResourceId` il testo della richiesta deve essere copiato parola per parola.

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>CloudFormation dichiara lo stato dello stack come o. `DELETE_COMPLETE` `DELETE_FAILED`

# Risorse personalizzate supportate da Lambda
<a name="template-custom-resources-lambda"></a>

Quando associ una funzione Lambda a una risorsa personalizzata, la funzione viene richiamata ogni volta che la risorsa personalizzata viene creata, aggiornata o eliminata. CloudFormation chiama un'API Lambda per richiamare la funzione e per trasmettere tutti i dati della richiesta (ad esempio il tipo di richiesta e le proprietà delle risorse) alla funzione. La potenza e la personalizzazione delle funzioni Lambda, combinate con, CloudFormation consentono un'ampia gamma di scenari, come la ricerca dinamica delle IDs AMI durante la creazione dello stack o l'implementazione e l'utilizzo di funzioni di utilità, come le funzioni di inversione delle stringhe.

Per un’introduzione alle risorse personalizzate e al loro funzionamento, consulta [Funzionamento delle risorse personalizzate](template-custom-resources.md#how-custom-resources-work).

**Topics**
+ [Procedura guidata: crea un meccanismo di ritardo con una risorsa personalizzata supportata da Lambda](walkthrough-lambda-backed-custom-resources.md)
+ [Modulo `cfn-response`](cfn-lambda-function-code-cfnresponsemodule.md)

# Procedura guidata: crea un meccanismo di ritardo con una risorsa personalizzata supportata da Lambda
<a name="walkthrough-lambda-backed-custom-resources"></a>

Questa procedura dettagliata mostra come configurare e avviare una risorsa personalizzata supportata da Lambda utilizzando un modello di esempio. CloudFormation Questo modello crea un meccanismo di ritardo che sospende le implementazioni di stack per un tempo specificato. Questa operazione può essere utile quando devi introdurre ritardi intenzionali durante il provisioning delle risorse, ad esempio quando aspetti che le risorse si stabilizzino prima di creare risorse dipendenti.

**Nota**  
Sebbene in precedenza le risorse personalizzate supportate da Lambda fossero consigliate per il recupero dell'AMI IDs, ora consigliamo di utilizzare i parametri. AWS Systems Manager Questo approccio rende i modelli più riutilizzabili e più facili da mantenere. Per ulteriori informazioni, consulta [Ottenimento di un valore in testo normale da Systems Manager Parameter Store](dynamic-references-ssm.md). 

**Topics**
+ [Panoramica di](#walkthrough-lambda-backed-custom-resources-overview)
+ [Modello di esempio](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [Procedura guidata per il modello di esempio](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [Prerequisiti](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [Avviare lo stack](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [Pulizia delle risorse](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [Informazioni correlate](#w2aac11c45b9c24b9c23)

## Panoramica di
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

Il modello di stack di esempio utilizzato in questa procedura guidata crea una risorsa personalizzata supportata da Lambda che introduce un ritardo configurabile (60 secondi per impostazione predefinita) durante la creazione dello stack. Il ritardo si verifica durante gli aggiornamenti dello stack solo quando vengono modificate le proprietà della risorsa personalizzata.

Il modello esegue il provisioning delle seguenti risorse:
+ Una risorsa personalizzata.
+ Una funzione Lambda.
+ un ruolo IAM che consente a Lambda di scrivere i log. CloudWatch

Definisce inoltre due output:
+ Il tempo effettivo di attesa della funzione.
+ Un identificativo univoco generato durante ogni esecuzione della funzione Lambda.



**Nota**  
CloudFormation è un servizio gratuito, ma Lambda addebita in base al numero di richieste per le funzioni e al tempo di esecuzione del codice. Per ulteriori informazioni sui prezzi di Lambda, consulta la pagina [Prezzi di AWS Lambda](https://aws.amazon.com/lambda/pricing/).

## Modello di esempio
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

Puoi consultare di seguito il modello di esempio della risorsa personalizzata supportata da Lambda con il meccanismo di ritardo:

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-yaml"></a>

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
```

## Procedura guidata per il modello di esempio
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

I seguenti frammenti spiegano le parti rilevanti del modello di esempio per aiutarti a comprendere come la funzione Lambda viene associata a una risorsa personalizzata e il relativo output.

[AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)risorsa `CFNWaiter`  
La risorsa `AWS::Lambda::Function` specifica il codice sorgente, il nome del gestore, l’ambiente di runtime e il nome della risorsa Amazon (ARN) del ruolo di esecuzione della funzione.  
La proprietà `Handler` è impostata su `index.handler` poiché utilizza un codice sorgente Python. [Per ulteriori informazioni sugli identificatori dei gestori accettati quando si utilizzano codici sorgente di funzioni in linea, vedere Code. AWS::Lambda::Function ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile)  
Il `Runtime` è specificato come `python3.9` poiché il file di origine è un codice Python.  
Il `Timeout` è impostato su 900 secondi.  
La proprietà `Role` utilizza la funzione `Fn::GetAtt` per ottenere l’ARN del ruolo di esecuzione `LambdaExecutionRole` dichiarato nella risorsa `AWS::IAM::Role` all’interno del modello.  
La proprietà `Code` definisce il codice di funzione in linea utilizzando una funzione Python. La funzione Python nel modello di esempio esegue le seguenti operazioni:  
+ Crea un ID univoco utilizzando l’UUID.
+ Verifica se la richiesta è di creazione o aggiornamento.
+ Entra in sospensione per il tempo specificato in `ServiceTimeout` durante le richieste `Create` o `Update`.
+ Restituisce il tempo di attesa e l’ID univoco.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-json"></a>

```
...
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-yaml"></a>

```
...
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
...
```

[AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)risorsa `LambdaExecutionRole`  
La risorsa `AWS::IAM:Role` crea un ruolo di esecuzione per la funzione Lambda, che include una policy di assunzione del ruolo che consente a Lambda di utilizzarlo. Contiene anche una politica che consente l'accesso ai CloudWatch registri.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-json"></a>

```
...
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-yaml"></a>

```
...
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
...
```

[AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)risorsa `CFNWaiterCustomResource`  
La risorsa personalizzata si collega alla funzione Lambda con il relativo ARN utilizzando `!GetAtt CFNWaiter.Arn`. Implementerà un tempo di attesa di 60 secondi per le operazioni di creazione e aggiornamento, come impostato in `ServiceTimeout`. La risorsa verrà invocata per un’operazione di aggiornamento solo se le proprietà vengono modificate.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-json"></a>

```
...
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-yaml"></a>

```
...
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
...
```

`Outputs`  
Gli `Outputs` di questo modello sono `TimeWaited` e `WaiterId`. Il valore `TimeWaited` usa una funzione `Fn::GetAtt` per fornire la quantità di tempo in cui la risorsa waiter ha effettivamente atteso. Il `WaiterId` usa una funzione `Fn::GetAtt` per fornire l’ID univoco generato e associato all’esecuzione.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-json"></a>

```
...
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-yaml"></a>

```
...
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
...
```

## Prerequisiti
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

È necessario disporre delle autorizzazioni IAM per utilizzare tutti i servizi corrispondenti, come CloudFormation Lambda e.

## Avviare lo stack
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**Per creare lo stack**

1. Trova il modello che preferisci (YAML o JSON) dalla sezione [Modello di esempio](#walkthrough-lambda-backed-custom-resources-sample-template) e salvalo sul computer con il nome `samplelambdabackedcustomresource.template`.

1. Apri la CloudFormation console all'indirizzo. [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/)

1. Dalla pagina **Stack**, scegli **Crea stack** in alto a destra, poi scegli **Con nuove risorse (standard)**.

1. In **Prerequisito - Prepara modello**, seleziona **Scegli un modello esistente**.

1. In **Specifica modello**, scegli **Carica un file di modello**, poi seleziona **Scegli file**.

1. Seleziona il file di modello `samplelambdabackedcustomresource.template` salvato in precedenza.

1. Scegli **Next (Successivo)**.

1. In **Nome stack**, digita **SampleCustomResourceStack** e scegli **Avanti**.

1. Per questa procedura guidata, non è necessario aggiungere tag o specificare impostazioni avanzate, quindi selezionare **Next (Avanti)**.

1. Assicurati che il nome dello stack sia corretto, quindi seleziona **Crea**.

La creazione dello stack potrebbe richiedere alcuni minuti. CloudFormation È possibile controllare l’avanzamento negli eventi per lo stack. Per ulteriori informazioni, consulta [Visualizza le informazioni sullo stack dalla console CloudFormation](cfn-console-view-stack-data-resources.md).

Se la creazione dello stack avviene correttamente, vengono create tutte le risorse nello stack, come la funzione Lambda e la risorsa personalizzata. Hai utilizzato correttamente una funzione Lambda e una risorsa personalizzata.

[Se la funzione Lambda restituisce un errore, visualizza i log della funzione nella CloudWatch console Logs.](https://console.aws.amazon.com/cloudwatch/home#logs:) Il nome del flusso di log è l'ID fisico della risorsa personalizzata, che puoi trovare visualizzando le risorse dello stack. Per ulteriori informazioni, consulta [Visualizza i dati di log](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData) nella *Amazon CloudWatch User Guide*.

## Pulizia delle risorse
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

Elimina lo stack per cancellare tutte le risorse dello stack create in modo da non pagare per le risorse superflue.

**Per eliminare lo stack**

1. Dalla CloudFormation console, scegli lo **SampleCustomResourceStack**stack.

1. Scegliere **Actions (Operazioni)** e poi **Delete Stack (Elimina stack)**.

1. Nel messaggio di conferma, scegliere **Yes, Delete (Sì, elimina)**.

Tutte le risorse create vengono eliminate.

Ora che sai come creare e utilizzare una risorsa personalizzata supportata da Lambda, puoi usare il modello e il codice di esempio di questa procedura guidata per creare e sperimentare con altri stack e altre funzioni.

## Informazioni correlate
<a name="w2aac11c45b9c24b9c23"></a>
+ [CloudFormation Riferimento a risorse personalizzate](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# Modulo `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

Nel CloudFormation modello, puoi specificare una funzione Lambda come destinazione di una risorsa personalizzata. Quando utilizzi la proprietà `ZipFile` per specificare il codice sorgente della [funzione](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html), puoi caricare il modulo `cfn-response` per inviare le risposte dalla funzione Lambda a una risorsa personalizzata. Il modulo `cfn-response` è una libreria che semplifica l’invio di risposte alla risorsa personalizzata che ha invocato la funzione Lambda. Il modulo ha un metodo `send` che invia un [oggetto di risposta](crpg-ref.md#crpg-ref-responses) a una risorsa personalizzata mediante un URL prefirmato Amazon S3 (`ResponseURL`).

Il modulo `cfn-response` è disponibile solo quando si utilizza la proprietà `ZipFile` per scrivere il codice d’origine. Il modulo non è disponibile per il codice di origine archiviato in bucket Amazon S3. Per il codice nei bucket, è necessario scrivere funzioni proprie per inviare le risposte.

**Nota**  
Dopo l’esecuzione del metodo `send`, la funzione Lambda termina, perciò tutto quello che si scrive dopo quel metodo verrà ignorato.

## Caricamento del modulo `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Per le funzioni Node.js, utilizza la funzione `require()` per caricare il modulo `cfn-response`. Ad esempio, il seguente esempio di codice crea un oggetto `cfn-response` con il nome `response`:

```
var response = require('cfn-response');
```

Per Python, utilizza l’istruzione `import` per caricare il modulo `cfnresponse`, come mostrato nel seguente esempio:

**Nota**  
Utilizzare questa istruzione di importazione esatta. Se si utilizzano altre varianti di istruzione di importazione, CloudFormation non include il modulo di risposta.

```
import cfnresponse
```

## Parametri del metodo `send`
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Si possono utilizzare i seguenti parametri con il metodo `send`:

`event`  
I campi in una [richiesta di risorse personalizzata](crpg-ref.md#crpg-ref-requesttypes).

`context`  
Un oggetto, specifico per le funzioni Lambda, che è possibile utilizzare per specificare quando la funzione e qualsiasi callback hanno completato l’esecuzione o per accedere alle informazioni dall’interno dell’ambiente di esecuzione Lambda. Per ulteriori informazioni, consulta [Building Lambda functions with Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) nella *Guida per gli sviluppatori di AWS Lambda *.

`responseStatus`  
Se la funzione è stata completata. Utilizza le costanti del modulo `cfnresponse` per specificare lo stato: `SUCCESS` per esecuzioni di successo e `FAILED` per esecuzioni non riuscite.

`responseData`  
Il campo `Data` di un [oggetto di risposta](crpg-ref.md#crpg-ref-responses) della risorsa personalizzata. I dati corrispondono a un elenco di coppie nome-valore.

`physicalResourceId`  
Opzionale. L’ID univoco della risorsa personalizzata che ha invocato la funzione. Per impostazione predefinita, il modulo utilizza il nome del flusso di log di Amazon CloudWatch Logs associato alla funzione Lambda.  
Il valore restituito per un `PhysicalResourceId` può modificare le operazioni personalizzate di aggiornamento delle risorse. Se il valore restituito è lo stesso, viene considerato un aggiornamento normale. Se il valore restituito è diverso, CloudFormation riconosce l'aggiornamento come sostituto e invia una richiesta di eliminazione alla vecchia risorsa. Per ulteriori informazioni, consulta [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`noEcho`  
Opzionale. Indica se nascondere o meno l’output della risorsa personalizzata quando viene recuperata utilizzando la funzione `Fn::GetAtt`. Se impostato su `true`, tutti i valori restituiti vengono mascherati con asterischi (\$1\$1\$1\$1\$1), ad eccezione delle informazioni archiviate nelle posizioni specificate di seguito. Di default, il valore è `false`.  
L’utilizzo dell’attributo `NoEcho` non maschera le informazioni memorizzate nei seguenti elementi:  
+ La sezione dei `Metadata` modelli. CloudFormation non trasforma, modifica o oscura le informazioni incluse nella `Metadata` sezione. Per ulteriori informazioni, vedere [Metadati](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Sezione dei modelli `Outputs`. Per ulteriori informazioni, consulta [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ Attributo `Metadata` di una definizione di risorsa. Per ulteriori informazioni, consulta [Attributo `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Si consiglia vivamente di non utilizzare questi meccanismi per includere informazioni sensibili, come password o segreti.
Per ulteriori informazioni sull’utilizzo di `NoEcho` per mascherare le informazioni sensibili, consulta la best practice [Non incorporare le credenziali nei modelli](security-best-practices.md#creds).

## Esempi
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

In questo esempio Node.js, la funzione in linea Lambda utilizza un valore di input e lo moltiplica per 5. Le funzioni in linea sono particolarmente utili per le funzioni più piccole perché consentono di specificare il codice di origine direttamente nel modello, invece di creare un pacchetto e caricarlo in un bucket Amazon S3. La funzione utilizza il metodo `cfn-response` `send` per inviare il risultato alla risorsa personalizzata che la richiama.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"ZipFile": { "Fn::Join": ["", [
  "var response = require('cfn-response');",
  "exports.handler = function(event, context) {",
  "  var input = parseInt(event.ResourceProperties.Input);",
  "  var responseData = {Value: input * 5};",
  "  response.send(event, context, response.SUCCESS, responseData);",
  "};"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
ZipFile: >
  var response = require('cfn-response');
  exports.handler = function(event, context) {
    var input = parseInt(event.ResourceProperties.Input);
    var responseData = {Value: input * 5};
    response.send(event, context, response.SUCCESS, responseData);
  };
```

### Python
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

In questo esempio Python, la funzione inline Lambda utilizza un valore intero e lo moltiplica per 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"ZipFile" : { "Fn::Join" : ["\n", [
  "import json",
  "import cfnresponse",
  "def handler(event, context):",
  "   responseValue = int(event['ResourceProperties']['Input']) * 5",
  "   responseData = {}",
  "   responseData['Data'] = responseValue",
  "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
ZipFile: |
  import json
  import cfnresponse
  def handler(event, context):
    responseValue = int(event['ResourceProperties']['Input']) * 5
    responseData = {}
    responseData['Data'] = responseValue
    cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
```

## Codice di origine del modulo
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Codice sorgente asincrono di Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Codice sorgente Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Codice sorgente Python](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Codice sorgente asincrono di Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

Il seguente è il codice sorgente del modulo di risposta per le funzioni Node.js se il gestore è asincrono. Esaminarlo per comprendere ciò che il modulo fa e per facilitare l’implementazione di funzioni di risposta personalizzate.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    return new Promise((resolve, reject) => {
        var responseBody = JSON.stringify({
            Status: responseStatus,
            Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
            PhysicalResourceId: physicalResourceId || context.logStreamName,
            StackId: event.StackId,
            RequestId: event.RequestId,
            LogicalResourceId: event.LogicalResourceId,
            NoEcho: noEcho || false,
            Data: responseData
        });

        console.log("Response body:\n", responseBody);

        var https = require("https");
        var url = require("url");

        var parsedUrl = url.parse(event.ResponseURL);
        var options = {
            hostname: parsedUrl.hostname,
            port: 443,
            path: parsedUrl.path,
            method: "PUT",
            headers: {
                "content-type": "",
                "content-length": responseBody.length
            }
        };

        var request = https.request(options, function(response) {
            console.log("Status code: " + parseInt(response.statusCode));
            resolve(context.done());
        });

        request.on("error", function(error) {
            console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
            reject(context.done(error));
        });

        request.write(responseBody);
        request.end();
    })
}
 
function maskCredentialsAndSignature(message) {
    return message.replace(/X-Amz-Credential=[^&\s]+/i, 'X-Amz-Credential=*****')
        .replace(/X-Amz-Signature=[^&\s]+/i, 'X-Amz-Signature=*****');
}
```

### Codice sorgente Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

Il seguente è il codice sorgente del modulo di risposta per le funzioni Node.js se il gestore non è asincrono. Esaminarlo per comprendere ciò che il modulo fa e per facilitare l’implementazione di funzioni di risposta personalizzate.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
 
exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    var responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
        PhysicalResourceId: physicalResourceId || context.logStreamName,
        StackId: event.StackId,
        RequestId: event.RequestId,
        LogicalResourceId: event.LogicalResourceId,
        NoEcho: noEcho || false,
        Data: responseData
    });

    console.log("Response body:\n", responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
        hostname: parsedUrl.hostname,
        port: 443,
        path: parsedUrl.path,
        method: "PUT",
        headers: {
            "content-type": "",
            "content-length": responseBody.length
        }
    };

    var request = https.request(options, function(response) {
        console.log("Status code: " + parseInt(response.statusCode));
        context.done();
    });

    request.on("error", function(error) {
        console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
        context.done();
    });

    request.write(responseBody);
    request.end();
}
```

### Codice sorgente Python
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Il seguente è il codice sorgente del modulo di risposta per le funzioni Python:

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
 
from __future__ import print_function
import urllib3
import json
import re

SUCCESS = "SUCCESS"
FAILED = "FAILED"

http = urllib3.PoolManager()


def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']

    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }

    json_responseBody = json.dumps(responseBody)

    print("Response body:")
    print(json_responseBody)

    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }

    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)


    except Exception as e:

        print("send(..) failed executing http.request(..):", mask_credentials_and_signature(e))
 
 
def mask_credentials_and_signature(message):
    message = re.sub(r'X-Amz-Credential=[^&\s]+', 'X-Amz-Credential=*****', message, flags=re.IGNORECASE)
    return re.sub(r'X-Amz-Signature=[^&\s]+', 'X-Amz-Signature=*****', message, flags=re.IGNORECASE)
```