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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:11:08