在儲存貯體上設定 S3 生命週期組態 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在儲存貯體上設定 S3 生命週期組態

您可以使用 Amazon S3 主控台、 AWS Command Line Interface (AWS CLI) AWS SDKs、 或 Amazon S3 在儲存貯體上設定 Amazon S3 REST 生命週期組態API。如需 S3 生命週期組態的資訊,請參閱管理物件的生命週期

在 S3 生命週期組態中,您可以使用生命週期規則來定義您希望 Amazon S3 在物件生命週期內採取的動作。例如,您可以定義規則,將物件轉換為另一個儲存類別、封存物件,或在指定的一段時間後過期 (刪除) 物件。

S3 生命週期考量事項

在設定生命週期組態之前,請注意下列事項:

生命週期組態傳播延遲

當您新增儲存貯體的 S3 生命週期組態時,在新的或已更新的 S3 生命週期組態完全傳播至所有 Amazon S3 系統之前通常會一些延遲。在組態完全生效之前,預期會有幾分鐘的延遲。當您刪除 S3 生命週期組態時,可能會發生這項延遲。

轉換或過期延遲

生命週期規則滿足到規則動作完成之間有延遲。例如,假設一組物件已於 1 月 1 日由生命週期規則過期。即使已於 1 月 1 日滿足過期規則,Amazon S3 仍可能在數天或甚至數週後才實際刪除這些物件。發生此延遲是因為 S3 生命週期會以非同步方式佇列轉換或過期的物件。不過,即使動作未完成,帳單變更通常會在滿足生命週期規則時套用。如需詳細資訊,請參閱帳單 的變更。若要監控作用中生命週期規則所做的更新效果,請參閱 如何監視生命週期規則所採取的動作?

更新、停用或刪除生命週期規則

當您停用或刪除生命週期規則時,Amazon S3 會停止排程新的物件,以便在短暫延遲後進行刪除或轉換。任何已排定的物件都會取消排定,而且不會刪除或轉換。

注意

在更新、停用或刪除生命週期規則之前,請使用 LISTAPI操作 (例如 ListObjectsV2, ListObjectVersions、 和 ListMultipartUploads) 或 使用 S3 庫存編製目錄和分析資料 ,以驗證 Amazon S3 已根據您的使用案例轉換並過期符合資格的物件。如果您在更新、停用或刪除生命週期規則時遇到任何問題,請參閱 疑難排解 Amazon S3 生命週期問

現有物件和新物件

當您新增儲存貯體的生命週期組態時,組態規則會套用至現有物件以及稍後新增的物件。例如,如果您今天使用過期動作新增生命週期組態規則,導致具有特定字首的物件在建立後 30 天過期,Amazon S3 將排入佇列,以移除超過 30 天且具有指定字首的任何現有物件。

監控生命週期規則的影響

若要監控作用中生命週期規則所做的更新效果,請參閱 如何監視生命週期規則所採取的動作?

帳單變更

在滿足生命週期組態規則和執行滿足規則所觸發的動作之間,可能會有延遲。不過,即使尚未採取動作,帳單也會在滿足生命週期組態規則後立即變更。

例如,在物件過期時間之後,即使物件未立即刪除,也不會向您收取儲存費用。同樣地,只要物件轉換時間過了,就會向您收取 S3 Glacier Flexible Retrieval 儲存費率,即使物件未立即轉換為 S3 Glacier Flexible Retrieval 儲存類別。

不過,生命週期轉換為 S3 Intelligent-Tiering 儲存類別是例外狀況。在物件轉換為 S3 Intelligent-Tiering 儲存類別之後,才會發生帳單變更。

多個或衝突規則

當您在 S3 生命週期組態中有多個規則時,物件可以在同一天符合多個 S3 生命週期動作的資格。在這種情況下,Amazon S3 遵循以下一般規則:

  • 永久刪除優先於轉換。

  • 轉換優先於建立刪除標記

  • 當物件同時符合 S3 Glacier Flexible Retrieval 和 S3 Standard-IA (或 S3 One Zone-IA) 轉換的資格時,Amazon S3 會選擇 S3 Glacier Flexible Retrieval 轉換。

