有没有办法让cloudformation查询可用区域以创建子网?

chr*_*ris 24 amazon-web-services aws-cloudformation availability-zone

我有一个尝试创建VPC的cloudformation脚本,每个AZ有一个子网.

当我跑:

aws ec2 describe-availablity-zones
Run Code Online (Sandbox Code Playgroud)

我得到了4个区域:

"AvailabilityZones": [
    {
        "State": "available", 
        "RegionName": "us-east-1", 
        "Messages": [], 
        "ZoneName": "us-east-1a"
    }, 
    {
        "State": "available", 
        "RegionName": "us-east-1", 
        "Messages": [], 
        "ZoneName": "us-east-1b"
    }, 
    {
        "State": "available", 
        "RegionName": "us-east-1", 
        "Messages": [], 
        "ZoneName": "us-east-1c"
    }, 
    {
        "State": "available", 
        "RegionName": "us-east-1", 
        "Messages": [], 
        "ZoneName": "us-east-1d"
    }
 ]
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试创建堆栈时,出现错误:

  "ResourceStatusReason": "Value (us-east-1a) for parameter availabilityZone
   is invalid. Subnets can currently only be created in the following 
   availability zones: us-east-1c, us-east-1b, us-east-1d.", 
Run Code Online (Sandbox Code Playgroud)

我正在指定AZ

      "AvailabilityZone" : {
        "Fn::Select" : [ "0", { "Fn::GetAZs" : "" } ]
      },
Run Code Online (Sandbox Code Playgroud)

有没有办法检查AZ是否真的可用于创建子网?

Nav*_*jay 8

这可能对CLI方法或您的确切方案没有帮助 - 但使用AWS管理控制台,这可以顺利进行.

通过CloudFormation参数的最新更新,您可以精确定位与指定AZ相关的AZ.

在DR/DR演练期间以及使CFN模板区域独立时,这将非常方便.

在此输入图像描述

"Parameters": {
    "SubnetAZ": {
      "Description": "Availability Zone of the Subnet",
      "Type": "AWS::EC2::AvailabilityZone::Name"
    }
}
Run Code Online (Sandbox Code Playgroud)

有关CloudFormation参数的更多信息

  • 只要您在每个可用区都有一个带有子网的默认 vpc,Fn::GetAZs 就会提供可用和可用的可用区!顺便说一下,只要您不手动删除它们,所有新的 aws 帐户都有。 (2认同)

Ary*_*rya 6

不幸的是我遇到了同样的问题.CloudFormation中没有方法可以执行此操作,并且每个AWS账户的区域可以不同.这是VPC基础设施的限制,可能不会改变.您唯一的选择是硬编码您在CloudFOrmation模板中找到的区域而不是Fn :: Select,例如:

"AvailabilityZone":"us-east-1b"

或者,如果您将AvailabilityZone留空,则默认行为将是AWS将自动为您选择一个.

  • 我实现的"解决方案"是为每个帐户使用映射,将真正可用的AZ作为映射中的值之一. (2认同)

hel*_*bye 5

只要您在每个AZ中都有一个带子网的默认vpc,Fn :: GetAZs将提供可用和可用的可用区域!只要你不手动删除它们,所有新的aws帐户都有.

  • 如果您缺少 AZ 的默认子网(因为 AWS 添加了一个 AZ 或因为您删除了现有的默认子网),您可以使用 `aws ec2 create-default-subnet --availability-zone <zone_name>` 添加回来. [文档](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/default-vpc.html#create-default-subnet) (2认同)