26

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

当我运行时:

aws ec2 describe-availablity-zones

我返回了 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"
    }
 ]

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

  "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.", 

我正在指定 AZ

      "AvailabilityZone" : {
        "Fn::Select" : [ "0", { "Fn::GetAZs" : "" } ]
      },

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

4

4 回答 4

9

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

通过 CloudFormation 参数的最新更新,您将能够精确定位与指定 AZ 相关的 AZ。

这在 DR / DR 演习期间非常方便,并使 CFN 模板区域独立。

在此处输入图像描述

"Parameters": {
    "SubnetAZ": {
      "Description": "Availability Zone of the Subnet",
      "Type": "AWS::EC2::AvailabilityZone::Name"
    }
}

有关CloudFormation参数的更多信息

于 2015-06-03T08:40:41.910 回答
6

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

“AvailabilityZone”:“us-east-1b”

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

于 2014-01-29T20:32:51.350 回答
5

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

于 2016-11-17T15:07:24.970 回答
-3

我通过避免使用 json 作为表达媒介来绕过这个限制。我使用 troposphere 来编写我的 cloudformation 模板。(https://github.com/cloudtools/troposphere

但是,您必须围绕将 cloudformation 模板部署到各个区域部署某种工具。

于 2016-12-29T21:30:42.090 回答