

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

# Modul `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

Dalam CloudFormation template Anda, Anda dapat menentukan fungsi Lambda sebagai target sumber daya kustom. Saat Anda menggunakan `ZipFile` properti untuk menentukan kode sumber [fungsi](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) 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 kustom yang memanggil fungsi Lambda Anda. Modul ini memiliki `send` metode yang mengirimkan [objek respons](crpg-ref.md#crpg-ref-responses) 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`
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

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`
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Anda dapat menggunakan parameter berikut dengan metode `send`.

`event`  
Bidang dalam [permintaan sumber daya kustom](crpg-ref.md#crpg-ref-requesttypes).

`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 [Membangun fungsi Lambda dengan Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) 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](crpg-ref.md#crpg-ref-responses) 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 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`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 (\$1\$1\$1\$1\$1), kecuali untuk informasi yang tersimpan di lokasi yang ditentukan di bawah ini. Secara default, nilainya adalah `false`.  
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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Bagian `Outputs` template. Untuk informasi selengkapnya, lihat [Output](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ `Metadata`Atribut definisi sumber daya. Untuk informasi lebih lanjut, lihat [Atribut `Metadata`](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
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](security-best-practices.md#creds) terbaik.

## Contoh
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

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
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"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
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
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
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

Dalam contoh Python berikut, fungsi Lambda inline mengambil nilai integer dan mengalikannya dengan 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"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
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
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
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Kode sumber Node.js asinkron](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Kode sumber Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Kode sumber Python](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Kode sumber Node.js asinkron
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

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
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

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
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Berikut ini adalah kode sumber modul respon 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)
```