【问题标题】:How do I create an S3 bucket policy from a template in Terraform 0.12?如何从 Terraform 0.12 中的模板创建 S3 存储桶策略?
【发布时间】:2020-03-23 14:21:56
【问题描述】:

我正在尝试通过 Terraform 0.12 创建一个 S3 存储桶策略,该策略将根据环境(开发/产品)而改变。以下是该政策的一部分:

{
    "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")}"
}

如何在策略中指定变量?

【问题讨论】:

标签: amazon-s3 terraform terraform-provider-aws


【解决方案1】:

您可以使用数据资源为策略创建 JSON 模板,方法是根据您的环境传递变量并将该模板文件用作 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}"
}

【讨论】:

    【解决方案2】:

    您不需要模板文件就可以传递变量,您可以使用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 的流量获取对象。

    【讨论】:

    • 我更喜欢模板,我们的 TF 很大,将 JSON 文档分解成自己的文件,这样人们维护起来就容易多了。
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 2021-08-14
    • 2021-04-04
    • 2020-03-29
    • 2021-06-10
    • 2019-05-15
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多