AWS CDKで生成されるCloudformationリソースの一部を削除したいとき

発生した課題

 AWS CDKのL2 ConstructのSubnet(ドキュメント)を利用してSubnetを生成している。ConstructはCloudformationのAWS::EC2::Subnet,AWS::EC2::RouteTable,AWS::EC2::SubnetRouteTableAssociationを生成する。SubnetとRouteTableを生成し、その二つのアタッチまでやってくれる。

しかし、今の環境ではRouteTableを別途生成されたものを利用する必要があり、生成されたRouteTableを手で削除してテンプレートを修正しようとすると、RouteTableがないとエラーになり、修正ができなくなってしまった…。

 

解決策

 すぐ思いつく方法としては、L1 ConstructのCfnSubnetで生成する方法である。ただ、今回はL2 Subnetのipv4CidrBlockを別のリソースで利用していて、広い範囲でコードを修正しないといけなかった。
(なんで、AWS::EC2::SubnetはgetAttでipv4CidrBlockをゲットできないのか…ipv6はできるのに…?)

 他の方法はないかと検索してみたら、githubのAWS CDKに同じ問題のissueがあり、そこで方法を探すことができた(https://github.com/aws/aws-cdk/issues/4308)。

subnetA.node.tryRemoveChild('RouteTableAssociation')
subnetA.node.tryRemoveChild('RouteTable')

 上記のコードを追加し、再度デプロイを試したら、無事Subnetのみをデプロイすることができた。

 

コメント

 AWS CDKのL2 Constructは、今回のRouteTableとAssociationやIAMの権限など普段使うことには便利ではある。しかし、実際の業務ではいろんな制約があるので、それをCDKに取り入れようとするとややこしくなる場合が多い。今回の場合も、無理やり削除している感があったり、最初にこのことに気づいたらL1 Constructを利用していただろう。L1 Constructでもコードで書くことに利点(for文やif文など)は受けているが、これで正しい方法(ベストプラクティス)でCDKを利用しているのかな?という疑問にいつも悩んている。そもそも、こういう制約が多い環境にCDKが向いてないのかな…?なかなか難しい…。

P.S. 1年前はあんなにCDKを利用したくて仕方がなかったのに…笑

Popular Posts

CloudWatch EventsはAmazon EventBridgeになるらしい

PythonのDict型をDynamoDB形式のJsonに変換する

CloudFormationテンプレート内のStep functionsのState machine定義をS3に置けるようになった