🎇
AWS CDK が Config Custom Policy Rulesに対応しました。
はじめに
CDKでも早くデプロイしてみたいですね。L2 Constructsも作るか!?
このブログから3か月が経ち、紆余曲折ありましたが無事にConstructsを作ることができました。2022/10/21 リリースのv2.47.0から使えます🚀 やったー!
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種類前後を追加したはず)
Discussion