

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

# Publishing Hooks untuk penggunaan umum
<a name="hooks-publishing"></a>

Untuk mengembangkan Hook pihak ketiga publik, kembangkan Hook Anda sebagai ekstensi pribadi. Kemudian, Wilayah AWS di masing-masing tempat Anda ingin membuat ekstensi tersedia untuk umum: 

1. Daftarkan Hook Anda sebagai ekstensi pribadi di CloudFormation registri.

1. Uji Hook Anda untuk memastikannya memenuhi semua persyaratan yang diperlukan untuk dipublikasikan di CloudFormation registri.

1. Publikasikan Hook Anda ke CloudFormation registri.
**catatan**  
Sebelum Anda mempublikasikan ekstensi apa pun di Wilayah tertentu, Anda harus terlebih dahulu mendaftar sebagai penerbit ekstensi di Wilayah tersebut. Untuk melakukannya di beberapa Wilayah secara bersamaan, lihat [Menerbitkan ekstensi di beberapa Wilayah menggunakan StackSets](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension-stacksets.html) *Panduan Pengguna CloudFormation CLI*.

Setelah Anda mengembangkan dan mendaftarkan Hook Anda, Anda dapat membuatnya tersedia untuk umum untuk CloudFormation pengguna umum dengan *menerbitkannya* ke CloudFormation registri, sebagai ekstensi publik pihak ketiga.

Hooks pihak ketiga publik memungkinkan Anda menawarkan CloudFormation pengguna untuk secara proaktif memeriksa konfigurasi AWS sumber daya sebelum penyediaan. Seperti halnya Hooks pribadi, Hooks publik diperlakukan sama seperti Hook yang diterbitkan oleh AWS dalam. CloudFormation

Hooks yang dipublikasikan ke registri terlihat oleh semua CloudFormation pengguna Wilayah AWS di mana mereka diterbitkan. Pengguna kemudian dapat *mengaktifkan* ekstensi Anda di akun mereka, yang membuatnya tersedia untuk digunakan dalam template mereka. Untuk informasi selengkapnya, lihat [Menggunakan ekstensi publik pihak ketiga dari CloudFormation registri](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html) di *Panduan CloudFormation Pengguna*.

# Menguji Hook khusus untuk penggunaan umum
<a name="hooks-testing-registered-hooks"></a>

Untuk mempublikasikan Hook kustom terdaftar Anda, itu harus lulus semua persyaratan pengujian yang ditentukan untuk itu. Berikut ini adalah daftar persyaratan yang diperlukan sebelum menerbitkan Hook kustom Anda sebagai ekstensi pihak ketiga.

Setiap handler dan target diuji dua kali. Sekali untuk `SUCCESS` dan sekali untuk`FAILED`.
+ Untuk kasus `SUCCESS` respons:
  + Status harus`SUCCESS`.
  + Tidak boleh mengembalikan kode kesalahan.
  + Penundaan callback harus diatur ke `0` detik, jika ditentukan.
+ Untuk kasus `FAILED` respons:
  + Status harus`FAILED`.
  + Harus mengembalikan kode kesalahan.
  + Harus memiliki pesan sebagai tanggapan.
  + Penundaan callback harus diatur ke `0` detik, jika ditentukan.
+ Untuk kasus `IN_PROGRESS` respons:
  + Tidak boleh mengembalikan kode kesalahan.
  + `Result`bidang tidak harus diatur sebagai tanggapan.

# Menentukan data input untuk digunakan dalam tes kontrak
<a name="hooks-input-data-contract-test"></a>

Secara default, CloudFormation melakukan tes kontrak menggunakan properti input yang dihasilkan dari pola yang Anda tentukan dalam skema Hook Anda. Namun, sebagian besar Hooks cukup kompleks sehingga properti input untuk membuat atau memperbarui tumpukan penyediaan memerlukan pemahaman tentang sumber daya yang disediakan. Untuk mengatasi ini, Anda dapat menentukan input yang CloudFormation digunakan saat melakukan tes kontraknya.

CloudFormation menawarkan dua cara bagi Anda untuk menentukan data input untuk digunakan saat melakukan tes kontrak:
+ Mengganti berkas

  Menggunakan `overrides` file menyediakan cara ringan untuk menentukan data input untuk properti spesifik tertentu CloudFormation untuk digunakan selama`preCreate`, `preUpdate` dan `preDelete` pengujian operasi.
+ Berkas masukan

  Anda juga dapat menggunakan beberapa `input` file untuk menentukan data input uji kontrak jika:
  + Anda ingin atau perlu menentukan data input yang berbeda untuk membuat, memperbarui, dan menghapus operasi, atau data yang tidak valid untuk menguji.
  + Anda ingin menentukan beberapa set data input yang berbeda.

## Menentukan data input menggunakan file override
<a name="hook-override-inputs"></a>

