AWS EKS部署NestJS应用遇SES AccessDenied权限问题求助
问题排查方案
1. 确认AWS SDK凭证优先级问题
AWS SDK的凭证加载优先级为:实例元数据服务(IMDS)角色 > 环境变量 > 本地凭证文件。即使你注入了IAM用户密钥,SDK仍可能优先使用EKS节点的实例角色。
- 验证方式:进入Pod内部执行
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/,查看返回的角色名是否为错误提示中的节点组角色。若是,说明SDK未使用你设置的环境变量凭证。 - 解决办法:
- 代码中显式指定使用环境变量凭证:
import { SESClient } from "@aws-sdk/client-ses"; const sesClient = new SESClient({ credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID!, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, }, region: process.env.AWS_REGION, });
- 或在Deployment的环境变量中添加
AWS_EC2_METADATA_DISABLED=true,禁用IMDS凭证获取。
2. 检查Deployment环境变量注入是否正确
进入Pod内部执行printenv | grep AWS_,确认AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY是否存在且值正确。若为空或有误,说明Deployment的环境变量配置存在问题(如Secret挂载错误、env字段书写错误)。
3. 验证IAM用户权限有效性
使用该IAM用户的密钥在本地执行aws ses list-templates --region <你的区域>,检查是否能正常返回结果。若本地也失败,说明IAM用户的权限配置有问题(如策略未关联到用户、策略中的资源/权限配置错误)。
4. 排查IRSA(ServiceAccount关联IAM角色)干扰
若EKS集群配置了IAM Roles for Service Accounts(IRSA),Pod会自动使用关联的IAM角色,覆盖环境变量凭证:
- 查看Pod关联的ServiceAccount:
kubectl describe pod <pod-name> | grep ServiceAccount - 检查该ServiceAccount是否有IAM角色注解:
kubectl describe sa <sa-name>,查看是否存在eks.amazonaws.com/role-arn注解。若有,需给该IAM角色添加ses:ListTemplates权限,或移除注解让Pod使用环境变量凭证。
5. 检查节点组实例角色的拒绝策略
节点组实例角色若存在明确的Deny策略,会覆盖允许策略。检查该角色的权限策略,确认没有拒绝ses:*或ses:ListTemplates的语句。
内容的提问来源于stack exchange,提问作者Siddiqui Noor
相关产品推荐
相关产品推荐

