cfn-response-Modul - AWS CloudFormation

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

cfn-response-Modul

Wenn Sie die -ZipFileEigenschaft verwenden, um den Quellcode Ihrer Funktion anzugeben und diese Funktion mit einer AWS CloudFormation benutzerdefinierten Ressource interagiert, können Sie das cfn-response Modul laden, um Antworten an diese Ressourcen zu senden. Das Modul enthält eine send-Methode, die anhand einer vorsignierten Amazon S3-URL (ResponseURL) ein Antwortobjekt an eine benutzerdefinierte Ressource sendet.

Nach dem Ausführen der send-Methode wird die Lambda-Funktion beendet, und alles, was Sie nach dieser Methode schreiben, wird ignoriert.

Anmerkung

Das cfn-response-Modul ist nur verfügbar, wenn Sie die ZipFile-Eigenschaft verwenden, um Ihren Quell-Code zu schreiben. Es ist für Quellcode, der in Amazon S3-Buckets gespeichert wird, nicht verfügbar. Für Code in -Buckets müssen Sie eigene Funktionen schreiben um Antworten senden zu können.

Laden des cfn-response-Moduls

Verwenden Sie bei Node.js-Funktionen die require()-Funktion, um das cfn-response-Modul zu laden. Im folgenden Codebeispiel wird ein cfn-response-Objekt mit dem Namen response erstellt:

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

Verwenden Sie bei Python die import-Anweisung, um das cfnresponse-Modul zu laden, wie im folgenden Beispiel veranschaulicht:

Anmerkung

Verwenden Sie genau dieses Import-Statement Wenn Sie andere Varianten der Importanweisung verwenden, enthält das Antwortmodul AWS CloudFormation nicht.

import cfnresponse

Parameter für die send-Methode

Mit der send-Methode können Sie die folgenden Parameter verwenden.

event

Die Felder in einer benutzerdefinierten Ressourcenanforderung.

context

Ein Objekt, das für Lambda-Funktionen festgelegt wurde und das Sie verwenden können, um festzulegen, wann die Funktion und alle Callbacks abschließend ausgeführt wurden, oder um aus der Lambda-Ausführungsumgebung auf Informationen zuzugreifen. Weitere Informationen finden Sie unter Programmiermodell (Node.js) im Entwicklerhandbuch fürAWS Lambda .

responseStatus

Gibt an, ob die Funktion erfolgreich abgeschlossen wurde. Verwenden Sie die cfnresponse-Modulkonstanten, um den Status festzulegen: SUCCESS für erfolgreiche Ausführungen und FAILED für fehlgeschlagene Ausführungen.

responseData

Das Data-Feld für ein benutzerdefiniertes Ressourcen-Antwortobjekt. Die Daten sind eine Liste von Name-Wert-Paaren.

physicalResourceId

Optional. Die eindeutige Kennung der benutzerdefinierten Ressource, die die Funktion aufgerufen hat. Standardmäßig verwendet das Modul den Namen des Amazon- CloudWatch Logs-Protokollstreams, der der Lambda-Funktion zugeordnet ist.

Der für eine PhysicalResourceId zurückgegebene Wert kann benutzerdefinierte Vorgänge zur Ressourcenaktualisierung ändern. Wenn der zurückgegebene Wert derselbe ist, wird es als normale Aktualisierung betrachtet. Wenn der zurückgegebene Wert nicht derselbe ist, erkennt AWS CloudFormation die Aktualisierung als Ersatz und sendet eine Anforderung zum Löschen an die alte Ressource. Weitere Informationen finden Sie unter AWS::CloudFormation::CustomResource.

noEcho

Optional. Gibt an, ob die Ausgabe der benutzerdefinierten Ressource maskiert wird, wenn sie mithilfe der Funktion Fn::GetAtt abgerufen wird. Wird „true“ festgelegt, werden alle zurückgegebenen Werte mit Sternchen (*****) maskiert, mit Ausnahme der Informationen, die an den folgenden Speicherorten gespeichert sind. Dieser Wert ist standardmäßig false.

Wichtig

Durch die Verwendung des NoEcho-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:

  • Die Metadata template section. CloudFormation dos transformiert, ändert oder redigiert keine Informationen, die Sie in den Metadata Abschnitt aufnehmen. Weitere Informationen finden Sie unter Metadaten.

  • Der Outputs-Vorlagenabschnitt. Weitere Informationen finden Sie unter Outputs.

  • Das Metadata-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter Metadata Attribut.

Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.

Weitere Informationen zum Maskieren vertraulicher Daten mit NoEcho enthält die bewährte Methode Keine Anmeldeinformationen in Ihre Vorlagen einbetten.

Beispiele

Node.js

Im folgenden Beispiel für Node.js verwendet die eingebettete Lambda-Funktion einen Eingabewert und multipliziert diesen mit 5. Eingebettete bzw. Inline-Funktionen sind besonders nützlich für kleinere Funktionen, da Sie den Quellcode hiermit direkt in einer Vorlage festlegen können, statt ein Paket zu erstellen und dieses in einen Amazon S3-Bucket hochzuladen. Die Funktion verwendet die cfn-response send-Methode zum Senden des Ergebnisses zurück an die benutzerdefinierte Ressource, die sie aufgerufen hat.

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

Im folgenden Beispiel für Python verwendet die Lambda-Inline-Funktion einen Ganzzahlwert und multipliziert diesen mit 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")

Modul-Quellcode

Im Folgenden der Quellcode des Antwortmoduls für die Node.js-Funktionen. Überprüfen Sie den Code, um zu verstehen, was das Modul tut, und um die Implementierung in Ihre eigenen Antwortfunktionen zu vereinfachen.

// 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(); }

Im Folgenden sehen Sie den Quellcode des Antwortmoduls für die Python-2- und -3-Funktionen:

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