【问题标题】:Is there a way to add CORS rule to Terraform aws_s3_bucket data source?有没有办法将 CORS 规则添加到 Terraform aws_s3_bucket 数据源?
【发布时间】:2022-02-12 16:29:00
【问题描述】:

我有一个不是通过 Terraform 创建的现有存储桶。我目前正在对该存储桶设置策略以获得额外的访问权限。我需要将cors_rule 添加到存储桶中,但我发现的所有内容都表明您需要创建resource 才能添加cors 规则。有没有办法将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}/*"
    ]
  }
}

【问题讨论】:

  • 您应该使用 cors_rule 在 terraform 中配置存储桶,然后将存储桶导入 terraform 状态。
  • @luk2302 感谢您的回复,但是在这种情况下这是不可能的。我们必须利用已经存在的存储桶。
  • 这正是导入资源的目的。
  • 我意识到这就是它的用途,我的问题是专门问“有没有办法?”。如果导入是一个选项,我们会选择它。
  • 那不行,你别无选择。导入是您问题的解决方案。如果您故意且没有充分理由忽视旨在解决您的问题的解决方案,那么您就不走运了。无论如何,拥有一个改变某些东西的数据源会很糟糕,因此你想要的设计是不受支持的。

标签: amazon-web-services amazon-s3 terraform cors


【解决方案1】:

你真幸运。就在今天/昨天发布了 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 = ["*"]
  }
}

唯一需要注意的是,您需要升级到 AWS 提供商的 4.0.0 版本,并附带所有重大更改。

【讨论】:

    【解决方案2】:

    您只能修改由 terraform 管理的资源,不能修改作为数据源引入的资源。您可以做的是为您的存储桶创建资源,然后导入现有存储桶:

    terraform import aws_s3_bucket.my_bucket my-bucket
    

    导入命令将为您提供存储桶上设置的所有属性的列表。对于您不想使用 terraform 管理的属性,请在生命周期块上使用 ignore 参数。

    【讨论】:

    • 不幸的是,在我们的案例中,我们目前的方法可能无法做到这一点。我非常感谢您的澄清,尽管这不是我所描述的可能性。谢谢!
    • 是的。混合 terraform/手动工作流程有很多有用的技巧,但如果 terraform 无法负责,您仍然会遇到一些困难。祝你好运!
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2022-01-18
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多