有没有办法将 CORS 规则添加到 Terraform aws_s3_bucket 数据源?

voo*_*oGQ 3 amazon-s3 amazon-web-services cors terraform

我有一个不是通过 Terraform 创建的现有存储桶。我目前正在该存储桶上设置策略以获得额外的访问权限。我需要将 a 添加cors_rule到存储桶中,但我发现的所有内容都表明您需要创建 aresource才能添加 cors 规则。有没有办法将 a 添加cors_rule到现有存储桶数据源?

data "aws_s3_bucket" "my_bucket" {
  bucket = "my-bucket"

  # This produces a failure on plan
  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["GET", "HEAD"]
    allowed_origins = [
      "https://example.my-website.com"
    ]
    expose_headers  = [
      "Access-Control-Allow-Origin",
      "ETag"
    ]
    max_age_seconds = 3000
  }
}

resource "aws_s3_bucket_policy" "allow_access" {
  bucket = data.aws_s3_bucket.my_bucket.id
  policy = data.aws_iam_policy_document.allow_access.json
}

data "aws_iam_policy_document" "allow_access" {
  statement {
    sid = "Access"

    principals {
      type = "AWS"
      identifiers = ["arn:aws:iam::123456789012:user/test"]
    }

    actions = [
      "s3:GetObject",
      "s3:GetBucketLocation",
      "s3:ListBucket",
    ]

    resources = [
      data.aws_s3_bucket.my_bucket.arn,
      "${data.aws_s3_bucket.my_bucket.arn}/*"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

计划错误

luk*_*302 9

你真幸运。就在今天/昨天,AWS 提供商发布了 4.0.0 版本。
新的提供程序版本在 S3 存储桶处理方面进行了大量重构。您现在拥有独立的s3_bucket_cors_configuration资源,而不是直接在该aws_s3_bucket资源上进行 CORS 设置。这意味着您现在可以配置 CORS 设置(以及许多其他设置),而无需在您的状态中实际拥有存储桶本身。

resource "aws_s3_bucket_cors_configuration" "example" {
  bucket = aws_s3_bucket.example.bucket

  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["PUT", "POST"]
    allowed_origins = ["https://s3-website-test.hashicorp.com"]
    expose_headers  = ["ETag"]
    max_age_seconds = 3000
  }

  cors_rule {
    allowed_methods = ["GET"]
    allowed_origins = ["*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是,您需要升级到 AWS 提供商的 4.0.0 版本以及随之而来的所有重大更改。