AWSはAWS CloudFormation Hooksの一般提供を発表した。CloudFormationスタック操作の作成、更新、削除の前にカスタムロジックを実行できるようにするものである。CloudFormation Hooksは、バージョニング、パブリックおよびプライベートディストリビューションをサポートし、複数のAWSアカウントやリージョンに公開できる。
CloudFormation Hooksでは、プロビジョニングされるリソースを検査することで、CloudFormation操作のプロアクティブな検証ができるようになる。非準拠のリソースが検出された場合は、警告を返すか、操作を失敗させて実行を停止することができる。ユースケースは、セキュリティグループに適切なインバウンドおよびアウトバウンドトラフィックルールがあることの検証、より高価なEC2インスタンスの使用の制限、RDSインスタンスに対する自動バックアップの有効化にまで及ぶ。
CloudFormation CLIはCloudFormation Hooksの開発に使われる。CloudFormation Hooksは、AWS CloudFormationレジストリ内でサポートされている拡張タイプである。フック用の開発者プラグインは、JavaとPythonで利用できる。
AWS CloudFormationレジストリでは、フックを含む拡張機能をパブリックリソースとプライベートリソースの両方として管理できる。パブリック拡張機能は、AWSまたは他のサードパーティによって公開されている。AWSによる拡張機能は常に公開されており、バージョン管理はAWSによって制御されている。登録されたプライベートの拡張機能は、オーダーメイドのフックに使用でき、登録することで必要なAWSアカウントで利用できるようになる。拡張機能を複数のリージョンに公開するには、AWS CloudFormation StackSetsを使う。
必要なフックプロジェクトコードの生成は、CloudFormation CLIを使ってコマンドcfn init
を実行することで実施できる。次のステップはフックスキーマを生成することで、これはフックのプロパティと属性を定義するJSON形式のテキストファイルである。次に、フックハンドラーコードが、サポートされている開発者プラグイン言語の1つで記述される。フックをプライベートレジストリに登録するには、cfn submit --set-default
を使用する。
完了すると、フックは次のように有効にできる。
aws cloudformation set-type-configuration \
--configuration "{\"CloudFormationConfiguration\":{\"HookConfiguration\":{\"TargetStacks\":\"ALL\",\"FailureMode\":\"FAIL\",\"Properties\":{\"SsmKey\": \"compliant-imageid-x86\"}}}}" \
--type-arn $HOOK_TYPE_ARN
TargetStacks
がALL
に設定されている場合、フックは、CREATE
、UPDATE
、DELETE
操作中にアカウント内のすべてのスタックに適用される。FailureMode
はWARN
かFAIL
のいずれかに設定できる。Properties
オブジェクトは、フックスキーマ内で定義されているフックランタイムプロパティが提供される場所である。
AWSは、PythonとJavaの両方で、サンプルのフックを多数リリースした。たとえば、AWSSamples::S3BucketEncrypt::Hook
サンプルは、CREATE
またはUPDATE
操作中にKMSキーを使ってサーバ側の暗号化が有効になっていることを確認する。FailureMode
にFAIL
が設定されている場合、次に示すCloudFormationテンプレートは暗号化プロパティを指定していないため、続行できない。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties: {}
CloudFormation Hooksは、CDK、SAM、AWS Amplify、AWS Elastic Beanstalkによって作成されたスタックを含むすべてのCloudFormationスタックに対して実行される。CloudFormation Hooksの呼び出しイベントは、イベントブリッジルールを作成することでAmazon EventBridgeでサブスクライブできる。
詳細については、AWSのドキュメントをご覧ください。割り当てについては、アカウントあたりのフック数を100に、リソースあたりのフック数を100に、各フックのバージョン数を100に制限されている。CloudFormation Hooksは、リクエストの数と期間に基づいてフックごとに課金される。