CloudFormation Hookが使えるようになったみたいなので、ためしてみた

2022.02.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

CloudFormation Hooksという機能が使えるようになったようです。

この機能を使うと、スタックやリソースの作成/更新/削除前にカスタム処理ができるようになります。
そのカスタム処理で、テンプレートがガイドラインに準拠してるかチェックして、警告を出したりデプロイを中断したり、あるいは何かしらのアクションを自動化するなどが実現出来るようになりました。

東京リージョン、大阪リージョンでも利用可能です。

使い方

まず、カスタムフックを用意しCloudFormationレジストリに登録する必要があります。
プライベートレジストリでもパブリックレジストリでも良いようです。

AWS CloudFormation レジストリの使用 - AWS CloudFormation

そして、登録したフックに必要な設定を使って、有効化します。

フックの有効化

本日はパブリックレジストリに登録済みの以下のサンプルフックを使ってみたいと思います。

設定JSONへは、フックで使用する設定プロパティを指定します。

まず、TargetStacksFailureModeはフックで共通の必須プロパティとなっています。
ターゲットスタックを何にするかと、失敗時の動作を設定します。ターゲットスタックは本日時点では全てのスタックでオンにするかオフにするか、を指定するみたいです。

  • 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になってしまうのずっと気になってました。ちょっと嬉しいかもしれない。
他にもいくつかやってみたいことがずっとあったので、次回移行はカスタムフックを実際に作成しレジストリに登録して使ってみたいと思います。

いまは前処理だけのようですが、後処理も出来るようになると嬉しいですね。
そっちでも、色々やりたいことがあるんですよ。