実現しようとしていたこと
CloudFormationでプライベートサブネットを作成する
使用したファイル(抜粋)
SubnetPrivate1A:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.1.0/24
VpcId:
Ref: sbcntrVpc
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: ""
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: subnet-private-1a
- Key: Type
Value: Isolated
SubnetPrivate1C:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.2.0/24
VpcId:
Ref: sbcntrVpc
AvailabilityZone:
Fn::Select:
- 1
- Fn::GetAZs: ""
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: subnet-private-1c
- Key: Type
Value: Isolated
CloudFormation実行結果
SubnetPrivate1Cの作成で以下のエラーが発生。
Template error: Fn::Select cannot select nonexistent value at index 1
結論
Fn::GetAZsを使用するにあたり、デフォルトVPCを残していたことが原因。
デフォルトVPCを削除してCloudFormationを実行したところ成功した。
詳細
Fn::GetAZsの公式ドキュメント に以下の記載があった。
デフォルト サブネットがあるアベイラビリティーゾーンがない場合を除き、Fn::GetAZs 関数はデフォルト サブネットがあるアベイラビリティーゾーンのみを返します。その場合、すべてのアベイラビリティーゾーンが返されます。
日本語の文章がイマイチなので理解しづらかったので、ざっくり言うと次の通り。
- デフォルトVPCを残している場合
- デフォルトVPCのあるAZのみを返す
- デフォルトVPCを削除している場合
- VPC内のAZ全てを返す
今回の希望は後者である「VPC内のAZ全てを返す」であった。
そのためデフォルトVPCを削除して、再実行したところ成功した。
デフォルトVPC削除について
デフォルトVPCはデフォルトルートの宛先がAny(0.0.0.0/0)となっており、そのまま使用するには危険性が高いとのこと。
また、再作成できるため使用予定が無ければ削除しておくのが無難。
参考