Bitbucket Pipeline部署AWS EKS时配置凭证仍报权限错误
Bitbucket Pipeline部署AWS EKS权限报错修复
现有流水线配置
image: atlassian/default-image:3 pipelines: tags: ecr-release-*: - step: services: - docker script: - apt update -y - apt install python3-pip -y - pip3 --version - pip3 install awscli - aws configure set aws_access_key_id "AKIA6J47DSdaUIAZH46DKDDID6UH" - aws configure set aws_secret_access_key "2dWgDxx5i7Jre0aZJ+tQ3oDve5biYk0ZMDKKASA7554QoJSJSJS" - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl - chmod +x ./kubectl - mv ./kubectl /usr/local/bin/kubectl - aws eks update-kubeconfig --name build_web --region us-west-2 - kubectl apply -f eks/aws-auth.yaml - kubectl apply -f eks/deployment.yaml - kubectl apply -f eks/service.yaml definitions: services: docker: memory: 3072
问题根因
- 执行逻辑死循环:
kubectl apply -f eks/aws-auth.yaml是第一个集群操作,但此时流水线使用的IAM身份还没被加入EKS授权列表,根本没有集群操作权限,不可能成功修改aws-auth配置本身。 - IAM权限缺失:配置的AK/SK对应的IAM身份,没有分配EKS访问的基础权限,无法通过EKS鉴权。
- 工具版本兼容问题:pip默认安装的是awscli v1旧版本,和当前EKS版本、新版kubectl的鉴权逻辑不兼容,会触发虚假权限报错。
- 安全违规:AK/SK明文硬编码在代码仓库中,属于严重安全风险,密钥随时可能泄露被刷云资源账单。
修复步骤
- 提前配置EKS授权:在本地用有EKS集群管理员权限的账号执行命令编辑aws-auth配置,把流水线使用的IAM用户提前加入授权列表:
kubectl edit configmap aws-auth -n kube-system
在mapUsers段添加如下配置,替换为你自己的账号ID和IAM用户名:
mapUsers: | - userarn: arn:aws:iam::[你的AWS账号ID]:user/[流水线专用IAM用户名] username: pipeline-deploy groups: - system:masters
保存退出后,该IAM用户就拥有集群操作权限,后续直接删除流水线脚本中kubectl apply -f eks/aws-auth.yaml这行即可,不需要流水线自行修改授权配置。
2. 给IAM用户分配最小权限:给流水线专用IAM用户关联如下策略,满足EKS kubeconfig拉取需求即可,不要直接给管理员全权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
- 替换密钥配置方式:删除脚本中明文写死的
aws configure set两行,在Bitbucket仓库的「Repository variables」中添加加密变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,流水线运行时会自动读取这两个环境变量做鉴权,避免密钥泄露。 - 升级工具版本:把pip安装awscli的逻辑替换为安装awscli v2版本,同时固定kubectl版本和集群版本差不超过1个小版本,避免兼容问题。修正后的完整流水线脚本参考:
image: atlassian/default-image:3 pipelines: tags: ecr-release-*: - step: services: - docker script: - apt update -y && apt install unzip curl -y # 安装awscli v2版本 - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - unzip -q awscliv2.zip - ./aws/install # 安装和集群版本匹配的kubectl,这里以1.28版本为例 - curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.28.0/bin/linux/amd64/kubectl - chmod +x ./kubectl - mv ./kubectl /usr/local/bin/kubectl - aws eks update-kubeconfig --name build_web --region us-west-2 - kubectl apply -f eks/deployment.yaml - kubectl apply -f eks/service.yaml definitions: services: docker: memory: 3072
- 预校验:本地配置相同的AK/SK环境变量,先执行
aws eks update-kubeconfig和kubectl get ns测试,确认鉴权通了再触发流水线,减少盲调成本。
内容的提问来源于stack exchange,提问作者Kiran S youtube channel
相关产品推荐
相关产品推荐

