CloudFormationでルートテーブルを構築する際にGatewayIdとNATGatewayIdを間違えると、スタック作成が終わらないことがある
はじめに
こんにちは、おのやんです。
みなさん、CloudFormationでリソースを構築する際に、スタック作成が終わらない現象に出くわしたことはありませんか?私はあります。
今回の私のケースだと、CloudFormationテンプレートに誤った設定を記述していたのが原因でした。
ということで、今回はそんな謎現象の詳細と原因・対処法について紹介していきます。
スタック作成が永遠に終わらない現象の詳細
CloudFormationにテンプレートを食わせてVPCを構築していた時のことです。VPCのスタック作成が、ある箇所から進まないことに気づきました。
詳しく調べてみると、どうやらルートテーブルでのNATゲートウェイ作成がうまく行っていないようです。
この状態で20分ほど放置すると、Exceeded attempts to wait
というメッセージを吐いて、スタック作成が失敗しました。
こちらに、CloudFormationテンプレートの該当箇所を示します。
AWSTemplateFormatVersion: "2010-09-09" Description: VPC Network Set Resources: ... NATGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt EIP.AllocationId SubnetId: !Ref Public1a NATRoute: Type: "AWS::EC2::Route" Properties: RouteTableId: !Ref PrivateRTB DestinationCidrBlock: "0.0.0.0/0" GatewayId: !Ref NATGateway ...
原因・対処法
結論から言うと、GatewayId
のキーにNATゲートウェイを指定していたことが原因でした。
本来は、NatGatewayId
というキーに対してNATゲートウェイを指定するのが正しい書き方になります。
こちらが、正しいCloudFormationテンプレートになります。
AWSTemplateFormatVersion: "2010-09-09" Description: VPC Network Set Resources: NATGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt EIP.AllocationId SubnetId: !Ref Public1a NATRoute: Type: "AWS::EC2::Route" Properties: RouteTableId: !Ref PrivateRTB DestinationCidrBlock: "0.0.0.0/0" # GatewayId: !Ref NATGateway # この書き方が間違っている NatGatewayId: !Ref NATGateway # こっちが正しい
公式ドキュメントの方にも「GatewayId
に設定できるのは、インターネットゲートウェイと仮装プライベートゲートウェイだけやで」としっかり書かれています。
GatewayId
The ID of an internet gateway or virtual private gateway attached to your VPC.
GatewayId
, NATGatewayId
と字面が似ているため、私と同じように「GatewayIdでNATゲートウェイも指定できるだろう」と疑いもせず設定しているかもしれません。もう一度しっかりチェックしてみましょう。
さいごに
エラーを吐くわけでもなく、ただスタック作成が終わらないという現象のため、初見で見つけた時にはどう対処するべきか戸惑うかもしれません。
そういった際は、「Linterはエラー吐いてないから、テンプレートの設定項目は原因ではないな〜」などと決めつけずに、まずは前提から疑ってみましょう。
案外、ちょっとしたミスが原因だったりするかもしれません。では!