Terraform创建AWS组织级CloudTrail报CloudWatch权限错误如何解决?
1. IAM策略未绑定到对应角色
你创建了aws_iam_policy.iam_policy_cloudtrail_cloudwatch_logs权限策略,但没有将该策略附加到CloudTrail使用的aws_iam_role.iam_role_cloudwatch角色上,权限没有生效。
修复代码:
resource "aws_iam_role_policy_attachment" "cloudwatch_log_attachment" { role = aws_iam_role.iam_role_cloudwatch.name policy_arn = aws_iam_policy.iam_policy_cloudtrail_cloudwatch_logs.arn }
2. 权限策略数据源引用错误
你的IAM策略配置中policy字段引用的是data.aws_iam_policy_document.cloudwatch.json,但实际定义的数据源名称是cloudwatch_nfcisbenchmark,引用不匹配导致权限策略内容为空。
修复:将IAM策略的policy字段修改为正确的数据源引用:
resource aws_iam_policy iam_policy_cloudtrail_cloudwatch_logs { name = "${local.name}-${terraform.workspace}-cloudtrail-cloudwatch-logs" policy = data.aws_iam_policy_document.cloudwatch_nfcisbenchmark.json }
3. 日志组权限路径配置错误
你定义的CloudWatch日志组名称为${local.name},但权限策略中写死了log-group:CloudTrail/log_group:前缀,和实际日志组ARN不匹配,导致权限校验失败。另外组织级Trail会生成多个成员账号对应的日志流,固定路径匹配会覆盖不全。
修复:修改cloudwatch_nfcisbenchmark数据源的资源ARN,直接引用日志组的ARN属性,简化通配匹配:
data aws_iam_policy_document cloudwatch_nfcisbenchmark { version = "2012-10-17" statement { sid = "AWSCloudTrailCreateLogStream" actions = ["logs:CreateLogStream"] resources = ["${aws_cloudwatch_log_group.cloudwatch_log_group.arn}:log-stream:*"] } statement { sid = "AWSCloudTrailPutLogEvents" actions = ["logs:PutLogEvents"] resources = ["${aws_cloudwatch_log_group.cloudwatch_log_group.arn}:log-stream:*"] } }
4. 缺少KMS加密日志组的访问权限
你为CloudWatch日志组配置了KMS加密,需要在KMS密钥策略中添加对应权限,允许CloudTrail的IAM角色执行kms:Decrypt和kms:GenerateDataKey操作,否则无法写入加密后的日志。
修复:在你使用的aws_kms_key.cloudwatch_log_group资源的密钥策略中添加以下statement:
statement { sid = "AllowCloudTrailWriteEncryptedLogs" effect = "Allow" principals { type = "AWS" identifiers = [aws_iam_role.iam_role_cloudwatch.arn] } actions = [ "kms:Decrypt", "kms:GenerateDataKey*" ] resources = ["*"] }
全部修改完成后重新执行apply操作即可解决权限报错问题。
内容的提问来源于stack exchange,提问作者Evan Gertis

