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

部署在EC2上的Node.js应用如何获取S3临时访问密钥

Node.js 环境在EC2实例上获取S3访问临时凭证实现方案

最佳实践:依托EC2 IAM角色自动获取临时凭证(生产环境推荐)

不需要手动编写凭证生成、过期轮换逻辑,AWS SDK默认自带凭证提供者链,会自动从EC2实例元数据服务(IMDS)拉取绑定角色对应的临时凭证,到期自动刷新,无硬编码密钥的泄露风险,维护成本最低。
前置配置步骤:

  • 创建IAM角色,信任实体选择「EC2」
  • 给角色附加S3访问的最小权限策略,仅开放你业务需要的S3操作权限(如s3:GetObject、s3:PutObject),禁止给全量S3权限
  • 将该IAM角色绑定到运行Node.js应用的EC2实例

你贴的原有代码仅存在语法错误(初始化S3实例时缺少赋值等号),修正后即可直接使用,SDK会自动处理临时凭证的获取逻辑:

var AWS = require('aws-sdk');
// 初始化S3客户端,无需手动传入任何密钥信息
const s3 = new AWS.S3({
  region: '替换为你的S3桶所在区域,例如ap-shanghai',
  apiVersion: '2006-03-01'
});

// 直接调用S3接口即可
async function testS3Connection() {
  try {
    const result = await s3.listObjectsV2({
      Bucket: '替换为你的S3存储桶名称'
    }).promise();
    console.log('S3访问成功,返回对象列表:', result.Contents);
  } catch (error) {
    console.error('S3访问报错:', error);
  }
}

testS3Connection();

自定义场景:手动调用STS服务获取临时凭证

如果你有跨账号角色代入、自定义权限时效等特殊需求,可以通过STS服务的assumeRole接口主动申请临时凭证。注意该场景下EC2绑定的基础实例角色需要具备对应角色的sts:AssumeRole权限。
临时凭证包含访问密钥ID、秘密访问密钥、会话令牌三个核心字段,默认有效期可在15分钟到12小时之间自定义,到期后需要重新调用接口刷新。
实现代码如下:

var AWS = require('aws-sdk');
// 初始化STS客户端,SDK会自动使用EC2实例角色的基础权限调用STS
const sts = new AWS.STS({
  region: '替换为你的服务所在区域',
  apiVersion: '2011-06-15'
});

async function generateTempS3Client() {
  try {
    // 调用STS接口申请临时凭证
    const stsResponse = await sts.assumeRole({
      RoleArn: '替换为具备目标S3访问权限的IAM角色ARN',
      RoleSessionName: 'nodejs-s3-access', // 自定义会话名称,用于操作审计
      DurationSeconds: 3600 // 临时凭证有效期,单位秒,取值范围900-43200
    }).promise();

    const creds = stsResponse.Credentials;
    console.log('临时凭证获取成功,过期时间:', creds.Expiration);

    // 使用临时凭证初始化S3客户端
    const s3 = new AWS.S3({
      region: '替换为你的S3桶所在区域',
      credentials: new AWS.Credentials(
        creds.AccessKeyId,
        creds.SecretAccessKey,
        creds.SessionToken
      )
    });

    // 测试S3访问
    const listResult = await s3.listObjectsV2({
      Bucket: '替换为你的S3存储桶名称'
    }).promise();
    console.log('临时凭证访问S3成功:', listResult.Contents);
    return s3;
  } catch (error) {
    console.error('临时凭证获取或S3访问失败:', error);
    throw error;
  }
}

generateTempS3Client();

注意事项:禁止在代码、EC2实例本地配置文件中硬编码长期访问密钥,所有EC2场景下的AWS服务访问优先使用IAM实例角色+SDK自动凭证链的方案。如果选择手动获取临时凭证,需要自行实现凭证过期前的刷新逻辑,否则凭证到期后S3接口调用会返回权限错误。

内容的提问来源于stack exchange,提问作者Harsh Saxena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:27:34