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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:53:25