Amazon web services Terraform:如果在AZ中未找到EC2实例类型产品,则处理错误
我们正在通过Terraform在AWS中旋转G4实例,并且经常遇到给定区域中的一个或两个AZ不支持G4实例类型的问题 到目前为止,我已经按照下面的内容硬编码了我们的TF配置,我正在创建一个区域地图,AZs作为“AZs”变量。从这张地图上,我可以在我们有G4实例支持的区域的目标AZ中启动集群 我使用本文中提到的aws命令行查找给定区域中支持哪些AZs,并在扩展到其他区域时更新“AZs”变量Amazon web services Terraform:如果在AZ中未找到EC2实例类型产品,则处理错误,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,我们正在通过Terraform在AWS中旋转G4实例,并且经常遇到给定区域中的一个或两个AZ不支持G4实例类型的问题 到目前为止,我已经按照下面的内容硬编码了我们的TF配置,我正在创建一个区域地图,AZs作为“AZs”变量。从这张地图上,我可以在我们有G4实例支持的区域的目标AZ中启动集群 我使用本文中提到的aws命令行查找给定区域中支持哪些AZs,并在扩展到其他区域时更新“AZs”变量 variable "azs" { default = { "us-
variable "azs" {
default = {
"us-west-2" = "us-west-2a,us-west-2b,us-west-2c"
"us-east-1" = "us-east-1a,us-east-1b,us-east-1e"
"eu-west-1" = "eu-west-1a,eu-west-1b,eu-west-1c"
"eu-west-2" = "eu-west-2a,eu-west-2b,eu-west-2c"
"eu-west-3" = "eu-west-3a,eu-west-3c"
}
然而,上述方法需要人工干预和频繁更新(如果AWS随后在给定区域向不受支持的AZ添加支持)
在这种情况下,用户尝试做同样的事情,但是他可以使用回退实例类型,比如说,给定实例类型是否不支持任何AZ
在我的用例中,我不能使用任何其他回退实例类型,因为我们的应用服务器只在G4上运行
我曾尝试使用上面提到的解决方法作为上述堆栈溢出问题的答案,但由于以下错误消息而失败
错误:未找到符合条件的EC2实例类型产品;尝试
不同的搜索
在main.tf第8行的数据“aws_ec2_实例_类型_产品”中
“示例”:8:数据“aws_ec2_实例_类型_产品”“示例”{
我正在使用TF配置,如下所示,其中我的首选实例类型是g4dn.xlarge
provider "aws" {
version = "2.70"
}
data "aws_availability_zones" "all" {
state = "available"
}
data "aws_ec2_instance_type_offering" "example" {
for_each = toset(data.aws_availability_zones.all.names)
filter {
name = "instance-type"
values = ["g4dn.xlarge"]
}
filter {
name = "location"
values = [each.value]
}
location_type = "availability-zone"
preferred_instance_types = ["g4dn.xlarge"]
}
output "foo" {
value = { for az, details in data.aws_ec2_instance_type_offering.example : az => details.instance_type }
}
我想知道如何处理此故障,因为Terraform无法在给定区域的AZ中找到g4实例类型,因此失败
有没有什么Terraform错误处理方法可以让我暂时绕过这个错误,并将支持的AZs作为输出?我已经检查了您前面提到的其他问题,但我始终无法正确地获得输出。感谢@ydaetskcoR在那篇文章中的回答-我可以学到一些东西,并让我的循环工作起来
这里有一个方法来完成你正在寻找的…让我知道它是否适合你
使用“”,而不是“”。(最后有一个“s”。它们是不同的数据源
我只是将代码粘贴到这里,并假设您能够解码逻辑。我正在筛选一个特定的实例类型,如果不支持,则实例类型将为黑色,并且我创建了一个没有空值的AZ列表
variable "az" {
default="us-east-1"
}
variable "my_inst" {
default="g4dn.xlarge"
}
data "aws_availability_zones" "example" {
filter {
name = "opt-in-status"
values = ["opt-in-not-required"]
}
}
data "aws_ec2_instance_type_offerings" "example" {
for_each=toset(data.aws_availability_zones.example.names)
filter {
name = "instance-type"
values = [var.my_inst]
}
filter {
name = "location"
values = ["${each.key}"]
}
location_type = "availability-zone"
}
output "az_where_inst_avail" {
value = keys({ for az, details in data.aws_ec2_instance_type_offerings.example :
az => details.instance_types if length(details.instance_types) != 0 })
}
输出如下所示。us-east-1e没有实例类型,并且它不在输出中。请测试一些情况,看看它是否每次都有效
Outputs:
az_where_inst_avail = [
"us-east-1a",
"us-east-1b",
"us-east-1c",
"us-east-1d",
"us-east-1f",
]
您希望实现什么?如果没有可用的g4dn.xlarge
实例,那么做什么?如果AZ不支持g4dn.xlarge,则从输出中跳过它,而不是错误地失败。您是否尝试过放置虚拟实例类型(例如t2.micro
)你知道存在于所有AZ中,然后使用该答案中描述的AZ过滤?是的,我使用了虚拟实例类型或回退,换句话说,如果AZ中没有g4dn.xlarge
,则不会失败。但是,这些回退实例类型在某些AZ中也不可用。回退实例类型I ha到目前为止,我试过的是t2.micro
,t2.nano
,t3.micro
一些C系列