如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件

Posted

技术标签:

【中文标题】如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件【英文标题】:How to concatenate S3 bucket name in Terraform variable and pass it to main tf file 【发布时间】:2019-11-01 05:11:50 【问题描述】:

我正在编写 terraform 模板来创建两个 S3 存储桶,但是,我的要求是将它们的名称连接到 vars.tf 中,然后将其传递给主 tf 文件。下面是 vars.tf 和主 s3.tf 文件。

vars.tf:

variable TENANT_NAME 
  default = "Mansing"


variable BUCKET_NAME 
        type = "list"
        default = ["bh.$var.TENANT_NAME.o365.attachments", "bh.$var.TENANT_NAME.o365.eml"]



s3.tf:

resource "aws_s3_bucket" "b" 
  bucket = "$element(var.BUCKET_NAME, 2)"
  acl    = "private"


什么时候做 terraform plan 我得到一个错误,表明 var 可能在这里不起作用。

Error: Variables not allowed

  on vars.tf line 10, in variable "BUCKET_NAME":
  10:   default = ["bh.$var.TENANT_NAME.o365.attachments", "bh.$var.TENANT_NAME.o365.eml"]

Variables may not be used here.


Error: Variables not allowed

  on vars.tf line 10, in variable "BUCKET_NAME":
  10:   default = ["bh.$var.TENANT_NAME.o365.attachments", "bh.$var.TENANT_NAME.o365.eml"]

Variables may not be used here.

我尝试用语言环境替换 vars 文件中的 var,但没有成功。

【问题讨论】:

格式("%s/%s", var.var1, var.var2) 如果你想使用变量作为其他变量默认值的一部分进行插值,那么你需要使用local:terraform.io/docs/configuration/locals.html Terraform combine 2 variables into a new variable的可能重复 当我使用本地人时同样的错误。 ``` 变量 TENANT_NAME default = "mansing" locals first_env = "bh.$var.TENANT_NAME.o365.attachments" second_env = "bh.$var.TENANT_NAME.o365.eml" 变量 BUCKET_NAME 类型 = “列表” 默认 = [local.first_env, local.second_env] ``` 当我在 Main.tf 中使用 Locals 而不是在 vars.tf 中使用它并且还使用了 vars.tf 中定义的变量时,它起作用了。 locals s3_names = ["bh.$var.TENANT_NAME.o365.attachments", "bh.$var.TENANT_NAME.o365.eml"] 【参考方案1】:

您可以使用 Terraform locals 块来连接 s3.tf 文件中的变量值:

locals 
  BUCKET_NAME = [
    "bh.$var.TENANT_NAME.o365.attachments",
    "bh.$var.TENANT_NAME.o365.eml"
  ]


resource "aws_s3_bucket" "b" 
  bucket = "$element(local.BUCKET_NAME, 2)"
  acl    = "private"

【讨论】:

以上是关于如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?

如何从 terraform 状态中删除资源?

带有 S3 后端的 Terraform 如何发现所有工作区?

[S3使用Terraform进行跨区域复制

为啥 terraform 会在 s3 存储桶中创建一个空目录?

动态/静态资源映射(Terraform)