You need to enable JavaScript to run this app. 使用terraform-aws-modules/eks/aws部署EKS时如何为节点IAM角色附加CloudWatchLogsFullAccess策略
优惠活动
大模型
产品
解决方案
定价
更多

使用terraform-aws-modules/eks/aws部署EKS时如何为节点IAM角色附加CloudWatchLogsFullAccess策略

EKS模块自动绑定自定义IAM策略的问题排查与实现

问题背景

使用terraform-aws-modules/eks/aws模块部署EKS集群时,模块默认会为EKS集群内EC2工作节点关联的IAM角色预置三个托管策略:AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly、AmazonEKS_CNI_Policy。
如果需要额外为该工作节点角色绑定CloudWatchLogsFullAccess策略,最初查阅模块文档时没找到直接的配置入口,过往只能手动登录AWS控制台完成策略附加,尝试通过Terraform代码实现自动绑定时遇到校验报错。

错误复现

最初编写的绑定代码如下:

resource "aws_iam_role_policy_attachment" "cloudWatch" {
  role       = module.eks.cluster_iam_role_arn
  policy_arn = "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
}

Terraform执行时返回如下校验错误:

Error: Error attaching policy arn:aws:iam::aws:policy/CloudWatchLogsFullAccess to IAM Role arn:aws:iam::678515134618:role/my-eks20210303061731134400000005: ValidationError: The specified value for roleName is invalid. It must contain only alphanumeric characters and/or the following: +=,.@_-
status code: 400, request id: aee57a35-ae72-499e-8653-e61e795818e4

问题根因

报错本质是两个配置错误叠加导致的,从报错信息里也能看到,实际要绑定的角色名my-eks20210303061731134400000005本身完全符合命名规范,触发校验失败的核心原因有两点:

  • 绑定的角色对象选错:module.eks.cluster_iam_role_arn是EKS控制面专属的服务IAM角色,并非EC2工作节点关联的实例角色,哪怕参数格式正确,策略也会绑定到错误的角色上,达不到预期效果。
  • 资源参数格式不匹配:aws_iam_role_policy_attachment资源的role参数要求传入纯角色名称,而非带账号ID、ARN前缀的完整角色ARN。传入完整ARN时,AWS API会将整串字符串作为角色名做校验,自然会因为包含斜杠、冒号等不在允许范围内的字符,抛出角色名无效的错误。

正确实现方案

方案1:使用模块内置参数配置(推荐)

该EKS模块本身已内置自定义节点角色附加策略的参数,不需要单独编写IAM绑定资源,直接在调用模块时通过node_aggregate_role_policy_arns字段传入需要附加的策略ARN即可,模块会自动处理策略绑定逻辑,版本兼容性更好:

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  # 原有集群配置保持不变
  # 为工作节点IAM角色额外附加指定托管策略
  node_aggregate_role_policy_arns = [
    "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
  ]
}

方案2:单独编写IAM绑定资源

如果需要单独管理策略绑定资源,需要修正两个问题:

  1. 从模块输出中获取工作节点关联的IAM角色信息(使用module.eks.node_iam_role_arn,而非控制面的角色输出)
  2. 从完整角色ARN中拆出纯角色名称,传入aws_iam_role_policy_attachment的role参数,符合API校验要求

修正后的代码示例:

resource "aws_iam_role_policy_attachment" "cloudWatch" {
  # 从节点角色的完整ARN中提取纯角色名,满足API校验要求
  role       = split("/", split("role/", module.eks.node_iam_role_arn)[1])[0]
  policy_arn = "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
}

内容的提问来源于stack exchange,提问作者Melissa Jenner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 14:06:06