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を利用したくて仕方がなかったのに…笑