Modul cfn-response - AWS CloudFormation

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Modul cfn-response

Dalam CloudFormation template Anda, Anda dapat menentukan fungsi Lambda sebagai target sumber daya kustom. Saat Anda menggunakan ZipFile properti untuk menentukan kode sumber fungsi Anda, Anda dapat memuat cfn-response modul untuk mengirim respons dari fungsi Lambda Anda ke sumber daya khusus. cfn-responseModul ini adalah pustaka yang menyederhanakan pengiriman tanggapan ke sumber daya kustom yang memanggil fungsi Lambda Anda. Modul ini memiliki send metode yang mengirimkan objek respons ke sumber daya khusus melalui URL presigned Amazon S3 (the). ResponseURL

Modul cfn-response tersedia hanya ketika Anda menggunakan properti ZipFile untuk menulis kode sumber Anda. Ini tidak tersedia untuk kode sumber yang disimpan di bucket Amazon S3. Untuk kode dalam bucket, Anda harus menulis fungsi Anda sendiri untuk mengirim tanggapan.

catatan

Setelah mengeksekusi send metode, fungsi Lambda berakhir, jadi apa pun yang Anda tulis setelah metode itu diabaikan.

Memuat modul cfn-response

Untuk fungsi Node.js, gunakan fungsi require() untuk memuat modul cfn-response. Sebagai contoh, contoh kode berikut membuat objek cfn-response dengan nama response:

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

Untuk Python, gunakan pernyataan import untuk memuat modul cfnresponse, seperti yang ditunjukkan dalam contoh berikut:

catatan

Gunakan pernyataan impor persis seperti ini. Jika Anda menggunakan varian lain dari pernyataan impor, CloudFormation tidak termasuk modul respons.

import cfnresponse

Parameter metode send

Anda dapat menggunakan parameter berikut dengan metode send.

event

Bidang dalam permintaan sumber daya kustom.

context

Objek, khusus untuk fungsi Lambda, yang dapat Anda gunakan untuk menentukan kapan fungsi dan callback telah menyelesaikan eksekusi, atau untuk mengakses informasi dari dalam lingkungan eksekusi Lambda. Untuk informasi selengkapnya, lihat Model pemrograman (Node.js) di Panduan AWS Lambda Pengembang.

responseStatus

Apakah fungsi berhasil diselesaikan. Gunakan konstanta modul cfnresponse untuk menentukan status: SUCCESS untuk eksekusi yang sukses dan FAILED untuk eksekusi yang gagal.

responseData

Bidang Data dari objek respons sumber daya kustom. Data tersebut merupakan daftar pasangan nama-nilai.

physicalResourceId

Tidak wajib. Pengidentifikasi unik dari sumber daya kustom yang memanggil fungsi tersebut. Secara default, modul menggunakan nama aliran CloudWatch log Amazon Logs yang terkait dengan fungsi Lambda.

Nilai yang dikembalikan untuk PhysicalResourceId dapat mengubah operasi pembaruan sumber daya kustom. Jika nilai yang dikembalikan sama, itu dianggap sebagai pembaruan normal. Jika nilai yang dikembalikan berbeda, CloudFormation mengenali pembaruan sebagai pengganti dan mengirimkan permintaan hapus ke sumber daya lama. Untuk informasi selengkapnya, lihat AWS::CloudFormation::CustomResource.

noEcho

Tidak wajib. Menunjukkan apakah menutupi output dari sumber daya kustom ketika ia diambil dengan menggunakan fungsi Fn::GetAtt. Jika diatur ke true, semua nilai yang dikembalikan ditutupi dengan tanda bintang (*****), kecuali untuk informasi yang tersimpan di lokasi yang ditentukan di bawah ini. Secara default, nilainya adalah false.

penting

Menggunakan NoEcho atribut tidak menutupi informasi apa pun yang disimpan sebagai berikut:

  • Bagian Metadata template. CloudFormation tidak mengubah, memodifikasi, atau menyunting informasi apa pun yang Anda sertakan di Metadata bagian ini. Untuk informasi selengkapnya, lihat Metadata.

  • Bagian Outputs template. Untuk informasi selengkapnya, lihat Output.

  • MetadataAtribut definisi sumber daya. Untuk informasi selengkapnya, lihat Metadataatribut.

Kami sangat menyarankan Anda untuk tidak menggunakan mekanisme ini untuk memasukkan informasi sensitif, seperti kata sandi atau rahasia.

Untuk informasi selengkapnya tentang penggunaan NoEcho untuk menutupi informasi sensitif, lihat praktik Jangan menanamkan kredensial dalam templat Anda terbaik.

Contoh

Node.js

Dalam contoh Node.js berikut, fungsi Lambda inline mengambil nilai input dan mengalikannya dengan 5. Fungsi inline sangat berguna untuk fungsi yang lebih kecil karena memungkinkan Anda menentukan kode sumber secara langsung di template, alih-alih membuat paket dan mengunggahnya ke bucket Amazon S3. Fungsi ini menggunakan metode cfn-response send untuk mengirim hasil kembali ke sumber daya kustom yang memanggilnya.

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

Dalam contoh Python berikut, fungsi Lambda inline mengambil nilai integer dan mengalikannya dengan 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")

Kode sumber modul

Berikut ini adalah kode sumber modul respon untuk fungsi Node.js. Tinjau untuk memahami apa yang dilakukan modul dan untuk bantuan dengan menerapkan fungsi respon Anda sendiri.

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

Berikut ini adalah kode sumber modul respon untuk fungsi Python 2 dan 3:

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