🎊

AWS Config Custom Policy RulesがCloudFormationに対応したようです。

2022/08/03に公開

はじめに

このZennでCustom Policy Rulesの記事を書きました。登壇もしました。

https://zenn.dev/watany/articles/472889670b8f82

https://speakerdeck.com/watany/aws-config-custom-rule-falsekododedekirukana

このCustom Policy Rulesの情報を集めるのにはかなり苦労しました。なぜかって日本語どころか、英語圏、AWS公式ですら全然公開されていない始末。

で、2022/8/2に本機能がGAされました。えええ、そりゃ情報がないわけだ。
https://aws.amazon.com/jp/about-aws/whats-new/2022/08/build-aws-config-rules-cloudformation-guard/

GAになるとどうなる?

本機能ですが、私が確認できている限り、AWS Blogにて6/30に情報が公開されていました。
https://aws.amazon.com/jp/blogs/mt/announcing-aws-config-custom-rules-using-guard-custom-policy/

上記の公式アナウンスを見るに、機能的には特に変わってないように見えたが……

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-custompolicydetails.html

あ゛あ゛あ゛あ゛あ゛あ゛!゛!゛!゛!゛!゛!゛ Custom Policy Rulesが CloudFormation対゛応゛し゛て゛る゛う゛う゛う゛う゛う゛

これは、もう、試すしかないですよねっ。

サンプルコード

AWSTemplateFormatVersion: 2010-09-09
Description: "sample-custom-policy"
Resources:
  samplePolicy:
    Type: AWS::Config::ConfigRule
    Properties: 
      ConfigRuleName: sample-custom-policy
      Description: sample-custom-policy
#   InputParameters: Json
#   MaximumExecutionFrequency: String
      Scope: 
        ComplianceResourceTypes: 
          - AWS::EC2::Volume
      Source: 
        CustomPolicyDetails: 
          EnableDebugLogDelivery: true
          PolicyRuntime: guard-2.x.x
          PolicyText: |
            let latest = ["io2", "gp3", "sc1", "st1"]
    
            rule checkcompliance when
              resourceType == "AWS::EC2::Volume" {
              configuration.volumeType IN %latest
            }
        Owner: CUSTOM_POLICY
        SourceDetails: 
          - EventSource: aws.config
            MessageType: ConfigurationItemChangeNotification
          - EventSource: aws.config
            MessageType: OversizedConfigurationItemChangeNotification

ポイント

  • PolicyTextはLambdaのインラインのノリで書くのが良さそう。
    • CloudFormationを確認したところ、GuardファイルをS3へ置いて参照する方式は未対応......?
  • SourceDetailsConfigurationItemChangeNotification,OversizedConfigurationItemChangeNotification(≒設定変更時のみ)しか対応していない。
    • これはCustom Policy Rulesの仕様なので回避できません。
  • CustomRuleと異なる点として「RuleへIAM Roleが付与できない」。ConfigRecorderのスキーマを見て判定に利用できるパラメータは確認しましょう。
    • この記事でも述べたが、下のリポジトリはメンテ状況がいまいちなので、現状は実機での確認を推奨します。私と一緒にコントリビュートしませんか?

https://github.com/awslabs/aws-config-resource-schema

deploy

今回はお試しなのでCloud9で手動デプロイしました。

# install rain
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/home/ec2-user/.linuxbrew/bin/brew shellenv)"' >> /home/ec2-user/.bash_profile
eval "$(/home/ec2-user/.linuxbrew/bin/brew shellenv)"
brew install rain

# deploy
rain deploy sample.yaml

これで動きました。CDKでも早くデプロイしてみたいですね。L2 Constructsも作るか!?

追記:適合パックはまだ非対応

以下のコマンドを試したところ、ConformancePack(Config適合パック)形式のdeployリクエストは成功するが、CustomPolicyDetails is required when Owner is CUSTOM_POLICYというエラーで失敗する。

# deploy(ConformancePack)
aws configservice put-conformance-pack \
--conformance-pack-name samplePolicy \
--template-body file://sample.yaml 

CustomPolicyDetailsは上述のとおり書いているがどういうことだ!?

Stackの様子を見にいくと、展開されたテンプレート(後述)CustomPolicyDetailsの値が削除されていた。きっとまだ非対応なため解釈できなかったのだろう……ぐぬぬ。

---
Description: "DO NOT MODIFY THIS STACK! This stack is managed by Config Conformance\
  \ Packs."
Parameters: {}
Mappings: {}
Conditions: {}
Rules: {}
Resources:
  samplePolicy:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "sample-custom-policy-conformance-pack-lszjbrlk9"
      Description: "sample-custom-policy"
      Scope:
        ComplianceResourceTypes:
        - "AWS::EC2::Volume"
      Source:
        Owner: "CUSTOM_POLICY"
        SourceDetails:
        - EventSource: "aws.config"
          MessageType: "ConfigurationItemChangeNotification"
        - EventSource: "aws.config"
          MessageType: "OversizedConfigurationItemChangeNotification"
Outputs: {}
AWSTemplateFormatVersion: "2010-09-09"
Hooks: {}

参考

https://dev.classmethod.jp/articles/aws-config-aws-cloudformation-guard-custom-policy/

Discussion