如需範例,請參閱 重疊篩選條件和衝突生命週期動作的範例

如何設定 S3 生命週期組態

您可以使用 Amazon S3 主控台、 AWS Command Line Interface (AWS CLI) AWS SDKs、 或 Amazon S3 在儲存貯體上設定 Amazon S3 REST 生命週期組態API。

如需 AWS CloudFormation 範本和範例的相關資訊,請參閱使用 AWS CloudFormation 範本AWS::S3::Bucket (在 AWS CloudFormation 使用者指南中)

您可以使用共用字首 (以通用字串開頭的物件名稱) 或標籤,定義儲存貯體中所有物件或物件子集的生命週期規則。在生命週期規則中,您可以定義目前和非目前物件版本特有的動作。如需詳細資訊,請參閱下列內容:

建立生命週期規則
  1. 登入 AWS Management Console 並在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/

  2. Buckets (儲存貯體) 清單中,選擇要建立生命週期規則的儲存貯體名稱。

  3. 選擇 Management (管理) 標籤,然後選擇 Create lifecycle rule (建立生命週期規則)

  4. Lifecycle rule name (生命週期規則名稱) 中,輸入規則的名稱。

    在儲存貯體內,名稱必須是唯一的。

  5. 選擇生命週期規則的範圍:

    • 若要將此生命週期規則套用至帶有特定前綴或標籤的所有物件,請選擇 Limit the scope to specific prefixes or tags (將範圍限制為特定前綴或標籤)

      • 若要依字首限制範圍,請在 Prefix (字首) 中輸入字首。

      • 若要依標籤限制範圍,請選擇 Add tag (新增標籤),然後輸入標籤鍵和值。

      如需物件名稱字首的詳細資訊,請參閱「命名 Amazon S3 物件」。如需物件標籤的詳細資訊,請參閱 使用標籤分類儲存空間

    • 若要將此生命週期規則套用至儲存貯體 中的所有物件,請選擇此規則會套用至儲存貯體 中的所有物件,然後選擇我確認此規則會套用至儲存貯體 中的所有物件

  6. 若要依物件大小篩選規則,您可以選取指定物件大小下限 指定物件大小上限 或兩個選項。

    • 當您指定物件大小下限物件大小上限的值時,該值必須大於 0 位元組,且最多 5 TB。您可以指定該值,以位元組、KB、MB 或 GB 為單位。

    • 當您指定兩個值時,物件大小上限必須大於物件大小下限。

      注意

      最小物件大小最大物件大小篩選條件會排除指定的值。例如,如果您將篩選條件設定為過期物件大小下限為 128 KB,則剛好為 128 KB 的物件不會過期。反之,規則僅適用於大小大於 128 KB 的物件。

  7. Lifecycle rule actions (生命週期規則動作) 下,選擇您希望生命週期規則執行的動作:

    • 在儲存類別之間轉移物件的目前版本

    • 在儲存類別之間轉移物件的先前版本

    • 讓物件的目前版本過期

      注意

      對於未啟用 S3 版本控制的儲存貯體,過期的目前版本會導致 Amazon S3 永久刪除物件。如需詳細資訊,請參閱生命週期動作與儲存貯體版本控制的狀態

    • 永久刪除物件的先前版本

    • 刪除過期的刪除標記或未完成的分段上傳

    視您選擇的動作而定,將會出現不同的選項。

  8. 若要在儲存體類別之間轉換物件的目前版本,請在在儲存體類別之間轉換物件的目前版本下執行下列動作:

    1. 儲存體類別轉換 中,選擇要轉換至的儲存體類別。如需可能的轉換清單,請參閱 支援的生命週期轉換。您可以從下列儲存類別中選擇:

      • S3 標準 – IA

      • S3 Intelligent-Tiering

      • S3 單區域 – IA

      • S3 Glacier Instant Retrieval

      • S3 Glacier Flexible Retrieval

      • S3 Glacier Deep Archive

    2. Days after object creation (物件建立後的天數) 中,輸入建立後幾天要轉移物件。

    如需儲存體方案的詳細資訊,請參閱「了解和管理 Amazon S3 儲存類別」。您可以為目前的物件版本或舊的物件版本定義轉換,也可以同時為兩者定義轉換。您可利用版本控制在單一儲存貯體中保留物件的多個版本。如需版本控制的詳細資訊,請參閱「使用 S3 主控台」。

    重要

    當您選擇 S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval 或 Glacier Deep Archive 儲存類別時,物件會保留在 Amazon S3 中。您無法透過個別的 Amazon S3 Glacier 服務直接存取物件。如需詳細資訊,請參閱使用 Amazon S3 生命週期轉換物件

  9. 若要在儲存體類別之間轉換物件的非目前版本,請在在儲存體類別之間轉換物件的非目前版本 下執行下列動作:

    1. 儲存體類別轉換 中,選擇要轉換至的儲存體類別。如需可能的轉換清單,請參閱 支援的生命週期轉換。您可以從下列儲存類別中選擇:

      • S3 標準 – IA

      • S3 Intelligent-Tiering

      • S3 單區域 – IA

      • S3 Glacier Instant Retrieval

      • S3 Glacier Flexible Retrieval

      • S3 Glacier Deep Archive

    2. 物件變成非目前 後的天數中,輸入建立後轉換物件的天數。

  10. 若要讓物件的目前版本過期,請在 Expire current versions of objects (讓物件的目前版本過期) 下的 Number of days after object creation (物件建立後的天數) 中,輸入天數。

    重要

    在非版本儲存貯體中,過期動作會導致 Amazon S3 永久移除物件。如需生命週期動作的詳細資訊,請參閱「描述生命週期動作的元素」。

  11. 若要永久刪除物件的先前版本,請在 Permanently delete noncurrent versions of objects (永久刪除物件的非現行版本) 下的 Days after objects become noncurrent (物件變成非現行版本後的天數) 中,輸入天數。您可以選擇指定要保留的較新版本數目,方法是在要保留的較新版本數目下方輸入值。

  12. Delete expired delete markers or incomplete multipart uploads (刪除過期刪除標記或未完成的分段上傳) 下,選擇 Delete expired object delete markers (刪除過期物件刪除標記)Delete incomplete multipart uploads (刪除未完成的分段上傳)。然後,輸入分段上傳啟動後幾天要結束並清理未完成的分段上傳。

    如需分段上傳的詳細資訊,請參閱「使用分段上傳來上傳和複製物件」。

  13. 選擇建立規則

    如果規則未包含任何錯誤,Amazon S3 會啟用該規則,您可以在 Lifecycle rules (生命週期規則) 下的 Management (管理) 標籤上看到該規則。

