AWS S3 对象存储
云端文件存储与分发。
1 小时
AWS S3
这一课你将能做到
- 创建 S3 Bucket,上传下载文件
- 配置访问权限(公有/私有)
- 用预签名 URL 实现安全下载
- 静态网站托管
为什么要学
用户上传的头像、文章图片、视频文件不能存服务器硬盘(扩容麻烦、备份复杂)。S3 是对象存储,无限容量、高可用、低成本。
人话:S3 是「网盘」,存图片、视频、备份文件。
跟着做
步骤 1:创建 Bucket
# AWS Console → S3 → Create bucket
# Bucket name: my-app-files(全局唯一)
# Region: 选离你用户近的
# Block all public access: 勾选(默认私有)
步骤 2:AWS CLI 操作
# 安装 AWS CLI
pip install awscli
aws configure # 输入 Access Key ID 和 Secret Access Key
# 上传文件
aws s3 cp logo.png s3://my-app-files/images/logo.png
# 下载文件
aws s3 cp s3://my-app-files/images/logo.png ./logo.png
# 同步目录
aws s3 sync ./build s3://my-app-files/static
# 列出文件
aws s3 ls s3://my-app-files/
# 删除文件
aws s3 rm s3://my-app-files/images/logo.png
步骤 3:Node.js SDK
npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner
const { S3Client, PutObjectCommand, GetObjectCommand } = require('@aws-sdk/client-s3');
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const s3 = new S3Client({
region: 'ap-northeast-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
// 上传文件
async function uploadFile(key, body, contentType) {
await s3.send(new PutObjectCommand({
Bucket: 'my-app-files',
Key: key,
Body: body,
ContentType: contentType
}));
return `https://my-app-files.s3.ap-northeast-1.amazonaws.com/${key}`;
}
// 预签名 URL(临时访问,1小时有效)
async function getSignedDownloadUrl(key) {
const command = new GetObjectCommand({
Bucket: 'my-app-files',
Key: key
});
return await getSignedUrl(s3, command, { expiresIn: 3600 });
}
步骤 4:静态网站托管
# 1. Bucket → Properties → Static website hosting
# Index document: index.html
# Error document: index.html
# 2. Permissions → Bucket Policy
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-app-files/*"
}]
}
# 3. 上传静态文件
aws s3 sync ./dist s3://my-app-files
# 4. 访问 http://my-app-files.s3-website-ap-northeast-1.amazonaws.com