如何在我的Terraform存储桶策略中将存储桶用作变量?

时间:2019-12-13 18:19:26

标签: terraform terraform-provider-aws

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

1 个答案:

答案 0 :(得分:0)

我认为我发现一些可以帮助您的事情。

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