route table rtb-xxxxx and network gateway igw-xxxxx belong to different networksと言われて困った時の話

More than 1 year has passed since last update.

概要

awsのcloudformationを使って色々管理してて、タイトルのようなエラーが出て困ったときの話です。
再現できたので、解決方法とか書いておこうと思います。
cloudformationのeventsは下記のような感じでした。

20:41:25 UTC+0900   UPDATE_ROLLBACK_IN_PROGRESS AWS::CloudFormation::Stack  test-stack  The following resource(s) failed to update: [WebGroup, PublicRoute, AttachGateway, SSHGroup, PublicSubnetA].
20:41:24 UTC+0900   UPDATE_FAILED   AWS::EC2::SecurityGroup WebGroup    Resource creation cancelled
20:41:24 UTC+0900   UPDATE_FAILED   AWS::EC2::SecurityGroup SSHGroup    Resource creation cancelled
20:41:18 UTC+0900   UPDATE_FAILED   AWS::EC2::VPCGatewayAttachment  AttachGateway   Resource update cancelled
20:41:18 UTC+0900   UPDATE_FAILED   AWS::EC2::Subnet    PublicSubnetA   Resource creation cancelled
20:41:17 UTC+0900   UPDATE_FAILED   AWS::EC2::Route PublicRoute route table rtb-xxxxx and network gateway igw-xxxxx belong to different networks
20:41:16 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::Route PublicRoute Requested update requires the creation of a new physical resource; hence creating one.
20:41:10 UTC+0900   UPDATE_COMPLETE AWS::EC2::RouteTable    PublicRouteTable    
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::RouteTable    PublicRouteTable    Resource creation Initiated
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::Subnet    PublicSubnetA   Resource creation Initiated
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::RouteTable    PublicRouteTable    Requested update requires the creation of a new physical resource; hence creating one.
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::SecurityGroup WebGroup    Requested update requires the creation of a new physical resource; hence creating one.
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::Subnet    PublicSubnetA   Requested update requires the creation of a new physical resource; hence creating one.
20:41:08 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::SecurityGroup SSHGroup    Requested update requires the creation of a new physical resource; hence creating one.
20:41:05 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::VPCGatewayAttachment  AttachGateway   
20:41:01 UTC+0900   UPDATE_COMPLETE AWS::EC2::VPC   VPC 
20:40:44 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::VPC   VPC Resource creation Initiated
20:40:43 UTC+0900   UPDATE_IN_PROGRESS  AWS::EC2::VPC   VPC Requested update requires the creation of a new physical resource; hence creating one.
20:40:29 UTC+0900   UPDATE_IN_PROGRESS  AWS::CloudFormation::Stack  test-stack  User Initiated

実際のテンプレート

テンプレート1(変更前)
https://gist.github.com/ara-ta3/27b47ec058710b419a28#file-cloudformation-template-for-error-before-json

テンプレート2(変更後)
https://gist.github.com/ara-ta3/27b47ec058710b419a28#file-cloudformation-template-for-error-after-json

変更前後でVPCとPublicSubnetのCIDRを変更してます。
間違えて作っちゃったんで変更してupdateするかみたいなシナリオです。

原因

VPCを変更したためRouteTableが作り直しになり、
InternetGatewayを参照しているRoute設定が作り直しになります。
さらに、VPCの変更によりInternetGatewayをAttachするVPCGatewayAttachmentも作り直しになるのですが、
RouteがVPCGatewayAttachmentに依存していることがここではわからないので、
Attachされる前のInternetGatewayを参照してしまうことで起きています。
なので、DependsOn属性をつければ解決されます。

DependsOnをつけて治したものがこれです。
https://gist.github.com/ara-ta3/27b47ec058710b419a28#file-cloudformation-template-for-error-fixed-json

これでupdate-stackすると成功しています。
https://gist.github.com/ara-ta3/27b47ec058710b419a28#file-cloudformation-events-tsv

参考