如何在NodeJS应用中安全使用Amazon S3?临时凭证实现方法
Node.js 用 AWS 临时凭证操作 S3 精简实现
核心思路
通过 AWS STS(安全令牌服务)的 AssumeRole 接口获取临时凭证,再用该凭证初始化 S3 客户端执行上传/下载操作。临时凭证自带过期时间,且权限由目标 IAM 角色定义,比长期密钥的风险更低。
前置准备
- 创建一个IAM角色,为其配置仅允许S3上传下载的最小权限(例如
s3:PutObject、s3:GetObject,并限定具体操作的桶) - 给你的IAM用户添加允许
sts:AssumeRole调用该角色的权限
依赖安装
npm install @aws-sdk/client-s3 @aws-sdk/client-sts dotenv
精简代码实现
require('dotenv').config(); const { S3Client, PutObjectCommand, GetObjectCommand } = require("@aws-sdk/client-s3"); const { STSClient, AssumeRoleCommand } = require("@aws-sdk/client-sts"); const fs = require('fs').promises; // 初始化STS客户端(自动加载本地AWS凭证链,或用.env里的IAM用户密钥) const stsClient = new STSClient({ credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, }); // 获取临时凭证 async function getTempCredentials() { const command = new AssumeRoleCommand({ RoleArn: process.env.AWS_ROLE_ARN, // 目标IAM角色的ARN RoleSessionName: "s3-temp-session", // 自定义会话名称 DurationSeconds: 3600, // 临时凭证有效期,最长12小时,此处设1小时 }); const response = await stsClient.send(command); return response.Credentials; } // 初始化带临时凭证的S3客户端 async function getS3Client() { const tempCreds = await getTempCredentials(); return new S3Client({ credentials: { accessKeyId: tempCreds.AccessKeyId, secretAccessKey: tempCreds.SecretAccessKey, sessionToken: tempCreds.SessionToken, }, region: process.env.AWS_REGION, }); } // 上传本地文件到S3 async function uploadFileToS3(localPath, s3Key) { const s3Client = await getS3Client(); const fileContent = await fs.readFile(localPath); const command = new PutObjectCommand({ Bucket: process.env.AWS_BUCKET_NAME, Key: s3Key, Body: fileContent, }); await s3Client.send(command); console.log(`文件 ${s3Key} 上传完成`); } // 从S3下载文件到本地 async function downloadFileFromS3(s3Key, localPath) { const s3Client = await getS3Client(); const command = new GetObjectCommand({ Bucket: process.env.AWS_BUCKET_NAME, Key: s3Key, }); const response = await s3Client.send(command); await fs.writeFile(localPath, response.Body); console.log(`文件 ${s3Key} 下载完成`); } // 示例调用(取消注释即可测试) // uploadFileToS3('./test.jpg', 'uploads/test.jpg'); // downloadFileFromS3('uploads/test.jpg', './downloaded_test.jpg');
.env 配置示例
AWS_ACCESS_KEY_ID=你的IAM用户密钥ID AWS_SECRET_ACCESS_KEY=你的IAM用户密钥 AWS_ROLE_ARN=arn:aws:iam::你的AWS账号ID:role/你的IAM角色名称 AWS_BUCKET_NAME=你的S3桶名称 AWS_REGION=us-east-1 # 替换为你的桶所在区域
安全提示
- 给IAM角色配置最小权限:仅开放必要的S3操作,且限定到指定桶
- 临时凭证有效期不要设置过长,建议1-3小时
- 本地开发时可省略.env中的密钥配置:AWS SDK会自动读取
~/.aws/credentials(AWS CLI配置的凭证),此时STS客户端无需手动传入credentials参数
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

