CloudFormation Hookが使えるようになったみたいなので、ためしてみた
いわさです。
CloudFormation Hooksという機能が使えるようになったようです。
この機能を使うと、スタックやリソースの作成/更新/削除前にカスタム処理ができるようになります。
そのカスタム処理で、テンプレートがガイドラインに準拠してるかチェックして、警告を出したりデプロイを中断したり、あるいは何かしらのアクションを自動化するなどが実現出来るようになりました。
東京リージョン、大阪リージョンでも利用可能です。
使い方
まず、カスタムフックを用意しCloudFormationレジストリに登録する必要があります。
プライベートレジストリでもパブリックレジストリでも良いようです。
AWS CloudFormation レジストリの使用 - AWS CloudFormation
そして、登録したフックに必要な設定を使って、有効化します。
フックの有効化
本日はパブリックレジストリに登録済みの以下のサンプルフックを使ってみたいと思います。
設定JSONへは、フックで使用する設定プロパティを指定します。
まず、TargetStacks
とFailureMode
はフックで共通の必須プロパティとなっています。
ターゲットスタックを何にするかと、失敗時の動作を設定します。ターゲットスタックは本日時点では全てのスタックでオンにするかオフにするか、を指定するみたいです。
- TargetStacks
ALL
:すべてのスタック操作でフックをオンにするNONE
:フックをオフにする。適用されなくなる。
- FailureMode
FAIL
:中断するWARN
:続行しつつ、警告を送信する
Developing hooks - CloudFormation Command Line Interface より
そして追加でフック個別のプロパティを設定します。
このサンプルフックではバケット名を対象に除外対象を指定することが出来ます。
excludedBucketSuffixesというプロパティですが、フックのコードを見るとstartswith
でこのプロパティを使っているようなのでPrefix動作をしているようです。
以下のように指定しました。
{ "CloudFormationConfiguration": { "HookConfiguration": { "TargetStacks": "ALL", "FailureMode": "FAIL", "Properties": { "excludedBucketSuffixes": "excluded-,baseline-" } } } }
これで有効化された状態ですね。ターゲットスタックとフックの動作も設定で指定したとおりになっています。
動作確認
フックが有効化されたので、CloudFormationでバケットを作成してみましょう。
まずはPublicAccessBlockConfiguration
を指定していないテンプレートです。
AWSTemplateFormatVersion: 2010-09-09 Description: --- Resources: S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'hoge-${AWS::Region}-${AWS::AccountId}'
エラーになりました。
どうやらCloudFormationコンソール上ではカスタムフックの詳細なエラー内容は確認出来ないようです。
次は、PublicAccessBlockConfiguration
を指定してみます。
AWSTemplateFormatVersion: 2010-09-09 Description: --- Resources: S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'hoge-${AWS::Region}-${AWS::AccountId}' PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true
こちらはエラーにならずに正常登録出来ました。
詳細ログを知りたいとき
カスタム処理なので詳細な情報を取得した場合もあると思います。
その場合はフックのログ記録設定を有効化してみましょう。
CloudWatch Logsの指定したロググループへカスタムフックがログを出力してくれるようになります。
//NGバケット DEBUG Results Message: S3 block public access settings are not specified for bucket named hoge-ap-northeast-1-123456789012 //OKバケット DEBUG Results Message: S3 block public access settings are enabled for bucket named hoge-ap-northeast-1-123456789012
デバッグログが確認出来ましたね。
注意点
有効化したフックはCloudFormationのデプロイを内部で利用する全てのサービスで適用されます。
例えばCodeStarやCloud9などです。
適用するフックによっては失敗するようになる場合があるので注意しましょう。
私はS3ブロックパブリックアクセスの指定なし時をエラーにしたのですがCodeStarで失敗するようになりました。フックの設定を「警告」に留めておくなど工夫が必要かもしれない。
さいごに
CloudFromationで色々省略した状態でS3バケットを作成すると、デフォルトでパブリックアクセスブロックがOFFになってしまうのずっと気になってました。ちょっと嬉しいかもしれない。
他にもいくつかやってみたいことがずっとあったので、次回移行はカスタムフックを実際に作成しレジストリに登録して使ってみたいと思います。
いまは前処理だけのようですが、後処理も出来るようになると嬉しいですね。
そっちでも、色々やりたいことがあるんですよ。