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

EC2实例中AWS CLI可获取IAM角色凭证,Node.js却无法加载

EC2 IAM角色在AWS CLI正常,但Node.js AWS SDK无法获取凭证的排查方案

可能的原因及解决办法

1. AWS SDK版本兼容问题

旧版aws-sdk(v2)对EC2实例元数据服务v2(IMDSv2)的支持不完善,而AWS CLI已默认适配IMDSv2。优先尝试升级到最新稳定版:

npm update aws-sdk

若允许,也可迁移到AWS SDK v3(@aws-sdk/client-s3),它对IMDSv2的支持更稳定:

npm install @aws-sdk/client-s3

对应代码示例:

const { S3Client, ListBucketsCommand } = require("@aws-sdk/client-s3");
const client = new S3Client({ region: "us-west-2" });
client.send(new ListBucketsCommand({}))
  .then(data => console.log(data.Buckets))
  .catch(err => console.error(err));

2. IMDSv2强制配置导致令牌获取失败

如果EC2实例开启了强制IMDSv2(HttpTokens=required),旧版SDK可能无法自动获取会话令牌。

检查实例IMDS配置:

aws ec2 describe-instances --instance-ids <你的实例ID> --query 'Reservations[0].Instances[0].MetadataOptions'

若返回"HttpTokens": "required",可按以下方式处理:

  • 显式配置SDK支持IMDSv2:
    const AWS = require("aws-sdk");
    // 调整元数据服务超时与重试次数
    AWS.config.metadataServiceTimeout = 5000;
    AWS.config.metadataServiceNumRetries = 3;
    // 强制使用EC2元数据凭证
    AWS.config.credentials = new AWS.EC2MetadataCredentials({
      httpOptions: { timeout: 5000 },
      maxRetries: 3
    });
    const S3 = new AWS.S3();
    S3.listBuckets(function(err, data) {
      console.log(data?.Buckets || err);
    });
    
  • 临时关闭IMDSv2强制(仅用于测试,生产环境不推荐):
    aws ec2 modify-instance-metadata-options --instance-id <你的实例ID> --http-tokens optional
    

3. 网络或本地权限限制

虽然CLI能访问IMDS,但Node.js进程可能受SELinux、防火墙等限制,无法访问169.254.169.254(IMDS地址)。在实例上测试连通性:

# 测试IMDSv1
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 测试IMDSv2
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/

若curl无法返回IAM角色名称,检查实例的安全组、NACL是否允许访问169.254.169.254(默认允许,若被修改需恢复)。

4. 强制指定凭证来源

显式让SDK从EC2元数据服务获取凭证,跳过其他凭证查找路径:

const AWS = require("aws-sdk");
const S3 = new AWS.S3({
  credentials: new AWS.EC2MetadataCredentials()
});
S3.listBuckets(function(err, data) {
  if (err) console.error(err);
  else console.log(data.Buckets);
});

内容的提问来源于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 04:56:39