amazon-web-services - Terraform:如何仅在支持请求的实例类型的区域中请求 AWS EC2 实例?

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

有没有办法在请求实例之前获取实例类型(例如 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.
显然,我可以手动将可用区域指定为受支持的区域之一,但我想最小化硬编码可用区域。

最佳答案

正如评论中提到的,如果您愿意在首选类型不可用的情况下启动不同类型的实例,那么您可以使用 aws_ec2_instance_type_offering data source改为回退到 t2受影响的可用区中的实例系列。
以下 Terraform 代码将输出可用区映射到允许的实例类型,首选 t3.micro但回落到 t2.micro s在哪里t3家庭不可用:

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

关于amazon-web-services - Terraform:如何仅在支持请求的实例类型的区域中请求 AWS EC2 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63969173/

相关文章:

terraform - 如何在 Terraform 中的内插值前面发出 $ 文字?

amazon-web-services - 如何允许 Google Cloud Data Fusion 连接到 AWS RDS MySQL 数据库?

amazon-web-services - AWS - 通过 Cloudformation 创建的 SSH 到 EC2

terraform - 引用 Terraform 中的其他模块资源

mysql amazon ec2 "Can' t 创建测试文件“错误

amazon-web-services - 如何连接亚马逊EC2实例?

kubernetes - 使用 Terraform 启动 GKE 集群时如何引导 RBAC 权限

c++ - 如何等待PooledThreadExecutor完成?

grails - 在Amazon EC2上运行Grails应用程序

json - 用于创建 EC2 的 AWS CloudFormation 模板 - 列出 IAM 角色