在值區上設定生命週期組態 - Amazon Simple Storage Service

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

在值區上設定生命週期組態

本節說明如何使用 Amazon S3 主控台、 AWS Command Line Interface (AWS CLI)、 AWS 開發套件或 Amazon S3 REST API 在儲存貯體上設定 Amazon S3 生命週期組態。如需 S3 生命週期組態的資訊,請參閱管理儲存生命週期

您可以使用生命週期規則,定義要讓 Amazon S3 在物件生命週期內採取的動作 (例如,將物件轉移至另一個儲存類別、封存物件,或在指定期限後刪除物件)。

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

傳播延遲

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

停用或刪除生命週期規則

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

注意

在更新、停用或刪除生命週期規則之前,請使用 LIST API 操作 (例如ListObjectsV2ListObjectVersions、和 ListMultipartUploads),或Amazon S3 清查根據您的使用案例確認 Amazon S3 已轉換並過期合格物件。如果您在更新、停用或刪除生命週期規則時遇到任何問題,請參閱針對 Amazon S3 生命週期問題進行疑難排解

現有物件和新物件

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

帳單變更

在滿足生命週期組態規則與執行符合規則所觸發的動作之間,可能會有延遲。不過,只要滿足生命週期組態規則,就會立即變更計費,即使尚未採取動作也一樣。

例如,在物件到期時間之後,即使物件未立即刪除,也不會向您收取儲存費用。同樣地,一旦物件轉換時間過後,即使物件未立即轉換為 S3 Glacier 彈性擷取儲存類別,您仍需支付 S3 Glacier 彈性擷取儲存費率的費用。

不過,生命週期轉換至 S3 智慧型分層儲存類別是例外。在物件轉換為 S3 智慧型分層儲存類別之後,帳單變更才會發生。

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

建立生命週期規則
  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 (新增標籤),然後輸入標籤鍵和值。

      如需物件名稱字首的詳細資訊,請參閱「建立物件索引鍵名稱」。如需物件標籤的詳細資訊,請參閱 使用標籤分類儲存空間

    • 若要將此生命週期規則套用至儲存貯體中的所有物件,請選擇 This rule applies to all objects in the bucket (此規則會套用於儲存貯體中的所有物件),然後選擇 I acknowledge that this rule applies to all objects in the bucket (我確認此規則會套用於儲存貯體中的所有物件)

  6. 若要依物件大小篩選規則,您可以勾選 Specify minimum object size (指定物件大小下限)、Specify maximum object size (指定物件大小上限),或同時選擇這兩個選項。

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

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

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

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

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

    • 讓物件的目前版本過期

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

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

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

  8. 若要在儲存類別之間轉移物件的目前版本,請在 Transition current versions of objects between storage classes (在儲存類別之間轉移物件的目前版本) 下:

    1. Storage class transitions (儲存類別轉移) 中,選擇轉移至您要的儲存類別:

      • S3 標準 – IA

      • S3 Intelligent-Tiering

      • S3 單區域 – IA

      • S3 Glacier Flexible Retrieval

      • S3 Glacier Deep Archive

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

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

    重要

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

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

    1. Storage class transitions (儲存類別轉移) 中,選擇轉移至您要的儲存類別:

      • S3 標準 – IA

      • S3 Intelligent-Tiering

      • S3 單區域 – IA

      • 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 (管理) 標籤上看到該規則。

若要取得有關 CloudFormation 範本和範例的資訊,請參閱〈使用範 AWS CloudFormation 本〉和AWS::S3::BucketAWS CloudFormation 使用指南〉。

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

  • put-bucket-lifecycle-configuration

  • get-bucket-lifecycle-configuration

  • delete-bucket-lifecycle

如需有關設定的指示 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

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 DOC-EXAMPLE-BUCKET  \ --lifecycle-configuration file://lifecycle.json
  3. 若要驗證,請使用命令擷取 S3 生get-bucket-lifecycle-configuration AWS CLI 命週期組態,如下所示:

    $ aws s3api get-bucket-lifecycle-configuration  \ --bucket DOC-EXAMPLE-BUCKET
  4. 若要刪除 S3 生命週期組態,請依照下列方式使用delete-bucket-lifecycle AWS CLI 指令:

    aws s3api delete-bucket-lifecycle \ --bucket DOC-EXAMPLE-BUCKET
Java

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

注意

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

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

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

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

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

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

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

如需建立及測試可行範例的說明,請參閱測試 Amazon S3 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 取代現有的生命週期組態。

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

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

如需如何建立及測試工作範例的說明,請參閱「執行 Amazon S3 .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。如需 AWS SDK for Ruby 搭配 Amazon S3 搭配使用的詳細資訊,請參閱使用 AWS SDK for Ruby -第 3 版。如需管理生命週期組態的詳細資訊,請參閱「管理儲存生命週期」。

Amazon Simple Storage Service API 參考 中的下列章節說明與 S3 生命週期組態相關的 REST API。