Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
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-response
Modul ini adalah pustaka yang menyederhanakan pengiriman tanggapan ke sumber daya khusus 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 menjalankan 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 mencakup modul respon.
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 danFAILED
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, lihatAWS::CloudFormation::CustomResource
. noEcho
-
Tidak wajib. Menunjukkan apakah menutupi output dari sumber daya kustom ketika ia diambil dengan menggunakan fungsi
Fn::GetAtt
. Jika diatur ketrue
, semua nilai yang dikembalikan ditutupi dengan tanda bintang (*****), kecuali untuk informasi yang tersimpan di lokasi yang ditentukan di bawah ini. Secara default, nilainya adalahfalse
.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 diMetadata
bagian ini. Untuk informasi selengkapnya, lihat CloudFormation Template Metadata sintaksis. -
Bagian
Outputs
template. Untuk informasi selengkapnya, lihat CloudFormation Template Outputs sintaksis. -
Metadata
Atribut 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
Kode sumber Node.js asinkron
Berikut ini adalah kode sumber modul respons untuk fungsi Node.js jika handler asinkron. 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) {
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=*****');
}
Kode sumber Node.js
Berikut ini adalah kode sumber modul respons untuk fungsi Node.js jika handler tidak asinkron. 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(..): " + maskCredentialsAndSignature(error));
context.done();
});
request.write(responseBody);
request.end();
}
Kode sumber Python
Berikut ini adalah kode sumber modul respons untuk fungsi 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)