本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在值區上設定生命週期組態
本節說明如何使用 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 會停止排定新物件來進行刪除或轉換。任何已排定的物件都會取消排定,而且不會刪除或轉換。
現有物件和新物件
當您新增儲存貯體的生命週期組態時,組態規則會套用至現有物件以及稍後新增的物件。例如,如果您今天使用到期動作新增生命週期組態規則,使具有特定前置詞的物件在建立後 30 天到期,Amazon S3 將會排入佇列移除任何超過 30 天且具有指定前置碼的現有物件。
帳單變更
在滿足生命週期組態規則與執行符合規則所觸發的動作之間,可能會有延遲。不過,只要滿足生命週期組態規則,就會立即變更計費,即使尚未採取動作也一樣。
例如,在物件到期時間之後,即使物件未立即刪除,也不會向您收取儲存費用。同樣地,一旦物件轉換時間過後,即使物件未立即轉換為 S3 Glacier 彈性擷取儲存類別,您仍需支付 S3 Glacier 彈性擷取儲存費率的費用。
不過,生命週期轉換至 S3 智慧型分層儲存類別是例外。在物件轉換為 S3 智慧型分層儲存類別之後,帳單變更才會發生。
您可以使用共用前置詞 (以通用字串開頭的物件名稱) 或標籤,為值區中的所有物件或物件子集定義生命週期規則。在您的生命週期規則中,您可以定義目前與非目前物件版本特定的動作。如需詳細資訊,請參閱下列內容:
建立生命週期規則
-
登入 AWS Management Console 並開啟 Amazon S3 主控台,網址為 https://console.aws.amazon.com/s3/。
-
在 Buckets (儲存貯體) 清單中,選擇要建立生命週期規則的儲存貯體名稱。
-
選擇 Management (管理) 標籤,然後選擇 Create lifecycle rule (建立生命週期規則)。
-
在 Lifecycle rule name (生命週期規則名稱) 中,輸入規則的名稱。
在儲存貯體內,名稱必須是唯一的。
-
選擇生命週期規則的範圍:
-
若要將此生命週期規則套用至帶有特定前綴或標籤的所有物件,請選擇 Limit the scope to specific prefixes or tags (將範圍限制為特定前綴或標籤)。
如需物件名稱字首的詳細資訊,請參閱「建立物件索引鍵名稱」。如需物件標籤的詳細資訊,請參閱 使用標籤分類儲存空間。
-
若要將此生命週期規則套用至儲存貯體中的所有物件,請選擇 This rule applies to all objects in the bucket (此規則會套用於儲存貯體中的所有物件),然後選擇 I acknowledge that this rule applies to all objects in the bucket (我確認此規則會套用於儲存貯體中的所有物件)。
-
若要依物件大小篩選規則,您可以勾選 Specify minimum object size (指定物件大小下限)、Specify maximum object size (指定物件大小上限),或同時選擇這兩個選項。
-
在 Lifecycle rule actions (生命週期規則動作) 下,選擇您希望生命週期規則執行的動作:
-
在儲存類別之間轉移物件的目前版本
-
在儲存類別之間轉移物件的先前版本
-
讓物件的目前版本過期
-
永久刪除物件的先前版本
-
刪除過期的刪除標記或未完成的分段上傳
視您選擇的動作而定,將會出現不同的選項。
-
若要在儲存類別之間轉移物件的目前版本,請在 Transition current versions of objects between storage classes (在儲存類別之間轉移物件的目前版本) 下:
-
在 Storage class transitions (儲存類別轉移) 中,選擇轉移至您要的儲存類別:
-
在 Days after object creation (物件建立後的天數) 中,輸入建立後幾天要轉移物件。
如需儲存體方案的詳細資訊,請參閱「使用 Amazon S3 儲存體方案」。您可以為目前的物件版本或舊的物件版本定義轉換,也可以同時為兩者定義轉換。您可利用版本控制在單一儲存貯體中保留物件的多個版本。如需版本控制的詳細資訊,請參閱「使用 S3 主控台」。
選擇 S3 Glacier Flexible Retrieval 或 Glacier Deep Archive 儲存類別時,您的物件會保留在 Amazon S3 中。您無法透過個別的 Amazon S3 Glacier 服務直接存取物件。如需詳細資訊,請參閱 使用 Amazon S3 生命週期轉換物件。
-
若要在儲存類別之間轉換物件的非目前版本,請在儲存類別之間的轉換物件的非目前版本下:
-
在 Storage class transitions (儲存類別轉移) 中,選擇轉移至您要的儲存類別:
-
在物件變為非目前物件後的天數中,輸入建立後轉移物件的天數。
-
若要讓物件的目前版本過期,請在 Expire current versions of objects (讓物件的目前版本過期) 下的 Number of days after object creation (物件建立後的天數) 中,輸入天數。
在未版本控制的儲存貯體中,到期動作會導致 Amazon S3 永久移除該物件。如需生命週期動作的詳細資訊,請參閱「描述生命週期動作的元素」。
-
若要永久刪除物件的先前版本,請在 Permanently delete noncurrent versions of objects (永久刪除物件的非現行版本) 下的 Days after objects become noncurrent (物件變成非現行版本後的天數) 中,輸入天數。您可以選擇指定要保留的較新版本數目,方法是在要保留的較新版本數目下方輸入值。
-
在 Delete expired delete markers or incomplete multipart uploads (刪除過期刪除標記或未完成的分段上傳) 下,選擇 Delete expired object delete markers (刪除過期物件刪除標記) 和 Delete incomplete multipart uploads (刪除未完成的分段上傳)。然後,輸入分段上傳啟動後幾天要結束並清理未完成的分段上傳。
如需分段上傳的詳細資訊,請參閱「使用分段上傳來上傳和複製物件」。
-
選擇建立規則。
如果規則未包含任何錯誤,Amazon S3 會啟用該規則,您可以在 Lifecycle rules (生命週期規則) 下的 Management (管理) 標籤上看到該規則。
若要取得有關 CloudFormation 範本和範例的資訊,請參閱〈使用範 AWS CloudFormation
本〉和AWS::S3::Bucket〈AWS CloudFormation 使用指南〉。
您可以使用下列命 AWS CLI 令來管理 S3 生命週期組態:
如需有關設定的指示 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
。
測試組態
-
將 JSON 生命週期組態儲存在檔案中 (例如,lifecycle.json
)。
-
執行下列 AWS CLI 命令,在值區上設定生命週期組態。以您自己的資訊取代 user input
placeholders
。
$
aws s3api put-bucket-lifecycle-configuration \
--bucket DOC-EXAMPLE-BUCKET
\
--lifecycle-configuration file://lifecycle.json
-
若要驗證,請使用命令擷取 S3 生get-bucket-lifecycle-configuration
AWS CLI 命週期組態,如下所示:
$
aws s3api get-bucket-lifecycle-configuration \
--bucket DOC-EXAMPLE-BUCKET
-
若要刪除 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 .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。