amazon-s3 - 策略中的 S3 存储桶名称,terraform

标签 amazon-s3 terraform terraform-provider-aws terraform0.12+

我正在创建一个存储桶来存储 lb 日志。我不想对名称进行硬编码,因为由于 s3 的唯一名称要求,这会导致我的代码中断。我正在使用 terraform 提供的 bucket_prefix。

在bucket policy中我需要s3 bucket的名称,我的代码如下:

resource "aws_s3_bucket" "aws-s3-lb-logs" {
  acl = "private"
  force_destroy = true
  bucket_prefix = "some-prefix"


  policy = <<POLICY
{
  "Id": "Policy",
  "Statement": [
    {
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::${aws_s3_bucket.aws-s3-lb-logs.bucket}/AWSLogs/*",
      "Principal": {
        "AWS": [
          "${data.aws_elb_service_account.main.arn}"
        ]
      }
    }
  ]
}
POLICY
}

当我尝试在策略中调用 ${aws_s3_bucket.aws-s3-lb-logs.bucket} 时,出现错误:

Error: Self-referential block

  on main.tf line 350, in resource "aws_s3_bucket" "aws-s3-lb-logs":
 350:       "Resource": "arn:aws:s3:::${aws_s3_bucket.aws-s3-lb-logs.bucket}/AWSLogs/*",

Configuration for aws_s3_bucket.aws-s3-lb-logs may not refer to itself.

我知道我不能调用相同的资源 block ,但在这种情况下,我如何获取 s3 存储桶的名称以放入策略 block ?

最佳答案

解决方案是使用单独的资源 ( aws_s3_bucket_policy ) 来设置存储桶策略。

resource "aws_s3_bucket" "aws-s3-lb-logs" {
  acl = "private"
  force_destroy = true
  bucket_prefix = "some-prefix"
}

resource "aws_s3_bucket_policy" "aws-s3-lb-logs" {
  bucket = aws_s3_bucket.aws-s3-lb-logs.id

  policy = <<POLICY
{
  "Id": "Policy",
  "Statement": [
    {
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::${aws_s3_bucket.aws-s3-lb-logs.bucket}/AWSLogs/*",
      "Principal": {
        "AWS": [
          "${data.aws_elb_service_account.main.arn}"
        ]
      }
    }
  ]
}
POLICY
}

关于amazon-s3 - 策略中的 S3 存储桶名称,terraform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65461082/

相关文章:

amazon-s3 - 使用预签名 URL 和浏览器中的 ng-file-upload 将文件上传到 AWS S3 时,403 签名不匹配

azure - Terraform 从现有 VNET/子网检索 CIDR/前缀

amazon-web-services - Terraform:启动源实例时出错:InvalidAMIID.Malformed

terraform - 如何将模板文件函数传递给 Terraform 0.12 中 EC2 资源的 user_data 参数?

amazon-web-services - "Strong Consistency"与 "Read-after-write Consistency"

node.js - 使用 NodeJS 创建 Gzip 压缩的 JSON 文件并上传到 S3 存储桶

azure - 如何使用环境变量配置通过系统分配的托管标识进行身份验证的多个 azurerm 提供程序

json - 循环遍历多个 json 文件作为 Terraform 中的输入

terraform - 您可以使用 Terraform 在 AWS 安全组的入站规则上标记入站名称吗?

rest - 使用 Postman 获取 aws 存储桶内容列表 - "Get Bucket (Version 2)"Rest API