Terraform:如何仅在支持请求的实例类型的区域中请求 AWS EC2 实例?
Terraform: How to request AWS EC2 instances only in zones where the requested instance type is supported?
有没有办法在请求实例之前获取实例类型(例如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
实例系列的 AZ 列表:
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",
]
有没有办法在请求实例之前获取实例类型(例如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
实例系列的 AZ 列表:
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",
]