从文件中读取地形变量
Reading terraform variable from file
在terraform中,长键可以指定如下:
resource "aws_iam_role_policy" "foo-policy" {
role = "${aws_iam_role.foo-role.name}"
name = "foo-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}
EOF
}
这是 IAM 策略文档的常见模式。该方法已记录 here and is the example given in the AWS IAM role policy page on terraform。有没有办法改为从外部文件读取文档?
这有很多优点:
- 您可以使用工具生成策略
- 您可以使用 linting 工具来验证策略 JSON。编辑器语法突出显示也将起作用,显示 JSON 错误,如尾随逗号。
- 您可以使用更高级的工具来验证策略文档语法
您可以为此使用 terraform 的 template_file 数据源。只需将您的策略写入您的 Terraform 脚本可以访问的路径中的文件,然后创建一个引用它的 template_file 数据源。例如:
data "template_file" "policy" {
template = "${file("somepath/my-policy.json")}"
}
然后,在 foo-policy 中,您可以像这样渲染它:
policy = "${data.template_file.policy.rendered}"
template_file 的另一个好处是您可以在引用文件中插入变量。例如,您可以在策略中包含 ${IAMUser}
或 ${AWSAccountNumber}
等变量,并通过 template_file vars 选项将其传入,这样您就可以重复使用策略文件。
进一步阅读
在 Terraform 0.12 及更高版本中,有读取文件的特殊函数:
- file 读取给定路径的文件内容,并 returns 将它们作为字符串。
- templatefile 函数提供了一种从文件渲染模板的内置机制。
使用该函数代替 template_file 数据源。
resource "aws_instance" "ami-example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "${file("index.html")}" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
"source" = "terraform"
"Name" = "tf-ami-example"
}
}
在terraform中,长键可以指定如下:
resource "aws_iam_role_policy" "foo-policy" {
role = "${aws_iam_role.foo-role.name}"
name = "foo-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}
EOF
}
这是 IAM 策略文档的常见模式。该方法已记录 here and is the example given in the AWS IAM role policy page on terraform。有没有办法改为从外部文件读取文档?
这有很多优点:
- 您可以使用工具生成策略
- 您可以使用 linting 工具来验证策略 JSON。编辑器语法突出显示也将起作用,显示 JSON 错误,如尾随逗号。
- 您可以使用更高级的工具来验证策略文档语法
您可以为此使用 terraform 的 template_file 数据源。只需将您的策略写入您的 Terraform 脚本可以访问的路径中的文件,然后创建一个引用它的 template_file 数据源。例如:
data "template_file" "policy" {
template = "${file("somepath/my-policy.json")}"
}
然后,在 foo-policy 中,您可以像这样渲染它:
policy = "${data.template_file.policy.rendered}"
template_file 的另一个好处是您可以在引用文件中插入变量。例如,您可以在策略中包含 ${IAMUser}
或 ${AWSAccountNumber}
等变量,并通过 template_file vars 选项将其传入,这样您就可以重复使用策略文件。
进一步阅读
在 Terraform 0.12 及更高版本中,有读取文件的特殊函数:
- file 读取给定路径的文件内容,并 returns 将它们作为字符串。
- templatefile 函数提供了一种从文件渲染模板的内置机制。
使用该函数代替 template_file 数据源。
resource "aws_instance" "ami-example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "${file("index.html")}" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
"source" = "terraform"
"Name" = "tf-ami-example"
}
}