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操作 });
验证步骤
- 执行Terraform部署:
terraform apply - 确认Pod使用的服务账户已正确关联IRSA角色
- 重新部署Pod,测试AssumeRole及S3操作权限
内容的提问来源于stack exchange,提问作者Stan Loona
相关产品推荐
相关产品推荐

