Modulo cfn-response - AWS CloudFormation

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 e FAILED 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, consulta AWS::CloudFormation::CustomResource.

noEcho

Facoltativo. 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 (*****), 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 nella Metadata sezione. Per ulteriori informazioni, consulta Metadata.

  • Sezione dei modelli Outputs. Per ulteriori informazioni, consulta Outputs.

  • 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)