【问题标题】:How can I use a bucket as a variable within my Terraform bucket policy?如何在 Terraform 存储桶策略中使用存储桶作为变量?
【发布时间】:2019-12-14 06:46:03
【问题描述】:

我想创建一个 S3 存储桶列表并将对它们的访问权限限制为一个用户。该用户应仅有权访问该存储桶,而无权在 AWS 中执行其他操作。

我是这样创建列表的(在此示例中存储桶名称不是真实的):

// List bucket names as a variable
variable "s3_bucket_name" {
  type    = "list"
  default = [
    "myfirstbucket", 
    "mysecondbucket", 
    ...
    ]
}

然后我创建一个用户。

// Create a user
resource "aws_iam_user" "aws_aim_users" {
  count         = "${length(var.s3_bucket_name)}"
  name          = "${var.s3_bucket_name[count.index]}"  
  path = "/"
}

然后我创建一个访问密钥。

// Create an access key
resource "aws_iam_access_key" "aws_iam_access_keys"  {
  count         = "${length(var.s3_bucket_name)}"
  user          = "${var.s3_bucket_name[count.index]}"
  // user = "${aws_iam_user.aws_aim_user.name}"
}

现在我创建一个用户策略 // 添加用户策略

resource "aws_iam_user_policy" "aws_iam_user_policies" {
  // user = "${aws_iam_user.aws_aim_user.name}"
  count         = "${length(var.s3_bucket_name)}"
  name          = "${var.s3_bucket_name[count.index]}"
  user          = "${var.s3_bucket_name[count.index]}"

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetLifecycleConfiguration",
                 ...
            ],
            "Resource": "${var.s3_bucket_name[count.index].arn}}"
        }
    ]
}
EOF
}

现在我创建带有用户的存储桶。

resource "aws_s3_bucket" "aws_s3_buckets" {
  count         = "${length(var.s3_bucket_name)}"
  bucket        = "${var.s3_bucket_name[count.index]}"
  acl           = "private"
  policy = <<POLICY
{
    "Id": "Policy1574607242703",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "Stmt1574607238413",
        "Action": [
          "s3:PutObject"
        ],
        "Effect": "Allow",
        "Resource": {
          "${var.s3_bucket_name[count.index].arn}}"
          "${var.s3_bucket_name[count.index].arn}/*}"
        },
        "Principal": {
         "AWS": "${var.s3_bucket_name[count.index]}" 
        }
      }
    ]
  }
POLICY  

  tags = {
    Name        = "${var.s3_bucket_name[count.index]}"
    Environment = "live"
}
}

我遇到的问题是它不喜欢我在策略中使用我的变量设置 ARN 的位置。

我也相信我需要使用 user.arn 而不是存储桶,尽管它们应该具有相同的名称。我在这里做错了什么?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    我想我看到了一些可以帮助你的东西。

    存储桶策略资源选项不会使用存储桶的 arn,它们正在寻找实际的存储桶名称,因此它看起来像这样“arn:aws:s3:::my-bucket”。

    我还在您的设置中看到了一些额外的 },这也可能导致问题。

    而且,,, terraform 版本是 0.12,它消除了对 {$"resource.thing"} 的需求,而是用 resource.thing 替换它。他们有一个有用的terraform 0.12upgrade 命令来运行它来升级文件,这很好。在 terrafor 0.12 中,他们调整了像您一样创建资源的方式。 https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/

    【讨论】:

    • 我还会添加 IMO 我会这样做,以便用户和存储桶不共享相同的名称,所以我希望它是 "${user.bucket}-user" 或类似的名称
    • 谢谢@CMiller 你能告诉我你为什么要那样做吗?
    • 对我来说,这似乎是一种最佳实践。如果存储桶和用户共享相同的名称,我可能会看到我自己或其他人会感到困惑。从听起来您正在设置它的意思来看,因此一个用户只能访问一个存储桶,这就是为什么您将其设置为具有相同名称的用户和存储桶的原因。
    • 公平评论和白色易于实施。我认为这是很好的喊声。我会这样做的。
    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2023-03-31
    • 2020-11-05
    • 1970-01-01
    • 2021-01-19
    • 2021-04-04
    • 2021-12-02
    • 2020-12-06
    相关资源
    最近更新 更多