从文件中读取terraform变量

时间:2017-04-20 17:51:22

标签: amazon-web-services terraform

在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,并且是AWS IAM role policy page on terraform中给出的示例。有没有办法从外部文件中读取文档?

这有很多好处:

  • 您可以使用工具生成政策
  • 您可以使用linting工具验证策略JSON。编辑器语法突出显示也会起作用,显示JSON错误,如尾随逗号。
  • 您可以使用更高级的工具来验证策略文档语法

1 个答案:

答案 0 :(得分:9)

您可以使用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选项传递它,这样您就可以重用策略文件。

进一步阅读