⛏️
CDK Construct tree viewになるとき、ならないとき
はじめに
こんなニュースが。
CDK Construct tree view、いいなあ。CloudFormation(以下CFn)のマネコンでCDKの階層構造がわかるの便利だなあ。ということで試してみました。
CDK Construct tree viewを試してみる
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class S3Stack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, "sample", {
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
enforceSSL: true
})
}
}
上記のようなコードをcdk deploy
し、バケットを作ると?
なるほど。BucketPolicyがBucketに紐づいていて、読みやすいですね! VPCやECSのように関連リソースが多いものだともっと便利そう。
もうすこし試してみたい!
1. CDKで実行するCFnテンプレートを手動デプロイ
CFnでDeploy済みのリソースたちはこのTree Viewでは管理されていない。この差は何だろう?
前にこの記事でも書いたけど、CDKが生成するCFnテンプレートはメタデータを持っている。
CFnのコンソールがtree viewを使えるかは、まさにこのメタデータを見ているのではないだろうか? 試してみましょう。
# 先ほどのコードをCFn
cdk synth > sample1.yaml
# deploy
aws cloudformation create-stack --stack-name sample-1 --template-body file://sample1.yaml
Treeになりませんでした!結果としては問題ないのですが、マネコンはどこを見てるんでしょうねえ。。。(CDK Bootstrapリソースのどこか?)
2. L1 Constructsで書いた場合
L2と(ほぼ)同じ構成をL1で書きなおす。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class S3Stack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// new s3.Bucket(this, "sample", {
// blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
// enforceSSL: true
// })
const bucket = new s3.CfnBucket(this, "sample-l1", {
bucketName: "<mybucketname>",
publicAccessBlockConfiguration: {
blockPublicAcls: true,
blockPublicPolicy: true,
ignorePublicAcls: true,
restrictPublicBuckets: true,
}
})
const policy = {
"Id": "ExamplePolicy",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSSLRequestsOnly",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
`arn:aws:s3:::${bucket.ref}`,
`arn:aws:s3:::${bucket.ref}/*`
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
},
"Principal": "*"
}
]
}
new s3.CfnBucketPolicy(this, 'MyCfnBucketPolicy', {
bucket: bucket.ref,
policyDocument: policy
});
}
}
L1 Constructsはそれぞれ1リソース=Treeにならない。なるほど。
それはともかく、なぜかBucketが隠れてしまいました。なんでぇ……
わかったこと
リリースされたばかりの機能なので課題はありそうですが、CDK Userには基本うれしい機能なのでいろいろ試してみたいですねー。
Discussion