【问题标题】:Is there a way for cloudformation to query available zones for subnet creation?cloudformation 有没有办法查询可用区域以创建子网?
【发布时间】:2014-02-18 20:34:32
【问题描述】:

我有一个 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.", 

我正在指定可用区

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

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

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation availability-zone


    【解决方案1】:

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

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

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

    【讨论】:

    • 不能将它们留空,因为我们正在创建一个在每个 AZ 中具有子网的 VPC - 问题不是返回的每个 AZ 都允许子网!
    • 因此,如果一个区域不允许 VPC 子网,那么使用您在 VPC 中托管的它有什么意义?只需忽略该区域并处理支持它的 3 个区域。
    • 这是一个手动过程 - 如果我基于 Fn::Select 索引 0、1 和 2 创建子网,它有时会失败,因为实际上有 4 个可用区,但并非每个可用区都允许子网
    • 您可以为其提供 AZ 列表,而不是使用 Fn::GetAZs。如果要创建 3 个不同的子网,则定义 3 个不同的堆栈资源,每个资源引用特定的区域。
    • 我实施的“解决方案”是为每个账户使用一个映射,将真正可用的可用区作为映射中的值之一。
    【解决方案2】:

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

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

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

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

    有关CloudFormation 参数的更多信息

    【讨论】:

    • Fn::GetAZs 将提供可用和可用的可用区,只要您在每个 AZ 中都有一个带有子网的默认 vpc!顺便说一句,只要您不手动删除它们,所有新的 aws 帐户都会有。
    • @Naveen 我认为在你的 sn-p 中你的意思是:List<AWS::EC2::AvailabilityZone::Name> 而不是 AWS::EC2::AvailabilityZone::Name
    【解决方案3】:

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

    【讨论】:

    • 我看到 Fn::GetAZs 返回不可用的区域。
    • 那么你没有默认子网
    • 这是一个非常有趣的“功能”。这在 AWS Docs 的任何地方都有记录吗?
    • 如果您缺少 AZ 的默认子网(因为 AWS 添加了 AZ 或因为您删除了现有的默认子网),您可以使用 aws ec2 create-default-subnet --availability-zone <zone_name> 将其添加回来。 Docs
    • 你真的让我免于失去理智,谢谢!
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多