

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 公開用フックの公開
<a name="hooks-publishing"></a>

パブリックサードパーティーフックを開発するには、フックをプライベート拡張機能として開発します。次に、拡張機能を公開する各 AWS リージョン で、次の操作を行います。

1. フックをプライベート拡張として CloudFormation レジストリに登録します。

1. フックをテストして、CloudFormation レジストリで公開するために必要なすべての要件を満たしていることを確認します。

1. フックを CloudFormation レジストリに発行します。
**注記**  
特定のリージョンで拡張機能を公開する前に、まずそのリージョンで拡張機能パブリッシャーとして登録する必要があります。これを複数のリージョンで同時に実行するには、「 * CloudFormation CLI ユーザーガイド*[」のStackSets](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension-stacksets.html)」を参照してください。

Hook を開発して登録したら、サードパーティーのパブリック拡張機能として CloudFormation レジストリに*公開*することで、一般的な CloudFormation ユーザーに公開できます。

パブリックサードパーティーフックを使用すると、CloudFormation ユーザーがプロビジョニング前に AWS リソースの設定を事前に検査できます。プライベートフックと同様に、パブリックフックは CloudFormation AWS 内で によって発行されたフックと同じように扱われます。

レジストリに公開されたフックは、公開されている AWS リージョン のすべての CloudFormation ユーザーに表示されます。その後、ユーザーはアカウントで拡張機能を*アクティブ化*して、テンプレートで使用できるようにします。詳細については、[「 ユーザーガイド」のCloudFormation レジストリからサードパーティーのパブリック拡張機能](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html)を使用する」を参照してください。 *CloudFormation *

# パブリック使用のためのカスタムフックのテスト
<a name="hooks-testing-registered-hooks"></a>

登録されたカスタムフックを公開するには、そのフックに定義されているすべてのテスト要件に合格する必要があります。以下は、カスタムフックをサードパーティー拡張機能として公開する前に必要な要件のリストです。

各ハンドラーとターゲットは 2 回テストされます。の場合は 1 回`SUCCESS`、 の場合は 1 回`FAILED`。
+ `SUCCESS` レスポンスケースの場合:
  + ステータスは である必要があります`SUCCESS`。
  + エラーコードを返さないでください。
  + コールバック遅延は、指定されている場合は`0`秒に設定する必要があります。
+ `FAILED` レスポンスケースの場合:
  + ステータスは である必要があります`FAILED`。
  + エラーコードを返す必要があります。
  + レスポンスにメッセージが必要です。
  + コールバック遅延は、指定されている場合は`0`秒に設定する必要があります。
+ `IN_PROGRESS` レスポンスケースの場合:
  + エラーコードを返さないでください。
  + `Result` レスポンスで フィールドを設定することはできません。

# 契約テストで使用する入力データの指定
<a name="hooks-input-data-contract-test"></a>

デフォルトでは、 はフックスキーマで定義したパターンから生成された入力プロパティを使用して契約テスト CloudFormation を実行します。ただし、ほとんどのフックは複雑であるため、プロビジョニングスタックを事前作成または事前更新するための入力プロパティには、プロビジョニングされるリソースの理解が必要です。これに対処するには、 が契約テストを実行するときに CloudFormation 使用する入力を指定できます。

CloudFormation には、契約テストを実行するときに使用する入力データを指定する 2 つの方法があります。
+ ファイルを上書きする

  `overrides` ファイルを使用すると、 の特定のプロパティの入力データを軽量に指定 CloudFormation し`preCreate`、 `preUpdate`および `preDelete`オペレーションテストで使用できます。
+ 入力ファイル

  以下の場合は、複数の`input`ファイルを使用して契約テスト入力データを指定することもできます。
  + 作成、更新、削除オペレーションに異なる入力データを指定するか、テストする無効なデータを指定する必要があります。
  + 複数の異なる入力データセットを指定します。

## オーバーライドファイルを使用した入力データの指定
<a name="hook-override-inputs"></a>

以下は、 `overrides` ファイルを使用した Amazon S3 フックの入力データの例です。

```
{
    "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"
            }
        }
    }
}
```

## 入力ファイルを使用した入力データの指定
<a name="hook-test-inputs"></a>

`input` ファイルを使用して、 CloudFormation が使用するさまざまな種類の入力データを指定します。`preCreate`入力、`preUpdate`入力、無効な入力です。各種類のデータは個別のファイルで指定されます。契約テスト用に複数の入力データのセットを指定することもできます。

契約テスト CloudFormation で使用する の`input`ファイルを指定するには、Hooks プロジェクトのルートディレクトリに `inputs`フォルダを追加します。次に、入力ファイルを追加します。

次の命名規則を使用して、ファイルに含まれる入力データの種類を指定します。**n* *は整数です。
+ `inputs_n_pre_create.json`: `preCreate`ハンドラーでファイルを使用して、リソースを作成するための入力を指定します。
+ `inputs_n_pre_update.json`: `preUpdate`ハンドラーでファイルを使用して、リソースを更新するための入力を指定します。
+ `inputs_n_pre_delete.json`: `preDelete`ハンドラーでファイルを使用して、リソースを削除するための入力を指定します。
+ `inputs_n_invalid.json`: テストする無効な入力を指定する場合。

契約テスト用に入力データの複数のセットを指定するには、ファイル名の整数をインクリメントして入力データセットを順序付けます。たとえば、最初の入力ファイルのセットには、`inputs_1_pre_create.json`、`inputs_1_pre_update.json`、および という名前を付ける必要があります`inputs_1_pre_invalid.json`。次のセットには、`inputs_2_pre_create.json`、`inputs_2_pre_update.json`、 という名前が付けられ`inputs_2_pre_invalid.json`ます。

各入力ファイルは、テストに使用されるリソースプロパティのみを含む JSON ファイルです。

以下は、入力ファイルを使用して入力データ Amazon S3 を指定`inputs`するための ディレクトリの例です。

`inputs_1_pre_create.json`  <a name="inputs_1_pre_create.json"></a>
以下は、`inputs_1_pre_create.json`契約テストの例です。  

```
{
    "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>
以下は、`inputs_1_pre_update.json`契約テストの例です。  

```
{
    "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>
以下は、`inputs_1_invalid.json`契約テストの例です。  

```
{
    "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>
以下は、`inputs_1_invalid_pre_update.json`契約テストの例です。  

```
{
    "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"
        }
    }
}
```

詳細については、 CloudFormation CLI ユーザーガイドの [Publishing extensions to make them available for public use](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html) を参照してください。**