【问题标题】:Terraform: How to request AWS EC2 instances only in zones where the requested instance type is supported?Terraform:如何仅在支持请求的实例类型的区域中请求 AWS EC2 实例?
【发布时间】:2021-01-06 04:26:30
【问题描述】:

有没有办法在请求实例之前获取实例类型(例如 t3.medium)可用的可用区?我正在尝试运行following code,但对于某些地区,它会失败并出现以下错误:

Error: Error launching source instance: Unsupported: Your requested instance type (t3.micro) is not supported in your requested Availability Zone (us-east-1e). Please retry your request by not specifying an Availability Zone or choosing us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f.

显然我可以手动将可用区域指定为受支持的区域之一,但我想尽量减少硬编码可用区域。

【问题讨论】:

  • 您有机会检查 ec2_instance_type_offering 资源吗? registry.terraform.io/providers/hashicorp/aws/latest/docs/…
  • 感谢@DmitryKutetsky,这看起来很有希望!我现在正在尝试
  • @DmitryKutetsky 这个数据源基本上只返回给定位置的 AWS 名称,这与我想要的有点相反。
  • 可能,您需要先检查 AWS API 以确保它可以提供所需的方法。在此之后,您可以搜索相关的 terraform 资源(检查社区提供者作为选项)。否则,terraform 将无法执行此操作,因为它通过 AWS API 运行,因此如果没有方法,则 terraform 无法实现此操作。

标签: amazon-web-services amazon-ec2 terraform terraform-provider-aws


【解决方案1】:

如 cmets 中所述,如果您愿意在首选类型不可用的情况下启动不同类型的实例,那么您可以使用 aws_ec2_instance_type_offering data source 替代回退到 t2 实例系列受影响的可用区。

以下 Terraform 代码将输出可用区映射到允许的实例类型,首选 t3.micro,但在 t3 系列不可用的情况下回退到 t2.micros:

provider "aws" {
  region = "us-east-1"
}

data "aws_availability_zones" "all" {}

data "aws_ec2_instance_type_offering" "example" {
  for_each = toset(data.aws_availability_zones.all.names)

  filter {
    name   = "instance-type"
    values = ["t2.micro", "t3.micro"]
  }

  filter {
    name   = "location"
    values = [each.value]
  }

  location_type = "availability-zone"

  preferred_instance_types = ["t3.micro", "t2.micro"]
}

output "foo" {
  value = { for az, details in data.aws_ec2_instance_type_offering.example : az => details.instance_type }
}

这个输出:

foo = {
  "us-east-1a" = "t3.micro"
  "us-east-1b" = "t3.micro"
  "us-east-1c" = "t3.micro"
  "us-east-1d" = "t3.micro"
  "us-east-1e" = "t2.micro"
  "us-east-1f" = "t3.micro"
}

您应该能够迭代可用区以设置aws_instance 资源的实例类型,而不仅仅是输出此内容。

或者,您可以过滤输出,通过将输出更改为以下内容,将其缩减为仅可提供t3 实例系列的可用区列表:

output "foo" {
  value = keys({ for az, details in data.aws_ec2_instance_type_offering.example : az => details.instance_type if details.instance_type == "t3.micro" })
}

这会输出以下内容,跳过不包括 t3 实例系列的可用区:

foo = [
  "us-east-1a",
  "us-east-1b",
  "us-east-1c",
  "us-east-1d",
  "us-east-1f",
]

【讨论】:

  • 谢谢@ydaetskcoR!这正是我想要做的,我无法正确使用 for 循环!
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多