互联网网关的 AWS CloudFormation 错误
AWS CloudFormation Errors with Internet Gateway
这里是 CloudFormation 初学者。我一直在研究并致力于开发 CloudFormation 模板,该模板最终将用作我的团队开发环境的起点。
我一直在通过一些在线课程和示例进行点点滴滴的挑选,并且在我的小尝试中相对成功......直到今晚。
我现在正尝试将 Internet 网关连接到我的 VPC,这导致堆栈创建作业失败并回滚。 Internet 网关不会连接,我无法确定原因。
我的完整模板在这里。计划是创建一个具有 2 public 和 2 个私有子网的 VPC。将有一个互联网网关连接到 2 public 个子网。这就是失败的来源。如果我注释掉 Internet 网关创建,则模板成功。在此先感谢您的帮助。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DevVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
InstanceTenancy: default
Tags:
- Key: Name
Value: dev-vpc
DevRoute53HostedZone:
Type: "AWS::Route53::HostedZone"
Properties:
HostedZoneConfig:
Comment: "aws hosted dev environment"
Name: "mydomain.oregon-dev.local"
VPCs:
-
VPCId: !Ref DevVPC
VPCRegion: "us-west-2"
DevPublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.8.0/25
AvailabilityZone: "us-west-2a"
Tags:
- Key: Name
Value: DevPublicSubnetA
DevPublicSubnetB:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.8.128/25
AvailabilityZone: "us-west-2b"
Tags:
- Key: Name
Value: DevPublicSubnetB
DevPrivateSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.9.0/25
AvailabilityZone: "us-west-2a"
Tags:
- Key: Name
Value: DevPrivateSubnetA
DevPrivateSubnetB:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.9.128/25
AvailabilityZone: "us-west-2b"
Tags:
- Key: Name
Value: DevPrivateSubnetB
RouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: DevVPC
Tags:
- Key: Name
Value: DevRouteTable
DevRoute:
Type: AWS::EC2::Route
DependsOn: NonProdNATGateway
Properties:
RouteTableId:
Ref: RouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: NonProdNATGateway
NonProdNATEIP:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
NonProdNATGateway:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt NonProdNATEIP.AllocationId
SubnetId: !Ref DevPublicSubnetA
SubnetId: !Ref DevPublicSubnetB
DependsOn:
- NonProdNATEIP
- DevPublicSubnetA
- DevPublicSubnetB
NonProdGWVPCAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref NonProdNATGateway
VpcId: !Ref DevVPC
DependsOn:
- NonProdNATGateway
Route:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: RouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: NonProdNATGateway
PrivateRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref RouteTable
SubnetId: !Ref DevPrivateSubnetA
SubnetId: !Ref DevPrivateSubnetB
PublicRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref RouteTable
SubnetId: !Ref DevPublicSubnetA
SubnetId: !Ref DevPublicSubnetB
Mappings:
R53EnvironmentMapping:
dev:
oregonawslocal: mydomain.oregon-dev.local
Outputs:
DevPublicSubnetA:
Description: ID for dev subnet A
Value: !Ref DevPublicSubnetA
Export:
Name: DevPublicSubnetA
DevPublicSubnetB:
Description: ID for dev subnet B
Value: !Ref DevPublicSubnetB
Export:
Name: DevPublicSubnetB
DevPrivateSubnetA:
Description: ID for dev subnet A
Value: !Ref DevPrivateSubnetA
Export:
Name: DevPrivateSubnetA
DevPrivateSubnetB:
Description: ID for dev subnet B
Value: !Ref DevPrivateSubnetB
Export:
Name: DevPrivateSubnetB
DevRoute53OregonAWSLocalHostedZone:
Description: Hosted zone ID for hosted zone
Value: !Ref DevRoute53HostedZone
Export:
Name: DevRoute53OregonAWSLocalHostedZone
DevRoute53OregonAWSLocalHostedZoneName:
Description: Hosted zone name for hosted zone
Value: !FindInMap [R53EnvironmentMapping, dev, oregonawslocal]
Export:
Name: DevRoute53OregonAWSLocalHostedZoneName
作为 Michael - sqlbot mentioned in a , one issue is that you're referencing an AWS::EC2::NATGateway
resource in the AWS::EC2::VPCGatewayAttachment
resource's InternetGatewayId
property, which requires an AWS::EC2::InternetGateway
资源。
NAT Gateways and Internet Gateways 是两种不同类型的 AWS 资源 - NAT 网关提供 outbound-only 对私有子网的 Internet 访问,而 Internet 网关提供 two-way 对 public 子网。
另一个问题是您需要两组独立的 AWS::EC2::RouteTable
and AWS::EC2::Route
Resources, one set for your public Subnet and another for your private Subnet. The public Route should have GatewayId
referencing the Internet Gateway, and the private Route should have NatGatewayId
引用 NAT 网关。
最后,您在多个资源(NatGateway
、SubnetRouteTableAssociation
)中有一些无效的重复 SubnetId
属性 - 这些资源中的每一个仅点接受一个子网 ID。
由于您是 CloudFormation 初学者,我强烈建议您利用 AWS Quick Start's Amazon VPC Architecture template 参考 VPC 架构快速入门。此 AWS-supported 模板创建一个 VPC,其中包含每个指定可用区内的 public 和私有子网(您提供 2-4 个可用区作为参数)。如有必要,您稍后可以自定义此模板以更好地满足您的特定需求,或将其用作配置您自己的模板资源的参考。
这里是 CloudFormation 初学者。我一直在研究并致力于开发 CloudFormation 模板,该模板最终将用作我的团队开发环境的起点。
我一直在通过一些在线课程和示例进行点点滴滴的挑选,并且在我的小尝试中相对成功......直到今晚。
我现在正尝试将 Internet 网关连接到我的 VPC,这导致堆栈创建作业失败并回滚。 Internet 网关不会连接,我无法确定原因。
我的完整模板在这里。计划是创建一个具有 2 public 和 2 个私有子网的 VPC。将有一个互联网网关连接到 2 public 个子网。这就是失败的来源。如果我注释掉 Internet 网关创建,则模板成功。在此先感谢您的帮助。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DevVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
InstanceTenancy: default
Tags:
- Key: Name
Value: dev-vpc
DevRoute53HostedZone:
Type: "AWS::Route53::HostedZone"
Properties:
HostedZoneConfig:
Comment: "aws hosted dev environment"
Name: "mydomain.oregon-dev.local"
VPCs:
-
VPCId: !Ref DevVPC
VPCRegion: "us-west-2"
DevPublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.8.0/25
AvailabilityZone: "us-west-2a"
Tags:
- Key: Name
Value: DevPublicSubnetA
DevPublicSubnetB:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.8.128/25
AvailabilityZone: "us-west-2b"
Tags:
- Key: Name
Value: DevPublicSubnetB
DevPrivateSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.9.0/25
AvailabilityZone: "us-west-2a"
Tags:
- Key: Name
Value: DevPrivateSubnetA
DevPrivateSubnetB:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref DevVPC
CidrBlock: 10.0.9.128/25
AvailabilityZone: "us-west-2b"
Tags:
- Key: Name
Value: DevPrivateSubnetB
RouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: DevVPC
Tags:
- Key: Name
Value: DevRouteTable
DevRoute:
Type: AWS::EC2::Route
DependsOn: NonProdNATGateway
Properties:
RouteTableId:
Ref: RouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: NonProdNATGateway
NonProdNATEIP:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
NonProdNATGateway:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt NonProdNATEIP.AllocationId
SubnetId: !Ref DevPublicSubnetA
SubnetId: !Ref DevPublicSubnetB
DependsOn:
- NonProdNATEIP
- DevPublicSubnetA
- DevPublicSubnetB
NonProdGWVPCAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref NonProdNATGateway
VpcId: !Ref DevVPC
DependsOn:
- NonProdNATGateway
Route:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: RouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: NonProdNATGateway
PrivateRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref RouteTable
SubnetId: !Ref DevPrivateSubnetA
SubnetId: !Ref DevPrivateSubnetB
PublicRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref RouteTable
SubnetId: !Ref DevPublicSubnetA
SubnetId: !Ref DevPublicSubnetB
Mappings:
R53EnvironmentMapping:
dev:
oregonawslocal: mydomain.oregon-dev.local
Outputs:
DevPublicSubnetA:
Description: ID for dev subnet A
Value: !Ref DevPublicSubnetA
Export:
Name: DevPublicSubnetA
DevPublicSubnetB:
Description: ID for dev subnet B
Value: !Ref DevPublicSubnetB
Export:
Name: DevPublicSubnetB
DevPrivateSubnetA:
Description: ID for dev subnet A
Value: !Ref DevPrivateSubnetA
Export:
Name: DevPrivateSubnetA
DevPrivateSubnetB:
Description: ID for dev subnet B
Value: !Ref DevPrivateSubnetB
Export:
Name: DevPrivateSubnetB
DevRoute53OregonAWSLocalHostedZone:
Description: Hosted zone ID for hosted zone
Value: !Ref DevRoute53HostedZone
Export:
Name: DevRoute53OregonAWSLocalHostedZone
DevRoute53OregonAWSLocalHostedZoneName:
Description: Hosted zone name for hosted zone
Value: !FindInMap [R53EnvironmentMapping, dev, oregonawslocal]
Export:
Name: DevRoute53OregonAWSLocalHostedZoneName
作为 Michael - sqlbot mentioned in a AWS::EC2::NATGateway
resource in the AWS::EC2::VPCGatewayAttachment
resource's InternetGatewayId
property, which requires an AWS::EC2::InternetGateway
资源。
NAT Gateways and Internet Gateways 是两种不同类型的 AWS 资源 - NAT 网关提供 outbound-only 对私有子网的 Internet 访问,而 Internet 网关提供 two-way 对 public 子网。
另一个问题是您需要两组独立的 AWS::EC2::RouteTable
and AWS::EC2::Route
Resources, one set for your public Subnet and another for your private Subnet. The public Route should have GatewayId
referencing the Internet Gateway, and the private Route should have NatGatewayId
引用 NAT 网关。
最后,您在多个资源(NatGateway
、SubnetRouteTableAssociation
)中有一些无效的重复 SubnetId
属性 - 这些资源中的每一个仅点接受一个子网 ID。
由于您是 CloudFormation 初学者,我强烈建议您利用 AWS Quick Start's Amazon VPC Architecture template 参考 VPC 架构快速入门。此 AWS-supported 模板创建一个 VPC,其中包含每个指定可用区内的 public 和私有子网(您提供 2-4 个可用区作为参数)。如有必要,您稍后可以自定义此模板以更好地满足您的特定需求,或将其用作配置您自己的模板资源的参考。