您可以使用下列 AWS CLI 命令來管理 S3 生命週期組態:

  • put-bucket-lifecycle-configuration

  • get-bucket-lifecycle-configuration

  • delete-bucket-lifecycle

如需設定 的指示 AWS CLI,請參閱 Amazon S3 參考 中的使用 Amazon S3 開發 AWS CLI。Amazon S3 API

Amazon S3 生命週期組態是 XML 檔案。但當您使用 時 AWS CLI,您無法指定XML格式。您必須改為指定JSON格式。以下是XML生命週期組態範例,以及您可以在 AWS CLI命令中指定的對等JSON組態。

請考慮下列範例 S3 生命週期組態。

範例 1
XML
<LifecycleConfiguration> <Rule> <ID>ExampleRule</ID> <Filter> <Prefix>documents/</Prefix> </Filter> <Status>Enabled</Status> <Transition> <Days>365</Days> <StorageClass>GLACIER</StorageClass> </Transition> <Expiration> <Days>3650</Days> </Expiration> </Rule> </LifecycleConfiguration>
JSON
{ "Rules": [ { "Filter": { "Prefix": "documents/" }, "Status": "Enabled", "Transitions": [ { "Days": 365, "StorageClass": "GLACIER" } ], "Expiration": { "Days": 3650 }, "ID": "ExampleRule" } ] }
範例 2
XML
<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Rule> <ID>id-1</ID> <Expiration> <Days>1</Days> </Expiration> <Filter> <And> <Prefix>myprefix</Prefix> <Tag> <Key>mytagkey1</Key> <Value>mytagvalue1</Value> </Tag> <Tag> <Key>mytagkey2</Key> <Value>mytagvalue2</Value> </Tag> </And> </Filter> <Status>Enabled</Status> </Rule> </LifecycleConfiguration>
JSON
{ "Rules": [ { "ID": "id-1", "Filter": { "And": { "Prefix": "myprefix", "Tags": [ { "Value": "mytagvalue1", "Key": "mytagkey1" }, { "Value": "mytagvalue2", "Key": "mytagkey2" } ] } }, "Status": "Enabled", "Expiration": { "Days": 1 } } ] }

