Terraform 渲染地形模板时会发生什么

Terraform 渲染地形模板时会发生什么,terraform,Terraform,我在下面的链接中遇到了一个关于模板文件的terraform示例代码 policies/s3\u bucket\u readonly.json.tpl { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${bucket_name}", "arn:aws:s3:::${

我在下面的链接中遇到了一个关于模板文件的terraform示例代码

policies/s3\u bucket\u readonly.json.tpl

{
"Version": "2012-10-17",
"Statement": [
{
  "Action": [
    "s3:GetObject",
    "s3:ListBucket"
  ],
  "Resource": [
    "arn:aws:s3:::${bucket_name}",
    "arn:aws:s3:::${bucket_name}/${key_prefix}"
  ],
  "Effect": "Allow"
}
]
}
地形文字

data "template_file" "cloud-trail-logs-s3-readonly" {
template = "${file("policies/s3_bucket_readonly.json.tpl")}"
vars {
    bucket_name = "${aws_s3_bucket.cloudtrail-logs.bucket}"
    key_prefix = "AWSLogs/*" 
}
}
resource "aws_s3_bucket" "cloudtrail-logs" {
bucket = "cloudtrail-logs"
acl = "private"
lifecycle_rule {
enabled = true
noncurrent_version_expiration {
  days = 30
}
}
}
resource "aws_iam_policy" "cloudtrail-logs-readonly" {
name = "prod-cloudtrail-logs-s3-readonly"
path = "/production/"
description = "Readonly access to cloudtrail-logs bucket"
policy = "${data.template_file.cloud-trail-logs-s3-readonly.rendered}"
}

有人能解释一下${data.template_file.cloud-trail-logs-s3-readonly.rendered}的实际用途吗??它是否只是将模板变量值应用于policies/s3_bucket_readonly.json.tpl并添加与policy相同的内容??如果是,那么“.rendered”是什么意思或代表什么?

是的,即使你的措辞不准确,你也是对的。这是应用变量后模板policies/s3_bucket_readonly.json.tpl的结果

查看文档(属性参考)

渲染-最终渲染的模板

terraform呈现模板后,策略的值将是模板的内容

解释HCL后(terraform语言称为HCL-Hashicorp配置语言),“${bucket\u name}”将等同于在vars块的模板资源中传递的“${aws\u s3\u bucket.cloudtrail logs.bucket}”,以及“${key\u prefix}”到AWSLogs/*

我认为“${aws\u s3\u bucket.cloudtrail logs.bucket}”将引用字符串“cloudtrail logs”(aws\u s3\u bucket资源中bucket属性的值)

因此,政策价值应该是:

{
"Version": "2012-10-17",
"Statement": [
{
  "Action": [
    "s3:GetObject",
    "s3:ListBucket"
  ],
  "Resource": [
    "arn:aws:s3:::cloudtrail-logs",
    "arn:aws:s3:::cloudtrail-logs/AWSLogs/*"
  ],
  "Effect": "Allow"
}
]
}

所以“.rendered”是导致模板中的变量被值替换的原因吗?我想说的不是“什么原因”,而是结果。运行terraform apply是导致模板中的变量被值替换的原因。为了澄清,terraform代码id不是一次解释的。首先呈现模板,并且仅在依赖于模板的块也被插入之后。你可以看看。但假设您不使用。在代码中的任何地方呈现,模板仍然呈现,但结果从未使用过,即使它可用。我认为这澄清了它…谢谢