从文件中读取地形变量

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。有没有办法改为从外部文件读取文档?

这有很多优点:

您可以为此使用 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"
      }
   }