Berikut ini adalah contoh data input Amazon S3 Hook menggunakan `overrides` file.

```
{
    "CREATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        },
        "AWS::SQS::Queue": {
            "resourceProperties": {
                "/QueueName": "MyQueueContract",
                "/KmsMasterKeyId": "hellocontract"
            }
        }
    },
    "UPDATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "previousResourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        }
    },
    "INVALID_UPDATE_PRE_PROVISION": {
        "AWS::S3::Bucket": {
            "resourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "previousResourceProperties": {
                "/BucketName": "encryptedbucket-us-west-2-contractor",
                "/BucketEncryption/ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            }
        }
    },
    "INVALID": {
        "AWS::SQS::Queue": {
            "resourceProperties": {
                "/QueueName": "MyQueueContract",
                "/KmsMasterKeyId": "KMS-KEY-ARN"
            }
        }
    }
}
```

## Menentukan data input menggunakan file input
<a name="hook-test-inputs"></a>

Gunakan `input` file untuk menentukan berbagai jenis data input CloudFormation untuk digunakan: `preCreate` input, `preUpdate` input, dan input tidak valid. Setiap jenis data ditentukan dalam file terpisah. Anda juga dapat menentukan beberapa set data input untuk tes kontrak.

Untuk menentukan `input` file yang akan CloudFormation digunakan dalam pengujian kontrak, tambahkan `inputs` folder ke direktori root proyek Hooks Anda. Kemudian tambahkan file input Anda.

Tentukan jenis data input yang berisi file dengan menggunakan konvensi penamaan berikut, di **n**mana bilangan bulat:
+ `inputs_n_pre_create.json`: Gunakan file dengan `preCreate` penangan untuk menentukan input untuk membuat sumber daya.
+ `inputs_n_pre_update.json`: Gunakan file dengan `preUpdate` penangan untuk menentukan input untuk memperbarui sumber daya.
+ `inputs_n_pre_delete.json`: Gunakan file dengan `preDelete` penangan untuk menentukan input untuk menghapus sumber daya.
+ `inputs_n_invalid.json`: Untuk menentukan input yang tidak valid untuk diuji.

Untuk menentukan beberapa set data masukan untuk pengujian kontrak, tambahkan bilangan bulat dalam nama file untuk mengurutkan kumpulan data masukan Anda. Misalnya, kumpulan file input pertama Anda harus diberi nama`inputs_1_pre_create.json`,`inputs_1_pre_update.json`, dan`inputs_1_pre_invalid.json`. Set Anda berikutnya akan diberi nama `inputs_2_pre_create.json``inputs_2_pre_update.json`,, dan`inputs_2_pre_invalid.json`, dan seterusnya.

Setiap file input adalah file JSON yang hanya berisi properti sumber daya yang akan digunakan dalam pengujian.

Berikut ini adalah direktori contoh `inputs` untuk Amazon S3 menentukan data input menggunakan file input.

`inputs_1_pre_create.json`  <a name="inputs_1_pre_create.json"></a>
Berikut ini adalah contoh dari tes `inputs_1_pre_create.json` kontrak.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "AccessControl": "BucketOwnerFullControl",
            "AnalyticsConfigurations": [],
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    },
    "AWS::SQS::Queue": {
        "resourceProperties": {
            "QueueName": "MyQueue",
            "KmsMasterKeyId": "KMS-KEY-ARN"
        }
    }
}
```

`inputs_1_pre_update.json`  <a name="inputs_1_pre_update.json"></a>
Berikut ini adalah contoh dari tes `inputs_1_pre_update.json` kontrak.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        },
        "previousResourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    }
}
```

`inputs_1_invalid.json`  <a name="inputs_1_invalid.json"></a>
Berikut ini adalah contoh dari tes `inputs_1_invalid.json` kontrak.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "AccessControl": "BucketOwnerFullControl",
            "AnalyticsConfigurations": [],
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "ServerSideEncryptionByDefault": {
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    },
    "AWS::SQS::Queue": {
        "resourceProperties": {
            "NotValid": "The property of this resource is not valid."
        }
    }
}
```

`inputs_1_invalid_pre_update.json`  <a name="inputs_1_invalid_pre_update.json"></a>
Berikut ini adalah contoh dari tes `inputs_1_invalid_pre_update.json` kontrak.  

```
{
    "AWS::S3::Bucket": {
        "resourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        },
        "previousResourceProperties": {
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "BucketKeyEnabled": true,
                        "ServerSideEncryptionByDefault": {
                            "KMSMasterKeyID": "KMS-KEY-ARN",
                            "SSEAlgorithm": "aws:kms"
                        }
                    }
                ]
            },
            "BucketName": "encryptedbucket-us-west-2"
        }
    }
}
```

Untuk informasi selengkapnya, lihat [Menerbitkan ekstensi agar tersedia untuk penggunaan umum](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html) di *Panduan Pengguna CloudFormation CLI*.