🎇

AWS CDK が Config Custom Policy Rulesに対応しました。

2022/10/21に公開

はじめに

https://zenn.dev/watany/articles/1b52eaad537b58

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

このブログから3か月が経ち、紆余曲折ありましたが無事にConstructsを作ることができました。2022/10/21 リリースのv2.47.0から使えます🚀 やったー!

https://github.com/aws/aws-cdk/pull/21794

Policy Rulesはリリースから数カ月がたち、ようやく注目されている気がします。そんな今だからこそCDKからも使ってほしいので、宣伝がてら機能の紹介をします。

Usage

CloudFormation

AWSTemplateFormatVersion: 2010-09-09
Description: "sample-custom-policy"
Resources:
  samplePolicy:
    Type: AWS::Config::ConfigRule
    Properties: 
      ConfigRuleName: sample-custom-policy
      Description: sample-custom-policy
      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

CFnでのつらいとこ

  • AWS::Config::ConfigRuleの使用を見てもCustomPolicy特有のセッティングがわかりづらい
    • ManagedRule, CustomRule(Lambda)と同じリソースのため
  • ルールファイル(.guard)をテンプレートへ埋め込みが必須。
    • CloudFormation Guard CLIで扱ったファイルを、なぜかYAMLに埋め込むのはイヤですよね?!

CDK

lib/sample.guard
let latest = ["io2", "gp3", "sc1", "st1"]

rule checkcompliance when
  resourceType == "AWS::EC2::Volume" {
  configuration.volumeType IN %latest
}
import { Stack, StackProps } from "aws-cdk-lib";
import { Construct } from "constructs";
import * as config from "aws-cdk-lib/aws-config";
import { readFileSync } from "fs";

export class TestStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const samplePolicyText: string = readFileSync("lib/sample.guard", 'utf8')
    
    new config.CustomPolicy(this, "Custom", {
      policyText: samplePolicyText,
      enableDebugLog: true,
      ruleScope: config.RuleScope.fromResources([
        config.ResourceType.EBS_VOLUME,
      ]),
    });
   }
}

CDKではCustomPolicyの本質的な部分だけ設定すればいいので、かなり見通しが良くなったと思います。やったぜ。

課題

実は開発中のテストコードではguardファイルでなく、ルールを文字列として扱っているので気づきませんでしたが、いざサンプルを書くとファイル読み込み周りが面倒ですね。

私たちが本当にやりたいのは、やっぱりこれなんだよなあ。。。

new config.CustomPolicy(this, "Custom", {
    policyText: config.Guard.fromInline(code),
...
new config.CustomPolicy(this, "Custom", {
    policyText: config.Guard.fromBucket(Bucket, Key),
...

上記のようにread周りを改善したいので、もう少しだけ待っていてほしい。

まとめ

ファイル読み込み周りに課題は残るが、基本的に素のCFnよりは便利になったはずなので使ってあげてください。気になるところはissue拾うので起票もお願いします。

Appendix.

手前味噌その2。
config.ResourceTypeには指定できないリソースタイプが結構あったのだが、最新含め不足ぶんを追加したので、こちらも簡単に補完できるはずだ。(60種類前後を追加したはず)
https://github.com/aws/aws-cdk/pull/21491/
https://github.com/aws/aws-cdk/pull/22408

Discussion