生命周期管理
S3 生命周期管理允许你自动转换存储类别或删除对象,优化存储成本。
🔄 什么是生命周期
生命周期规则定义了对象在其生命周期中的自动操作:
- 转换 - 自动转换到更便宜的存储类别
- 过期 - 自动删除对象
💰 存储类别
存储类别对比
| 存储类别 | 使用场景 | 可用性 | 检索 | 最短存储 | 成本 |
|---|---|---|---|---|---|
| Standard | 频繁访问 | 99.99% | 毫秒 | 无 | 1.0x |
| Intelligent-Tiering | 未知模式 | 99.9% | 毫秒 | 30天 | 0.8-1.0x |
| Standard-IA | 低频访问 | 99.9% | 毫秒 | 30天 | 0.5x |
| One Zone-IA | 低频(单区) | 99.5% | 毫秒 | 30天 | 0.4x |
| Glacier Instant | 归档即时 | 99.9% | 毫秒 | 90天 | 0.2x |
| Glacier Flexible | 归档 | 99.99% | 分钟-小时 | 90天 | 0.1x |
| Glacier Deep Archive | 长期归档 | 99.99% | 12小时 | 180天 | 0.04x |
📋 创建生命周期规则
Node.js 示例
javascript
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const setLifecyclePolicy = async (bucketName) => {
const params = {
Bucket: bucketName,
LifecycleConfiguration: {
Rules: [
{
Id: 'Move logs to IA after 30 days',
Status: 'Enabled',
Prefix: 'logs/', // 仅应用于 logs/ 前缀
Transitions: [
{
Days: 30,
StorageClass: 'STANDARD_IA'
},
{
Days: 90,
StorageClass: 'GLACIER'
}
],
Expiration: {
Days: 365 // 1年后删除
}
}
]
}
};
try {
await s3.putBucketLifecycleConfiguration(params).promise();
console.log('Lifecycle policy set successfully');
} catch (err) {
console.error(err);
}
};🎯 常用生命周期策略
1. 日志归档
javascript
// 日志文件:30天后转 IA,90天后转 Glacier,1年后删除
{
Id: 'Archive logs',
Status: 'Enabled',
Filter: {
Prefix: 'logs/'
},
Transitions: [
{
Days: 30,
StorageClass: 'STANDARD_IA'
},
{
Days: 90,
StorageClass: 'GLACIER'
}
],
Expiration: {
Days: 365
}
}2. 备份文件
javascript
// 备份文件:立即转 IA,30天后转 Glacier,保留7年
{
Id: 'Backup retention',
Status: 'Enabled',
Filter: {
Prefix: 'backups/'
},
Transitions: [
{
Days: 0, // 立即转换
StorageClass: 'STANDARD_IA'
},
{
Days: 30,
StorageClass: 'GLACIER'
}
],
Expiration: {
Days: 2555 // 7年
}
}3. 临时文件
javascript
// 临时文件:7天后自动删除
{
Id: 'Delete temp files',
Status: 'Enabled',
Filter: {
Prefix: 'temp/'
},
Expiration: {
Days: 7
}
}4. 用户上传文件
javascript
// 用户上传:90天后转 IA,180天后转 Glacier
{
Id: 'User uploads',
Status: 'Enabled',
Filter: {
Prefix: 'uploads/'
},
Transitions: [
{
Days: 90,
StorageClass: 'STANDARD_IA'
},
{
Days: 180,
StorageClass: 'GLACIER'
}
]
}5. 按标签管理
javascript
// 根据对象标签管理生命周期
{
Id: 'Archive by tag',
Status: 'Enabled',
Filter: {
And: {
Prefix: 'documents/',
Tags: [
{
Key: 'archive',
Value: 'true'
}
]
}
},
Transitions: [
{
Days: 0,
StorageClass: 'GLACIER'
}
]
}🗑️ 删除策略
按日期删除
javascript
{
Id: 'Delete old files',
Status: 'Enabled',
Expiration: {
Days: 365 // 365天后删除
}
}按特定日期删除
javascript
{
Id: 'Delete on specific date',
Status: 'Enabled',
Expiration: {
Date: '2025-01-01T00:00:00.000Z' // 在特定日期删除
}
}删除过期对象删除标记
javascript
{
Id: 'Clean up delete markers',
Status: 'Enabled',
Expiration: {
ExpiredObjectDeleteMarker: true // 删除孤立的删除标记
}
}🔄 版本控制下的生命周期
管理非当前版本
javascript
{
Id: 'Archive old versions',
Status: 'Enabled',
NoncurrentVersionTransitions: [
{
NoncurrentDays: 30,
StorageClass: 'STANDARD_IA'
},
{
NoncurrentDays: 90,
StorageClass: 'GLACIER'
}
],
NoncurrentVersionExpiration: {
NoncurrentDays: 365 // 旧版本保留1年
}
}完整的版本管理策略
javascript
const setVersionedLifecycle = async (bucketName) => {
const params = {
Bucket: bucketName,
LifecycleConfiguration: {
Rules: [
{
Id: 'Complete versioning lifecycle',
Status: 'Enabled',
Filter: {
Prefix: '' // 应用于所有对象
},
// 当前版本
Transitions: [
{
Days: 30,
StorageClass: 'STANDARD_IA'
}
],
// 非当前版本
NoncurrentVersionTransitions: [
{
NoncurrentDays: 7,
StorageClass: 'STANDARD_IA'
},
{
NoncurrentDays: 30,
StorageClass: 'GLACIER'
}
],
NoncurrentVersionExpiration: {
NoncurrentDays: 90
},
// 删除过期的删除标记
Expiration: {
ExpiredObjectDeleteMarker: true
}
}
]
}
};
await s3.putBucketLifecycleConfiguration(params).promise();
};🧹 清理未完成的分片上传
javascript
{
Id: 'Abort incomplete multipart uploads',
Status: 'Enabled',
AbortIncompleteMultipartUpload: {
DaysAfterInitiation: 7 // 7天后删除未完成的分片上传
}
}📊 查看生命周期配置
javascript
// 获取生命周期配置
const getLifecyclePolicy = async (bucketName) => {
try {
const result = await s3.getBucketLifecycleConfiguration({
Bucket: bucketName
}).promise();
console.log('Lifecycle Rules:');
result.Rules.forEach(rule => {
console.log(`- ${rule.Id} (${rule.Status})`);
console.log(` Prefix: ${rule.Prefix || rule.Filter?.Prefix || 'all'}`);
if (rule.Transitions) {
console.log(' Transitions:');
rule.Transitions.forEach(t => {
console.log(` Day ${t.Days}: ${t.StorageClass}`);
});
}
if (rule.Expiration) {
console.log(` Expiration: ${rule.Expiration.Days} days`);
}
});
return result.Rules;
} catch (err) {
if (err.code === 'NoSuchLifecycleConfiguration') {
console.log('No lifecycle configuration found');
} else {
console.error(err);
}
}
};🗑️ 删除生命周期配置
javascript
const deleteLifecyclePolicy = async (bucketName) => {
await s3.deleteBucketLifecycle({
Bucket: bucketName
}).promise();
console.log('Lifecycle configuration deleted');
};💡 最佳实践
1. 成本优化策略
javascript
// 根据访问频率设置转换
const costOptimizedLifecycle = {
Rules: [
{
Id: 'Cost optimization',
Status: 'Enabled',
Transitions: [
{
Days: 30,
StorageClass: 'INTELLIGENT_TIERING' // 自动优化
}
]
}
]
};2. 数据保留策略
javascript
// 合规要求:数据保留特定时间
const complianceLifecycle = {
Rules: [
{
Id: 'Compliance retention',
Status: 'Enabled',
Filter: {
Tag: {
Key: 'compliance',
Value: 'required'
}
},
Transitions: [
{
Days: 90,
StorageClass: 'GLACIER'
}
],
Expiration: {
Days: 2555 // 7年(常见合规要求)
}
}
]
};3. 渐进式归档
javascript
// 逐步降低成本
const progressiveArchive = {
Rules: [
{
Id: 'Progressive archive',
Status: 'Enabled',
Transitions: [
{
Days: 30,
StorageClass: 'STANDARD_IA' // 第一步:低频访问
},
{
Days: 90,
StorageClass: 'GLACIER_IR' // 第二步:即时归档
},
{
Days: 180,
StorageClass: 'GLACIER' // 第三步:归档
},
{
Days: 365,
StorageClass: 'DEEP_ARCHIVE' // 第四步:深度归档
}
]
}
]
};4. 按对象大小优化
javascript
// 大文件和小文件不同策略
{
Rules: [
{
Id: 'Small files',
Status: 'Enabled',
Filter: {
ObjectSizeGreaterThan: 0,
ObjectSizeLessThan: 1048576 // < 1MB
},
Transitions: [
{
Days: 7,
StorageClass: 'STANDARD_IA'
}
]
},
{
Id: 'Large files',
Status: 'Enabled',
Filter: {
ObjectSizeGreaterThan: 104857600 // > 100MB
},
Transitions: [
{
Days: 30,
StorageClass: 'GLACIER'
}
]
}
]
}⚠️ 注意事项
1. 最短存储时间
Standard-IA, One Zone-IA: 30天
Glacier Instant, Glacier Flexible: 90天
Glacier Deep Archive: 180天
如果在最短存储时间前删除或转换,会收取剩余天数的费用。2. 检索费用
Glacier Flexible:
- Expedited: 1-5分钟,高费用
- Standard: 3-5小时,中费用
- Bulk: 5-12小时,低费用
Glacier Deep Archive:
- Standard: 12小时
- Bulk: 48小时3. 转换顺序
只能从高频到低频单向转换:
Standard → IA → Glacier → Deep Archive
不能反向转换(需要先检索到 Standard)📖 相关资源
下一步:学习 版本控制 🔖