使用Ansible创建EKS集群时为何需指定security_groups?
关于Ansible community.aws.eks_cluster模块必填security_groups的问题解答
问题重现
使用以下Ansible Playbook片段创建EKS集群:
- name: Create EKS cluster community.aws.eks_cluster: name: "{{ eks_cluster.name }}" state: present version: "{{ eks_cluster.version }}" role_arn: "{{ eks_role_created.iam_role.arn }}" subnets: - "{{ subnet1_id }}" - "{{ subnet2_id }}" wait: true register: eks_creation_result
执行时触发错误:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "state is present but all of the following are missing: security_groups"}
核心疑问拆解
security_groups字段定位:你的理解是正确的,该字段对应集群级附加安全组,而非节点组安全组。AWS创建EKS时确实会自动生成一个默认安全组负责控制平面基础通信,但模块要求的是额外的附加安全组。
模块必填要求与AWS机制的关系:
两者并不冲突。AWS允许EKS集群同时拥有默认安全组+附加安全组,而Ansible此模块是自身参数校验逻辑强制要求必须指定至少一个附加安全组——哪怕是一个仅含基础规则的占位安全组。填了安全组后AWS仍自动生成新安全组的原因:
你指定的security_groups是附加安全组,AWS自动生成的是集群默认安全组,二者为互补关系:默认安全组负责EKS控制平面的基础通信规则,附加安全组则用于添加你自定义的额外流量规则(比如允许外部访问API Server、自定义集群内部通信策略等)。
解决方案
必须满足模块的参数校验要求,操作步骤如下:
- 提前创建一个安全组(可以是仅开放必要端口的实用安全组,也可以是临时占位的空安全组)
- 将该安全组ID填入
security_groups参数,修改后的Playbook示例:
- name: Create EKS cluster community.aws.eks_cluster: name: "{{ eks_cluster.name }}" state: present version: "{{ eks_cluster.version }}" role_arn: "{{ eks_role_created.iam_role.arn }}" subnets: - "{{ subnet1_id }}" - "{{ subnet2_id }}" security_groups: - "{{ custom_cluster_sg_id }}" wait: true register: eks_creation_result
补充说明
即使使用最新版的community.aws.eks_cluster模块,这个必填校验仍然存在——这是模块的设计逻辑,而非AWS API的限制。若认为该设计不合理,可向community.aws项目提交issue反馈。
内容的提问来源于stack exchange,提问作者Tony Chan
相关产品推荐
相关产品推荐

