使用terraform-aws-modules/eks/aws部署EKS时如何为节点IAM角色附加CloudWatchLogsFullAccess策略
问题背景
使用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绑定资源
如果需要单独管理策略绑定资源,需要修正两个问题:
- 从模块输出中获取工作节点关联的IAM角色信息(使用
module.eks.node_iam_role_arn,而非控制面的角色输出) - 从完整角色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

