Terraform 配置 LB 属性失败

Posted

技术标签:

【中文标题】Terraform 配置 LB 属性失败【英文标题】:Terraform Failure configuring LB attributes 【发布时间】:2020-05-23 09:22:04 【问题描述】:

我已关注 *** 上 this 帖子上的第一个答案,但我收到此错误:

配置 LB 属性失败:InvalidConfigurationRequest: Access Denied for bucket: myproject-log。请查看 S3bucket 权限状态码:400

这是我的代码:

s3_bucket

data "aws_elb_service_account" "main" 

resource "aws_s3_bucket" "bucket_log" 
  bucket = "$var.project-log"
  acl    = "log-delivery-write"

policy = <<POLICY

  "Id": "Policy",
  "Version": "2012-10-17",
  "Statement": [
    
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::$var.project-log/AWSLogs/*",
      "Principal": 
        "AWS": [
          "$data.aws_elb_service_account.main.arn"
        ]
      
    
  ]

POLICY


负载均衡器

resource "aws_lb" "vm_stage" 
  name = "$var.project-lb-stg"
  internal           = false
  load_balancer_type = "application"
  subnets         = [aws_subnet.subnet_1.id, aws_subnet.subnet_2.id, aws_subnet.subnet_3.id]
  security_groups = [aws_security_group.elb_project_stg.id]
  access_logs 
    bucket  = aws_s3_bucket.bucket_log.id
    prefix  = "lb-stg"
    enabled = true
  
  tags = 
    Name = "$var.project-lb-stg"
  

【问题讨论】:

【参考方案1】:

AWS 官方文档

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html

解决方案

参考上面的文档并更改您的存储桶的 iam 政策以反映文档所述的内容。日志记录实际上是由 AWS 而不是您的角色或 IAM 用户完成的。因此,您需要授予 ÅWS 权限才能执行此操作。这就是为什么文档在策略中显示指定 delivery.logs.amazonaws.com 主体的语句的原因。该委托人就是 AWS 日志服务。即使您的存储桶托管在 AWS 上,默认情况下它们也不会给自己访问您的存储桶的权限。如果您希望他们的服务正常工作,您必须明确授予对 AWS 的访问权限。

【讨论】:

【参考方案2】:

根据this post,我能够通过禁用 KMS 并使用 SSE-S3 进行存储桶加密来解决此问题。此外,AWS 文档中有 additional permissions listed。

【讨论】:

【参考方案3】:

因为这个叉号适用于另一个被问到的问题,所以将其放在这里。

我花了一段时间才弄明白,但根据文档,S3 存储桶有两个要求:

存储桶必须与负载均衡器位于同一区域。 需要 Amazon S3 托管的加密密钥 (SSE-S3)。不支持其他加密选项。

来源:https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html

虽然这看起来像是错误消息的权限问题,但实际上可能是存储桶的加密类型错误。就我而言,问题是我的存储桶未加密。

将存储桶更新为 SSE-S3 加密,我不再收到错误消息:

resource "aws_s3_bucket" "s3_access_logs_bucket" 
  bucket = var.access_logs_bucket_name
  acl = "private"
  server_side_encryption_configuration 
    rule 
      apply_server_side_encryption_by_default 
        sse_algorithm = "AES256"
      
    
  

  versioning 
    enabled = true
  


因为,这是我使用的政策:

data "aws_elb_service_account" "main" 


data "aws_iam_policy_document" "s3_lb_write" 
  statement 
    principals 
      identifiers = ["$data.aws_elb_service_account.main.arn"]
      type = "AWS"
    

    actions = ["s3:PutObject"]

    resources = [
      "$aws_s3_bucket.s3_access_logs_bucket.arn/*"
    ]
  


resource "aws_s3_bucket_policy" "load_balancer_access_logs_bucket_policy" 
  bucket = aws_s3_bucket.s3_access_logs_bucket.id
  policy = data.aws_iam_policy_document.s3_lb_write.json

【讨论】:

以上是关于Terraform 配置 LB 属性失败的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 用户 TF_VAR 不工作的嵌套模块

使用terraform“数据”时如何重新转动多个对象?

Terraform 学习笔记

Terraform如何获取aws_lb的IP地址

Terraform:使用封闭的网络连接

Terraform 启用 VM Insights