1

有没有一种方法可以对存储桶使用 terraform 数据调用(可能已创建并存储在不同的状态文件中),然后如果数据中没有任何内容,则通过设置计数来创建资源?

我一直在做一些实验并不断得到以下结果:

Error: Failed getting S3 bucket (example_random_bucket_name): NotFound: Not Found
        status code: 404, request id: <ID here>, host id: <host ID here>

要测试的示例代码(已从生成此错误的原始代码修改):

variable "bucket_name" {
  default = "example_random_bucket_name"
}

data "aws_s3_bucket" "new" {
  bucket = var.bucket_name
}

resource "aws_s3_bucket" "s3_bucket" {
  count = try(1, data.aws_s3_bucket.new.id == "" ? 1 : 0 )
  bucket = var.bucket_name
}

我觉得我应该得到一个空的结果,而不是产生一个错误,但事实并非如此。

4

3 回答 3

2

可悲的是你不能这样做data sources必须存在,否则会出错。TF 中没有内置方式来检查资源是否存在。从某种意义上说,资源可能存在,也可能不存在,两者之间没有任何关系。

如果您需要此类功能,则必须使用External Data Source 自行编程。或者更简单,提供一个输入变量bucket_exist,以便在应用期间显式设置它。

于 2021-12-13T23:52:39.520 回答
2

Terraform 是一个期望状态系统,因此您只能描述您想要的结果,而不是达到目标的步骤/条件。

如果 Terraform确实允许您根据是否已经存在该名称的存储桶来决定是否声明存储桶,那么您将创建一个永远不会收敛的配置:在第一次运行时,它将不存在,因此您的配置将声明它. 但是在第二次运行时,存储桶将存在,因此您的配置将不再声明它,因此 Terraform 将计划销毁它。在第三次运行时,它会建议再次创建它,依此类推。

相反,作为系统设计的一部分,您必须决定哪个 Terraform 配置(或其他系统)负责管理每个对象:

  • 如果您决定由特定的 Terraform 配置负责管理此 S3 存储桶,则可以使用无条件 aws_s3_bucket资源声明它。
  • 如果您决定由其他系统管理存储桶,那么您将编写配置以某种方式从其他地方了解存储桶名称,例如通过输入变量或使用aws_s3_bucket数据源。
于 2021-12-14T01:46:11.863 回答
1

数据源旨在以这种方式失败。

但是,如果您使用来自外部配置的状态文件,则可以output根据 s3 存储桶是否由该状态管理,并在资s3_bucket​​源中作为条件使用它,在外部状态中声明一个状态文件。

例如,外部状态的输出将是空字符串(非托管)或任何对您有用的属性的值。布尔值是另一种选择。从此配置中删除数据源并根据输出向资源添加条件。

如果任何此类变通办法使您的配置复杂化或简化,您可以自行决定。

于 2021-12-14T18:22:41.263 回答