Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services cloudformation是否有办法查询可用区域以创建子网?_Amazon Web Services_Amazon Cloudformation_Availability Zone - Fatal编程技术网

Amazon web services cloudformation是否有办法查询可用区域以创建子网?

Amazon web services cloudformation是否有办法查询可用区域以创建子网?,amazon-web-services,amazon-cloudformation,availability-zone,Amazon Web Services,Amazon Cloudformation,Availability Zone,我有一个cloudformation脚本,试图创建一个VPC,每个AZ有一个子网 当我跑步时: aws ec2 describe-availablity-zones 我返回了4个区域: "AvailabilityZones": [ { "State": "available", "RegionName": "us-east-1", "Messages": [], "ZoneName": "us-east-1a"

我有一个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是否真的可用于创建子网?

不幸的是,我也遇到了同样的问题。CloudFormation中没有这样做的方法,每个AWS帐户的分区可能不同。这是专有网络基础设施的一个限制,很可能不会改变。您唯一的选择是硬编码在CloudFOrmation模板中找到的区域,而不是Fn::Select,例如:

“可用区”:“us-east-1b”


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

这可能对CLI方法或您的具体场景没有帮助-但使用AWS管理控制台,这将非常顺利

通过最近对CloudFormation参数的更新,您将能够锁定与指定AZ相关的AZ

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

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


有关参数的更多信息

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

我通过避免使用json作为表达媒介来绕过这一限制。我使用对流层来构建我的云形成模板。()


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

不能将它们留空,因为我们正在创建一个VPC,每个AZ中都有子网-问题不是返回的每个AZ都允许子网!因此,如果一个区域不允许VPC子网,那么在VPC中使用它有什么意义?只需忽略该区域并处理支持该区域的3个区域。这是一个手动过程-如果我基于索引0、1和2的Fn::Select创建子网,它有时会失败,因为实际上有4个AZ,但不是每个AZ都允许子网。您可以向它提供AZ列表,而不是使用Fn::GetAZ。如果要创建3个不同的子网,请定义3个不同的堆栈资源,每个都引用特定区域。我实现的“解决方案”是为每个帐户使用映射,将真正可用的AZs作为映射中的一个值。Fn::GetAZs将提供可用和可用的可用性区域,只要您在每个AZ中有一个子网的默认vpc!顺便说一句,只要你不手动删除,所有新的aws帐户都有。@Naveen我想在你的代码片段中你的意思是:
List
而不是
aws::EC2::AvailabilityZone::Name
我看到Fn::GetAZs返回不可用的区域。那么你没有默认的子网这是一个非常有趣的“功能”。这在AWS文档中的任何地方都有记录吗?如果您缺少AZ的默认子网(因为AWS添加了AZ或因为您删除了现有的默认子网),您可以使用
AWS ec2创建默认子网-可用性区域
将其添加回来。你真的救了我的命,谢谢你!