您可以如下來測試 put-bucket-lifecycle-configuration

測試組態
  1. 將JSON生命週期組態儲存在檔案中 (例如,lifecycle.json).

  2. 執行下列 AWS CLI 命令,在儲存貯體上設定生命週期組態。以您自己的資訊取代 user input placeholders

    $ aws s3api put-bucket-lifecycle-configuration  \ --bucket amzn-s3-demo-bucket  \ --lifecycle-configuration file://lifecycle.json
  3. 若要驗證,請使用 get-bucket-lifecycle-configuration AWS CLI 命令擷取 S3 生命週期組態,如下所示:

    $ aws s3api get-bucket-lifecycle-configuration  \ --bucket amzn-s3-demo-bucket
  4. 若要刪除 S3 生命週期組態,請使用 delete-bucket-lifecycle AWS CLI 命令,如下所示:

    aws s3api delete-bucket-lifecycle \ --bucket amzn-s3-demo-bucket
Java

您可以使用 AWS SDK for Java 來管理儲存貯體的 S3 生命週期組態。如需管理 S3 生命週期組態的詳細資訊,請參閱管理物件的生命週期

注意

當您將 S3 生命週期組態新增至儲存貯體時,如果有儲存貯體目前的生命週期組態,Amazon S3 會取代儲存貯體目前的生命週期組態。若要更新現有生命週期組態,請先擷取,再進行所要的變更,然後將修正過的組態新增至儲存貯體。

下列範例示範如何使用 AWS SDK for Java 新增、更新和刪除儲存貯體的生命週期組態。此範例執行下列操作:

  • 新增儲存貯體的生命週期組態。

  • 擷取生命週期組態,並新增其他規則來更新此組態。

  • 將經過修改的生命週期組態組態,加入到儲存貯體中。Amazon S3 取代現有的組態。

  • 再次擷取組態,並透過列印規則數目來驗證其具有正確的規則數目。

  • 刪除生命週期組態,並嘗試再次擷取,以驗證它是否已刪除。

