【问题标题】:How do I conditionally create an S3 bucket如何有条件地创建 S3 存储桶
【发布时间】:2022-01-17 08:45:28
【问题描述】:

有没有一种方法可以对存储桶使用 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
}

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

【问题讨论】:

  • 我重写了模块,这反过来又导致了问题。这只是我试图实现的一个例子。最后,我做到了,一旦命名空间将创建存储桶,所有其他命名空间都会将策略应用于它。我遇到了问题,它会检查存储桶是否存在,如果存在,计数会改变,这反过来会破坏存储桶(我基本上有两个模块;在应用策略和一个用于创建存储桶......非常乱)。

标签: amazon-web-services terraform terraform-provider


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    很遗憾,您不能这样做data sources 必须存在,否则会出错。 TF 中没有内置方式来检查资源是否存在。从某种意义上说,资源可能存在,也可能不存在。

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

    【讨论】:

    • 这是我最终做的事情的一个变种......对于好奇:data "external" "check_bucket_exists" { program = ["bash", "-c", "aws s3 ls ${local.example_bucket} &gt; /dev/null 2&gt;&amp;1 &amp;&amp; echo -n '{\"result\":\"yes\"}' || echo -n '{\"result\":\"no\"}' "] }
    【解决方案3】:

    数据源被设计为以这种方式失败。

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2018-02-26
      • 2021-08-14
      • 2020-05-26
      相关资源
      最近更新 更多