【问题标题】:Terraform InvalidConfigurationRequest: Access denied for S3 bucketTerraform InvalidConfigurationRequest:S3 存储桶的访问被拒绝
【发布时间】:2020-04-01 23:28:46
【问题描述】:

我正在尝试将一些 terraform 代码部署到我设置了管理员访问权限的 AWS 环境中。此代码的目的是将日志从应用程序负载均衡器发送到 S3 存储桶。该代码能够毫无问题地创建存储桶,但是在记录其中的一部分时,我会遇到以下错误:

我无法解决这个错误。下面是我创建负载均衡器、S3 存储桶的代码,以及我为进行日志记录而实施的策略。任何意见将是有益的。提前致谢。

S3 存储桶

data "aws_elb_service_account" "javahome" {}

resource "aws_s3_bucket" "alb_access_logs" {
  bucket = var.alb_s3_logs
  acl    = "private"
  region = var.region
  tags = {
    Name        = "jalb-access-logs"
    Environment = terraform.workspace
  }
  policy = templatefile("${path.module}/scripts/iam/alb-s3-access-logs.json", {
    bucket_name = var.alb_s3_logs
    prefix      = var.prefix
    policy_arn  = data.aws_elb_service_account.javahome.arn
    }
  )
}

应用负载均衡器

resource "aws_lb" "javahome" {


name               = var.alb_name
  internal           = false
  load_balancer_type = var.lb_type
  security_groups    = [aws_security_group.elb_sg.id]
  subnets            = local.pub_sub_ids

  access_logs {
    bucket  = aws_s3_bucket.alb_access_logs.bucket
    prefix  = var.prefix
    enabled = true
  }

  tags = {
    Environment = terraform.workspace
  }
}

政策

{
"Version": "2012-10-17",
"Id": "javahome-alb-pilicy",
"Statement": [
    {
        "Sid": "root-access",
        "Effect": "Allow",
        "Principal": {
            "AWS": "${policy_arn}"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::${bucket_name}/${prefix}/AWSLogs/*"
    },
    {
        "Sid": "log-delivery",
        "Effect": "Allow",
        "Principal": {
            "Service": "delivery.logs.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::${bucket_name}/${prefix}/AWSLogs/*",
        "Condition": {
            "StringEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control"
            }
        }
    },
    {
        "Sid": "log-delivery-access-check",
        "Effect": "Allow",
        "Principal": {
            "Service": "delivery.logs.amazonaws.com"
        },
        "Action": "s3:GetBucketAcl",
        "Resource": "arn:aws:s3:::${bucket_name}"
    }
]

}

【问题讨论】:

  • 这能回答你的问题吗? Terraform ELB S3 Permissions Issue
  • 您所拥有的日志传递内容是用于 S3 将访问日志写入 S3 存储桶,而不是用于 ELB 访问日志。上面的链接答案显示了如何为 ELB 访问日志正确配置。

标签: amazon-web-services amazon-s3 terraform amazon-iam aws-application-load-balancer


【解决方案1】:

我花了一段时间才弄明白,但根据文档,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
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2018-01-10
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多