⛏️

CDK Construct tree viewになるとき、ならないとき

2022/09/15に公開

はじめに

こんなニュースが。

https://aws.amazon.com/jp/about-aws/whats-new/2022/09/aws-cloud-development-kit-cdk-announces-cdk-construct-tree-view-cloudformation-console/

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テンプレートはメタデータを持っている。
https://zenn.dev/watany/articles/d68316811c7112

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