Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Terraform:如果在AZ中未找到EC2实例类型产品,则处理错误_Amazon Web Services_Terraform_Terraform Provider Aws - Fatal编程技术网

Amazon web services Terraform:如果在AZ中未找到EC2实例类型产品,则处理错误

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-

我们正在通过Terraform在AWS中旋转G4实例,并且经常遇到给定区域中的一个或两个AZ不支持G4实例类型的问题

到目前为止,我已经按照下面的内容硬编码了我们的TF配置,我正在创建一个区域地图,AZs作为“AZs”变量。从这张地图上,我可以在我们有G4实例支持的区域的目标AZ中启动集群

我使用本文中提到的aws命令行查找给定区域中支持哪些AZs,并在扩展到其他区域时更新“AZs”变量

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系列