【问题标题】:Update bucket created in Terraform file results in BucketAlreadyOwnedByYou error在 Terraform 文件中创建的更新存储桶导致 BucketAlreadyOwnedByYou 错误
【发布时间】:2020-04-22 06:19:16
【问题描述】:

我需要将策略添加到我之前在 Terraform 文件中创建的存储桶。

但是,这个错误与

创建 S3 存储桶时出错:BucketAlreadyOwnedByYou: Your previous 创建命名存储桶的请求成功并且您已经拥有它。

如何修改我的 .tf 文件以创建存储桶,然后对其进行更新?

resource "aws_s3_bucket" "bucket" {
  bucket = "my-new-bucket-123"
  acl    = "public-read"

  region = "eu-west-1"

  website {
    index_document = "index.html"
  }
}

data "aws_iam_policy_document" "s3_bucket_policy_document" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.bucket.arn}/*"]
    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
  }
}

resource "aws_s3_bucket" "s3_bucket_policy" {
  bucket = "${aws_s3_bucket.bucket.bucket}"
  policy = "${data.aws_iam_policy_document.s3_bucket_policy_document.json}"
}

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    您应该使用 aws_s3_bucket_policy resource 将存储桶策略添加到现有 S3 存储桶:

    resource "aws_s3_bucket" "b" {
      bucket = "my_tf_test_bucket"
    }
    
    resource "aws_s3_bucket_policy" "b" {
      bucket = "${aws_s3_bucket.b.id}"
    
      policy = <<POLICY
    {
      "Version": "2012-10-17",
      "Id": "MYBUCKETPOLICY",
      "Statement": [
        {
          "Sid": "IPAllow",
          "Effect": "Deny",
          "Principal": "*",
          "Action": "s3:*",
          "Resource": "arn:aws:s3:::my_tf_test_bucket/*",
          "Condition": {
             "IpAddress": {"aws:SourceIp": "8.8.8.8/32"}
          }
        }
      ]
    }
    POLICY
    }
    

    但如果您同时这样做,那么可能值得将其内联到原始 aws_s3_bucket 资源中,如下所示:

    locals {
      bucket_name = "my-new-bucket-123"
    }
    
    resource "aws_s3_bucket" "bucket" {
      bucket = "${local.bucket_name}"
      acl    = "public-read"
      policy = "${data.aws_iam_policy_document.s3_bucket_policy_document.json}"
    
      region = "eu-west-1"
    
      website {
        index_document = "index.html"
      }
    }
    
    data "aws_iam_policy_document" "s3_bucket_policy_document" {
      statement {
        actions   = ["s3:GetObject"]
        resources = ["arn:aws:s3:::${local.bucket_name}/*"]
        principals {
          type        = "AWS"
          identifiers = ["*"]
        }
      }
    }
    

    这会在存储桶策略中手动构建 S3 ARN,以避免尝试从 aws_s3_bucket 资源引用输出 arn 时出现潜在的循环错误。

    如果您在没有策略的情况下创建了存储桶(通过应用没有策略资源的 Terraform),那么将 policy 参数添加到 aws_s3_bucket 资源将导致 Terraform 检测到漂移并且计划将显示更新到存储桶,添加策略。


    可能值得注意的是,您在 aclaws_s3_bucket 资源中使用的预设 ACL 与您的策略重叠并且是不必要的。您可以使用策略或预设 ACL 来允许所有人读取您的 S3 存储桶,但 public-read ACL 还允许您的存储桶内容像老派 Apache 目录列表一样匿名列出,这不是大多数人想要的。

    【讨论】:

    • 这会产生循环依赖错误,其中aws_iam_policy_document 依赖于aws_s3_bucket,反之亦然。
    • 确认,抱歉,错过了。现已修复。
    猜你喜欢
    • 2018-05-20
    • 2023-03-07
    • 2019-05-14
    • 2021-09-27
    • 1970-01-01
    • 2021-04-24
    • 2022-01-12
    • 2020-10-28
    • 2020-03-02
    相关资源
    最近更新 更多