如何从 Terraform 0.12 中的模板创建 S3 存储桶策略?

How do I create an S3 bucket policy from a template in Terraform 0.12?

我正在尝试通过 Terraform 0.12 创建一个 S3 存储桶策略,该策略将根据环境 (dev/prod) 进行更改。这是政策的一部分:

{
    "Sid": "AllowAdminAccessToBuckets",
    "Effect": "Allow",
    "Principal": "*",
    "Action": [
        "s3:GetBucket*"
    ],
    "Resource": [
        "arn:aws:s3:::${var.env-bucket}",
        "arn:aws:s3:::${var.env-bucket}/*"
    ],
    "Condition": {
        "StringEquals": {
            "aws:sourceVpce": "${var.env-vpce}"
        }
    }
}

如果我使用 JSON 格式的文档(不是模板)执行以下操作:

resource "aws_s3_bucket" "b" {
    bucket = "my-tf-test-bucket"
    policy = "${file("templates/policy.json")}"
}

如何在策略中指定变量?

您可以使用数据资源创建一个 JSON 策略模板,方法是根据您的环境传递变量,并将该 template_file 用作 aws_s3_bucket 资源中的策略。

variable "env-bucket" {
  default = "sample"
}
variable "env-vpce" {
  default = "sample-vpc"
}

data "template_file" "policy" {
  template = "${file("policy.json")}"

  vars = {
    env-bucket = "${var.env-bucket}"
    env-vpce   = "${var.env-vpce}"
   }
}

resource "aws_s3_bucket" "b" {
   bucket = "my-tf-test-bucket"
   policy = "${data.template_file.policy.rendered}"
}

您不需要模板文件就可以传递变量,您可以使用 heredoc:

直接内联
variable "env-bucket" {
  default = "example"
}

variable "env-vpce" {
  default = "vpce-1234567890abcdef"
}

resource "aws_s3_bucket" "b" {
   bucket = var.env-bucket
   policy = <<POLICY
{
    "Sid": "AllowAdminAccessToBuckets",
    "Effect": "Allow",
    "Principal": "*",
    "Action": [
        "s3:GetBucket*"
    ],
    "Resource": [
        "arn:aws:s3:::${var.env-bucket}",
        "arn:aws:s3:::${var.env-bucket}/*"
    ],
    "Condition": {
        "StringEquals": {
            "aws:sourceVpce": var.env-vpce
        }
    }
}
POLICY

}

还值得注意的是,这允许所有访问 GetBucket* API 调用流量流经该 VPC 端点的任何内容,而不仅仅是管理员(基本上是该 VPC 中的任何内容) ) 并且也不允许任何基于对象的操作,因此 "arn:aws:s3:::${var.env-bucket}/*" 资源是不必要的,或者您需要将 GetBucket* 更改为 Get* 以允许来自该 VPC 的流量获取对象。