Jenkins作业无法获取AWS IAM角色凭证问题排查
问题描述
我在AWS的EC2实例上部署了Jenkins,以ec2-user身份SSH登录实例后,执行aws configure list、aws s3 ls、node test.js等命令均正常(其中test.js通过AWS SDK调用S3服务)。但在Jenkins作业的「Execute Shell」构建步骤中执行相同命令时,node test.js报错CredentialsError提示缺少凭证,而aws命令却能正常获取EC2绑定的IAM角色凭证。请问Jenkins节点环境缺少什么配置导致无法读取系统凭证?
测试命令及报错信息
06:09:48 + aws configure list 06:09:49 Name Value Type Location 06:09:49 ---- ----- ---- -------- 06:09:49 profile <not set> None None 06:09:49 access_key ****************ZGQC iam-role 06:09:49 secret_key ****************E69U iam-role 06:09:49 region us-west-2 imds 06:09:49 + node --version 06:09:49 v18.17.0 06:09:49 + npm --version 06:09:49 9.6.7 06:09:49 + aws s3 ls 06:09:50 2020-06-25 20:18:09 bucket-1 06:09:50 2020-06-25 22:27:28 bucket-2 06:09:50 + node test.js 06:09:50 null 06:09:50 SyntaxError [CredentialsError]: Missing credentials in config 06:09:50 at JSON.parse (<anonymous>) 06:09:50 at /var/lib/jenkins/workspace/sagely-calendar-print/node_modules/aws-sdk/lib/metadata_service.js:115:38 06:09:50 at IncomingMessage.<anonymous> (/var/lib/jenkins/workspace/sagely-calendar-print/node_modules/aws-sdk/lib/metadata_service.js:74:45) 06:09:50 at IncomingMessage.emit (node:events:526:35) 06:09:50 at IncomingMessage.emit (node:domain:489:12) 06:09:50 at endReadableNT (node:internal/streams/readable:1359:12) 06:09:50 at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { 06:09:50 code: 'CredentialsError', 06:09:50 time: 2024-04-26T16:09:50.815Z, 06:09:50 originalError: { 06:09:50 message: 'Could not load credentials from any providers', 06:09:50 code: 'CredentialsError', 06:09:50 time: 2024-04-26T16:09:50.815Z, 06:09:50 originalError: { message: 'Unexpected end of JSON input' } 06:09:50 } 06:09:50 } 06:09:50 ERROR: Build step failed with exception
Node脚本内容
const AWS = require("aws-sdk"); const S3 = new AWS.S3(); S3.listBuckets(function(err, data) { console.log(data); console.log(err); });
问题原因与解决方案
核心原因
aws CLI与AWS SDK v2获取IAM角色凭证的机制存在差异:
- aws CLI能自动适配EC2实例元数据服务(IMDS)的访问规则(包括IMDSv2的会话令牌),且在Jenkins环境下能正常运行,说明IMDS本身无问题。
- AWS SDK v2在Jenkins默认的
jenkins用户环境中,可能因IMDS访问权限不足、缺少会话令牌(IMDSv2场景)或环境变量缺失,导致无法正确解析元数据服务的响应,最终触发凭证缺失报错。
具体解决办法
1. 解决IMDSv2会话令牌问题
如果EC2实例启用了IMDSv2,需要先获取会话令牌再执行Node脚本,在Jenkins的Execute Shell中添加:
# 获取IMDSv2会话令牌 TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") export AWS_EC2_METADATA_TOKEN=$TOKEN # 执行脚本 node test.js
2. 显式指定SDK使用实例元数据凭证
修改Node脚本,强制SDK从EC2元数据服务获取凭证:
const AWS = require("aws-sdk"); const s3 = new AWS.S3({ credentials: new AWS.EC2MetadataCredentials() }); s3.listBuckets(function(err, data) { console.log(data); console.log(err); });
3. 补充必要的环境变量
在Jenkins的Execute Shell中先设置环境变量,确保SDK能正确识别区域和配置:
export AWS_REGION=us-west-2 export AWS_SDK_LOAD_CONFIG=true node test.js
4. 检查jenkins用户的IMDS访问权限
执行以下命令验证jenkins用户是否能访问元数据服务:
sudo -u jenkins curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
如果返回绑定的IAM角色名称则正常;如果无响应或报错,需检查实例的IAM角色配置、安全组/网络ACL是否允许访问169.254.169.254。
5. 升级到AWS SDK v3
AWS SDK v3对IMDS的支持更完善,自动处理凭证获取逻辑,升级后可避免这类兼容性问题。
内容的提问来源于stack exchange,提问作者Justin808
相关产品推荐
相关产品推荐

