使用GitHub Actions部署到AWS EKS时遇认证错误及Web身份令牌获取问题
核心结论:无需手动生成web-identity-token
你使用的aws-actions/configure-aws-credentials@v2 Action已经内置OIDC身份验证逻辑,会自动从GitHub Actions runner获取web-identity-token并完成assume-role-with-web-identity操作,完全不需要手动执行那个AWS CLI命令。部署失败的原因大概率是IAM角色权限配置不全或者kubeconfig生成后的认证链存在问题。
具体修复步骤
1. 检查IAM角色的权限与信任策略
权限策略:确保指定的
oidc_identity角色拥有访问目标EKS集群的必要权限,至少包含:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "arn:aws:eks:us-east-1:123456789012:cluster/k8s-voting-app" } ] }同时需要通过EKS的
aws-authConfigMap,给该IAM角色绑定Kubernetes层面的权限(比如cluster-admin或对应命名空间的编辑权限),确保能操作集群资源。信任策略:确认IAM角色的信任策略允许GitHub OIDC提供商扮演该角色,示例配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:你的GitHub用户名/仓库名:ref:refs/heads/main" } } } ] }替换其中的仓库信息,确保只有你的目标仓库工作流能使用该角色。
2. 优化GitHub Actions工作流
现有工作流已正确使用OIDC,可调整以下内容确保认证生效:
name: Deploy images from ECR to k8s on: workflow_dispatch env: AWS_REGION: "us-east-1" ENV: "prod" permissions: id-token: write contents: read jobs: deployment: name: Deploy application to EKS cluster runs-on: ubuntu-latest steps: - name: Checkout code from GitHub to runner uses: actions/checkout@v2 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::123456789012:role/oidc_identity role-duration-seconds: 1200 aws-region: ${{ env.AWS_REGION }} - name: Verify AWS Credentials run: | aws sts get-caller-identity - name: Install kubectl uses: azure/setup-kubectl@v3 id: install-kubectl - name: Update kube config run: | aws eks update-kubeconfig --name k8s-voting-app --region ${{ env.AWS_REGION }} --alias eks-prod kubectl config use-context eks-prod - name: Test kubectl connectivity run: | kubectl get nodes --no-headers - name: Deploy application images to EKS cluster run: | kubectl apply -f k8s-specifications/db-secret.yaml
- 新增
Verify AWS Credentials步骤,确认OIDC角色已成功获取AWS临时凭证 - 给kubeconfig添加别名并切换上下文,避免环境冲突
- 新增集群连通性测试,提前验证kubectl认证状态
3. 验证kubeconfig的认证配置
aws eks update-kubeconfig生成的kubeconfig会自动配置kubectl使用AWS CLI获取临时token,检查kubeconfig的user部分应包含类似配置:
users: - name: arn:aws:eks:us-east-1:123456789012:cluster/k8s-voting-app user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --region - us-east-1 - eks - get-token - --cluster-name - k8s-voting-app command: aws
该配置会让kubectl每次请求时自动调用AWS CLI获取认证token,而AWS CLI会使用OIDC角色提供的临时凭证。
关于web-identity-token的自动生成逻辑
GitHub Actions runner会自动生成OIDC ID token,并存储在环境变量ACTIONS_ID_TOKEN_REQUEST_TOKEN中。aws-actions/configure-aws-credentials@v2 Action会读取这个token,自动完成sts assume-role-with-web-identity调用,获取AWS临时凭证并设置到环境变量中,后续AWS CLI和kubectl都会自动使用这些凭证完成认证。
内容的提问来源于stack exchange,提问作者Vikas Arora

