Skip to content

生命周期管理

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)

📖 相关资源


下一步:学习 版本控制 🔖