首页 > 解决方案 > 如何在 Terraform 存储桶策略中使用存储桶作为变量?

问题描述

我想创建一个 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 而不是存储桶,尽管它们应该具有相同的名称。我在这里做错了什么?

标签: terraformterraform-provider-aws

解决方案


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

存储桶策略资源选项不会使用存储桶的 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/


推荐阅读