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 属性失败的主要内容,如果未能解决你的问题,请参考以下文章