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à.
Modulo cfn-response
Nel CloudFormation modello, puoi specificare una funzione Lambda come destinazione di una risorsa personalizzata. Quando si utilizza la ZipFile
proprietà per specificare il codice sorgente della funzione, è possibile caricare il cfn-response
modulo per inviare risposte dalla funzione Lambda a una risorsa personalizzata. Il cfn-response
modulo è una libreria che semplifica l'invio di risposte alla risorsa personalizzata che ha richiamato la funzione Lambda. Il modulo ha un send
metodo che invia un oggetto di risposta a una risorsa personalizzata tramite un Amazon S3 prefirmato URL (the). 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
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 utilizzi altre varianti dell'istruzione di importazione, CloudFormation non include il modulo di risposta.
import cfnresponse
Parametri del metodo send
Si possono utilizzare i seguenti parametri con il metodo send
:
event
-
I campi in una richiesta di risorse personalizzata.
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 Modello di programmazione (Node.js) 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 eFAILED
per esecuzioni non riuscite. responseData
-
Il campo
Data
di un oggetto di risposta della risorsa personalizzata. I dati corrispondono a un elenco di coppie nome-valore. physicalResourceId
-
Facoltativo. L'ID univoco della risorssa 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, consultaAWS::CloudFormation::CustomResource
. noEcho
-
Facoltativo. Indica se nascondere o meno l'output della risorsa personalizzata quando viene recuperata utilizzando la funzione
Fn::GetAtt
. Se impostato sutrue
, tutti i valori restituiti vengono mascherati con asterischi (*****), ad eccezione delle informazioni archiviate nelle posizioni specificate di seguito. Di default, il valore èfalse
.Importante
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 nellaMetadata
sezione. Per ulteriori informazioni, consulta Metadata riferimento alla sintassi della sezione per i modelli CloudFormation . -
Sezione dei modelli
Outputs
. Per ulteriori informazioni, consulta Outputs riferimento alla sintassi della sezione per i modelli CloudFormation . -
Attributo
Metadata
di una definizione di risorsa. Per ulteriori informazioni, consulta Attributo Metadata.
Si consiglia vivamente di non utilizzare questi meccanismi per includere informazioni sensibili, come password o segreti.
Per ulteriori informazioni sull'utilizzo per
NoEcho
mascherare informazioni riservate, consulta la procedura Non incorporare le credenziali nei modelli consigliata. -
Esempi
Node.js
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
"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
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
In questo esempio Python, la funzione inline Lambda utilizza un valore intero e lo moltiplica per 5.
JSON
"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
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
Codice sorgente asincrono di Node.js
Di seguito è riportato 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(..): " + error); reject(context.done(error)); }); request.write(responseBody); request.end(); }) }
Codice sorgente Node.js
Di seguito è riportato 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(..): " + error); context.done(); }); request.write(responseBody); request.end(); }
Codice sorgente Python
Quanto segue è 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 SUCCESS = "SUCCESS" FAILED = "FAILED" http = urllib3.PoolManager() def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None): responseUrl = event['ResponseURL'] print(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(..):", e)