CloudFormationでルートテーブルを構築する際にGatewayIdとNATGatewayIdを間違えると、スタック作成が終わらないことがある

エラーや不具合に遭遇した時には、「テンプレートの構文チェックはエラー吐いてないから、テンプレートの設定項目は原因ではないな〜」などと決めつけずに、まずは前提から疑ってみよう。
2023.10.30

はじめに

こんにちは、おのやんです。

みなさん、CloudFormationでリソースを構築する際に、スタック作成が終わらない現象に出くわしたことはありませんか?私はあります。

今回の私のケースだと、CloudFormationテンプレートに誤った設定を記述していたのが原因でした。

ということで、今回はそんな謎現象の詳細と原因・対処法について紹介していきます。

スタック作成が永遠に終わらない現象の詳細

CloudFormationにテンプレートを食わせてVPCを構築していた時のことです。VPCのスタック作成が、ある箇所から進まないことに気づきました。

詳しく調べてみると、どうやらルートテーブルでのNATゲートウェイ作成がうまく行っていないようです。

この状態で20分ほど放置すると、Exceeded attempts to waitというメッセージを吐いて、スタック作成が失敗しました。

こちらに、CloudFormationテンプレートの該当箇所を示します。

vpc.yaml

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テンプレートになります。

vpc.yaml

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はエラー吐いてないから、テンプレートの設定項目は原因ではないな〜」などと決めつけずに、まずは前提から疑ってみましょう。

案外、ちょっとしたミスが原因だったりするかもしれません。では!