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

Terraform配置EKS假设IAM角色访问S3遇权限错误求助

问题解决:EKS Pod无法AssumeRole并获取S3权限

核心问题分析

  • 被假设角色的信任策略错误:当前配置允许eks.amazonaws.com服务主体发起AssumeRole请求,但实际发起请求的是EKS Pod通过IRSA绑定的IAM角色,需改为EKS集群的OIDC身份提供商作为信任主体。
  • 权限关联缺失:应用角色未关联AssumeRole权限,被假设角色未关联S3访问权限。

修正后的Terraform配置

1. 先获取EKS集群的OIDC提供商(若未定义)

data "aws_eks_cluster" "eks_cluster" {
  name = var.eks_cluster_name # 替换为你的EKS集群名称
}

data "aws_iam_openid_connect_provider" "eks_oidc" {
  url = data.aws_eks_cluster.eks_cluster.identity[0].oidc[0].issuer
}

2. 修正被假设角色的信任策略(限定指定Pod服务账户)

resource "aws_iam_role" "techdocs_iam_role" {
  name = var.techdocs_iam_role
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRoleWithWebIdentity"
        Effect = "Allow"
        Principal = {
          Federated = data.aws_iam_openid_connect_provider.eks_oidc.arn
        }
        Condition = {
          StringEquals = {
            "${replace(data.aws_eks_cluster.eks_cluster.identity[0].oidc[0].issuer, "https://", "")}:sub" = "system:serviceaccount:${var.namespace}:${var.service_account_name}"
          }
        }
      },
    ]
  })
}

说明:替换var.namespace和var.service_account_name为你的Pod所在命名空间和服务账户名称,确保只有指定Pod能Assume该角色。

3. 为应用角色关联AssumeRole权限

假设你的应用角色为aws_iam_role.app_role(IRSA绑定的角色),将AssumeRole策略关联到该角色:

resource "aws_iam_role_policy_attachment" "app_assume_role_attach" {
  role       = aws_iam_role.app_role.name # 替换为你的应用IAM角色名称
  policy_arn = data.aws_iam_policy_document.app_iam_policy.json
}

4. 将S3权限策略关联到被假设的角色

resource "aws_iam_role_policy_attachment" "techdocs_s3_access" {
  role       = aws_iam_role.techdocs_iam_role.name
  policy_arn = aws_iam_policy.policy.arn
}

5. 修正AssumeRole权限策略(避免硬编码ARN)

data "aws_iam_policy_document" "app_iam_policy" {
  statement {
    actions = ["sts:AssumeRole"]
    resources = [aws_iam_role.techdocs_iam_role.arn]
  }
}

JS代码注意事项

ChainableTemporaryCredentials的获取是异步操作,需等待回调完成后再使用凭证:

const tempCredentials = new aws.ChainableTemporaryCredentials({
    params: {
        RoleArn: process.env.TARGET_ROLE_ARN, // 建议通过环境变量传入ARN,不要硬编码
    },
});

tempCredentials.get((err) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(tempCredentials.accessKeyId);
    console.log(tempCredentials.secretAccessKey);
    // 此处可使用临时凭证执行S3操作
});

验证步骤

  1. 执行Terraform部署:terraform apply
  2. 确认Pod使用的服务账户已正确关联IRSA角色
  3. 重新部署Pod,测试AssumeRole及S3操作权限

内容的提问来源于stack exchange,提问作者Stan Loona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:45:58