如何在 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 存储桶?
带有 S3 后端的 Terraform 如何发现所有工作区?