You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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-auth ConfigMap,给该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:39:56