部署在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
相关产品推荐
相关产品推荐