如需建立和測試工作範例的指示,請參閱 AWS SDK for Java 開發人員指南 中的入門

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.BucketLifecycleConfiguration; import com.amazonaws.services.s3.model.BucketLifecycleConfiguration.Transition; import com.amazonaws.services.s3.model.StorageClass; import com.amazonaws.services.s3.model.Tag; import com.amazonaws.services.s3.model.lifecycle.LifecycleAndOperator; import com.amazonaws.services.s3.model.lifecycle.LifecycleFilter; import com.amazonaws.services.s3.model.lifecycle.LifecyclePrefixPredicate; import com.amazonaws.services.s3.model.lifecycle.LifecycleTagPredicate; import java.io.IOException; import java.util.Arrays; public class LifecycleConfiguration { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; // Create a rule to archive objects with the "glacierobjects/" prefix to Glacier // immediately. BucketLifecycleConfiguration.Rule rule1 = new BucketLifecycleConfiguration.Rule() .withId("Archive immediately rule") .withFilter(new LifecycleFilter(new LifecyclePrefixPredicate("glacierobjects/"))) .addTransition(new Transition().withDays(0).withStorageClass(StorageClass.Glacier)) .withStatus(BucketLifecycleConfiguration.ENABLED); // Create a rule to transition objects to the Standard-Infrequent Access storage // class // after 30 days, then to Glacier after 365 days. Amazon S3 will delete the // objects after 3650 days. // The rule applies to all objects with the tag "archive" set to "true". BucketLifecycleConfiguration.Rule rule2 = new BucketLifecycleConfiguration.Rule() .withId("Archive and then delete rule") .withFilter(new LifecycleFilter(new LifecycleTagPredicate(new Tag("archive", "true")))) .addTransition(new Transition().withDays(30) .withStorageClass(StorageClass.StandardInfrequentAccess)) .addTransition(new Transition().withDays(365).withStorageClass(StorageClass.Glacier)) .withExpirationInDays(3650) .withStatus(BucketLifecycleConfiguration.ENABLED); // Add the rules to a new BucketLifecycleConfiguration. BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration() .withRules(Arrays.asList(rule1, rule2)); try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Save the configuration. s3Client.setBucketLifecycleConfiguration(bucketName, configuration); // Retrieve the configuration. configuration = s3Client.getBucketLifecycleConfiguration(bucketName); // Add a new rule with both a prefix predicate and a tag predicate. configuration.getRules().add(new BucketLifecycleConfiguration.Rule().withId("NewRule") .withFilter(new LifecycleFilter(new LifecycleAndOperator( Arrays.asList(new LifecyclePrefixPredicate("YearlyDocuments/"), new LifecycleTagPredicate(new Tag( "expire_after", "ten_years")))))) .withExpirationInDays(3650) .withStatus(BucketLifecycleConfiguration.ENABLED)); // Save the configuration. s3Client.setBucketLifecycleConfiguration(bucketName, configuration); // Retrieve the configuration. configuration = s3Client.getBucketLifecycleConfiguration(bucketName); // Verify that the configuration now has three rules. configuration = s3Client.getBucketLifecycleConfiguration(bucketName); System.out.println("Expected # of rules = 3; found: " + configuration.getRules().size()); // Delete the configuration. s3Client.deleteBucketLifecycleConfiguration(bucketName); // Verify that the configuration has been deleted by attempting to retrieve it. configuration = s3Client.getBucketLifecycleConfiguration(bucketName); String s = (configuration == null) ? "No configuration found." : "Configuration found."; System.out.println(s); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

您可以使用 AWS SDK for .NET 來管理儲存貯體上的 S3 生命週期組態。如需管理生命週期組態的詳細資訊,請參閱「管理物件的生命週期」。

注意

當您新增生命週期組態時,Amazon S3 會取代在指定儲存貯體的任何現有組態。若要更新生命週期組態,您必須先擷取現有的生命週期組態,並進行變更,然後將修正過的生命週期組態新增至儲存貯體。

下列範例示範如何使用 AWS SDK for .NET 新增、更新和刪除儲存貯體的生命週期組態。此程式法範例可做到以下:

  • 新增儲存貯體的生命週期組態。

  • 擷取生命週期組態,並新增其他規則來更新此組態。

  • 將經過修改的生命週期組態組態,加入到儲存貯體中。Amazon S3 取代現有的生命週期組態。

  • 再次擷取組態,並透過列印規則數,驗證其具有正確數量的規則。

  • 刪除生命週期組態並驗證刪除。

如需設定和執行程式碼範例的相關資訊,請參閱 AWS SDK for .NET 開發人員指南 中的 入門 AWS SDK for .NET

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class LifecycleTest { private const string bucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); AddUpdateDeleteLifecycleConfigAsync().Wait(); } private static async Task AddUpdateDeleteLifecycleConfigAsync() { try { var lifeCycleConfiguration = new LifecycleConfiguration() { Rules = new List<LifecycleRule> { new LifecycleRule { Id = "Archive immediately rule", Filter = new LifecycleFilter() { LifecycleFilterPredicate = new LifecyclePrefixPredicate() { Prefix = "glacierobjects/" } }, Status = LifecycleRuleStatus.Enabled, Transitions = new List<LifecycleTransition> { new LifecycleTransition { Days = 0, StorageClass = S3StorageClass.Glacier } }, }, new LifecycleRule { Id = "Archive and then delete rule", Filter = new LifecycleFilter() { LifecycleFilterPredicate = new LifecyclePrefixPredicate() { Prefix = "projectdocs/" } }, Status = LifecycleRuleStatus.Enabled, Transitions = new List<LifecycleTransition> { new LifecycleTransition { Days = 30, StorageClass = S3StorageClass.StandardInfrequentAccess }, new LifecycleTransition { Days = 365, StorageClass = S3StorageClass.Glacier } }, Expiration = new LifecycleRuleExpiration() { Days = 3650 } } } }; // Add the configuration to the bucket. await AddExampleLifecycleConfigAsync(client, lifeCycleConfiguration); // Retrieve an existing configuration. lifeCycleConfiguration = await RetrieveLifecycleConfigAsync(client); // Add a new rule. lifeCycleConfiguration.Rules.Add(new LifecycleRule { Id = "NewRule", Filter = new LifecycleFilter() { LifecycleFilterPredicate = new LifecyclePrefixPredicate() { Prefix = "YearlyDocuments/" } }, Expiration = new LifecycleRuleExpiration() { Days = 3650 } }); // Add the configuration to the bucket. await AddExampleLifecycleConfigAsync(client, lifeCycleConfiguration); // Verify that there are now three rules. lifeCycleConfiguration = await RetrieveLifecycleConfigAsync(client); Console.WriteLine("Expected # of rulest=3; found:{0}", lifeCycleConfiguration.Rules.Count); // Delete the configuration. await RemoveLifecycleConfigAsync(client); // Retrieve a nonexistent configuration. lifeCycleConfiguration = await RetrieveLifecycleConfigAsync(client); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } static async Task AddExampleLifecycleConfigAsync(IAmazonS3 client, LifecycleConfiguration configuration) { PutLifecycleConfigurationRequest request = new PutLifecycleConfigurationRequest { BucketName = bucketName, Configuration = configuration }; var response = await client.PutLifecycleConfigurationAsync(request); } static async Task<LifecycleConfiguration> RetrieveLifecycleConfigAsync(IAmazonS3 client) { GetLifecycleConfigurationRequest request = new GetLifecycleConfigurationRequest { BucketName = bucketName }; var response = await client.GetLifecycleConfigurationAsync(request); var configuration = response.Configuration; return configuration; } static async Task RemoveLifecycleConfigAsync(IAmazonS3 client) { DeleteLifecycleConfigurationRequest request = new DeleteLifecycleConfigurationRequest { BucketName = bucketName }; await client.DeleteLifecycleConfigurationAsync(request); } } }
Ruby

您可以使用 AWS SDK for Ruby 來管理儲存貯體上的 S3 生命週期組態,方法是使用 類別 AWS::S3::BucketLifecycleConfiguration。 如需管理 S3 生命週期組態的詳細資訊,請參閱 管理物件的生命週期

Amazon Simple Storage Service API參考中的下列主題描述與 S3 生命週期組態相關的RESTAPI操作:

進行 S3 生命週期疑難排解

如需使用 S3 生命週期時可能發生的常見問題,請參閱 疑難排解 Amazon S3 生命週期問