バケットのライフサイクル設定の指定 - Amazon Simple Storage Service

新しい Amazon S3 ユーザーガイドにようこそ! Amazon S3 ユーザーガイドは、使用中止された 3 つのガイド (Amazon S3 開発者ガイドAmazon S3 コンソールユーザーガイドAmazon S3 入門ガイド) の情報と手順をまとめたものです。

バケットのライフサイクル設定の指定

このセクションでは、AWS SDK、AWS CLI、または S3 コンソールを使用して、バケットで S3 ライフサイクル設定を設定する方法について説明します。S3 ライフサイクル設定については、「ストレージのライフサイクルの管理」を参照してください。

ライフサイクルルールを使用すると、オブジェクトのライフタイムで Amazon S3 が実行するアクションを定義することができます (他のストレージクラスへのオブジェクトの移行や指定した期間後のオブジェクトのアーカイブや削除など)。

ライフサイクル設定を設定する前に、次の点に注意してください。

伝達遅延

バケットに対してライフサイクル設定を追加する場合、新しい、あるいは更新された S3 ライフサイクル設定がすべての Amazon S3 システムに完全に伝達されるまでには、通常、多少のタイムラグがあります。ライフサイクル設定が完全に有効になるまで、数分間程度の遅延を想定してください。この遅延は、S3 ライフサイクル設定を削除するときにも発生することがあります。

ライフサイクルルールの無効化または削除

ライフサイクルルールを無効にする、あるいは削除すると、わずかなタイムラグの後に、Amazon S3 は新しいオブジェクトの削除や移行のスケジューリングを停止します。スケジュール済みのオブジェクトはスケジュール解除され、削除または移行されません。

既存のオブジェクトと新しいオブジェクト

ライフサイクル設定をバケットに追加すると、設定ルールは既存のオブジェクトとそれ以降に追加されるオブジェクトの両方に適用されます。例えば、特定のプレフィックスが付いたオブジェクトが作成から 30 日後に有効期限を迎えるようにする失効アクションを備えたライフサイクル設定ルールを本日追加すると、Amazon S3 により作成から 30 日以上が経過している既存のオブジェクトがすべて削除キューに追加されます。

請求の変更

ライフサイクル設定のルールが満たされてから、実際にアクションが実行されるまでの間には、遅延が発生する場合があります。ただし、アクションが実行されていなくても、ライフサイクル設定のルールが満たされた段階で、請求にはすぐに変更が反映されます。

たとえば、オブジェクトの有効期限が切れると、オブジェクトがすぐに削除されなくても、そのストレージは課金対象から外されます。同様に、オブジェクトの移行期間が過ぎると、オブジェクトがすぐに S3 Glacier ストレージクラスに移行されていなくても、Amazon S3 Glacier のストレージ料金が課金されます。S3 Intelligent-Tiering ストレージクラスへのライフサイクルの移行については例外です。オブジェクトが S3 Intelligent-Tiering ストレージクラスに移行するまで、請求の変更は行われません。

共通のプレフィックス (共通の文字列で始まるオブジェクト名) またはタグを使用することで、バケット内のすべてのオブジェクトまたはオブジェクトのサブセットにライフサイクルルールを定義できます。

ライフサイクルルールを使用して、現在のバージョンまたは以前のバージョンのオブジェクトに対して特定のアクションを定義できます。詳細については、以下を参照してください。

ライフサイクルルールを作成するには

  1. AWS マネジメントコンソールにサインインして、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. [Buckets (バケット)] リストで、ライフサイクルルールを作成するバケットの名前を選択します。

  3. [Management (管理)] タブを選択して、[Create lifecycle rule (ライフサイクルルールを作成する)] を選択します。

  4. [Lifecycle rule name (ライフサイクルルール名)] に、ルールの名前を入力します。

    その名前はバケット内で一意である必要があります。

  5. ライフサイクルルールのスコープを選択します。

    • 特定のプレフィックスまたはタグを持つすべてのオブジェクトにこのライフサイクルルールを適用するには、[スコープを特定のプレフィックスまたはタグに制限] を選択します。

      • スコープをプレフィックスで制限するには、[Prefix (プレフィックス)] にプレフィックスを入力します。

      • スコープをタグで制限するには、[Add tag (タグの追加)] を選択してタグのキーと値を入力します。

      オブジェクト名のプレフィックスの詳細については、「オブジェクトキー名の作成」を参照してください。オブジェクトタグの詳細については、「タグを使用してストレージを分類する」を参照してください。

    • このライフサイクルルールをバケット内のすべてのオブジェクトに適用するには、[This rule applies to all objects in the bucket (このルールは、バケット内のすべてのオブジェクトに適用されます)] を選択して、[I acknowledge that this lifecycle rule will apply to all objects in the bucket (このライフサイクルルールがバケット内のすべてのオブジェクトに適用されることを了承します)] を選択します。

  6. [Lifecycle rule actions (ライフサイクルルールのアクション)] で、ライフサイクルルールで実行するアクションを以下から選択します。

    • オブジェクトの現在のバージョンをストレージクラス間で移行する

    • オブジェクトの以前のバージョンをストレージクラス間で移動する

    • オブジェクトの現在のバージョンを期限切れにする

    • オブジェクトの以前のバージョンを完全に削除する

    • 期限切れの削除マーカーまたは未完了のマルチパートアップロードを削除する

    選択したアクションに応じて、異なるオプションが表示されます。

  7. オブジェクトの現在のバージョンをストレージクラス間で移行するには、[Transition current versions of objects between storage classes (オブジェクトの現行バージョンをストレージクラス間で移行する)] で以下の操作を行います。

    1. [Storage class transition (ストレージクラスへの移行)] で、移行するストレージクラスを選択します。

      • 標準 – IA

      • [Intelligent-Tiering]

      • 1 ゾーン – IA

      • Glacier

      • Glacier Deep Archive

    2. [Days after object creation (オブジェクトが作成されてからの日数)] に、オブジェクトの作成から移行までの日数を入力します。

    ストレージクラスの詳細については、「Amazon S3 ストレージクラスを使用する」を参照してください。オブジェクトの現在のバージョンだけ、以前のバージョンだけ、または現在と以前の両方のバージョンについて、移行を定義できます。バージョニングを使用すると、1 つのバケットで複数バージョンのオブジェクトを維持できます。バージョニングの詳細については、「S3 コンソールの使用」を参照してください。

    重要

    ストレージクラスに Glacier または Glacier Deep Archive を選択した場合は、オブジェクトは Amazon S3 に保持されます。Amazon S3 Glacier サービスを別途使用して直接アクセスすることはできません。詳細については、「Amazon S3 ライフサイクルを使用したオブジェクトの移行」を参照してください。

  8. オブジェクトの以前のバージョンをストレージクラス間で移行するには、[Transition non-current versions of objects between storage classes (オブジェクトの以前のバージョンをストレージクラス間で移行する)] で以下の操作を行います。

    1. [Storage class transition (ストレージクラスへの移行)] で、移行するストレージクラスを選択します。

      • 標準 – IA

      • [Intelligent-Tiering]

      • 1 ゾーン – IA

      • Glacier

      • Glacier Deep Archive

    2. [Days after object becomes non-current (オブジェクトが最新バージョンでなくなってからの日数)] に、オブジェクトの作成から移行までの日数を入力します。

  9. オブジェクトの現在のバージョンを期限切れにするには、[Expire previous versions of objects (オブジェクトの以前のバージョンを期限切れにする)] の [Number of days after object creation (オブジェクトが作成されてからの日数)] に日数を入力します。

    重要

    バージョニングされていないバケットで期限切れにするアクションを実行すると、Amazon S3 によってオブジェクトが完全に削除されます。ライフサイクルアクションの詳細については、「ライフサイクルアクションを記述する要素」を参照してください。

  10. オブジェクトの以前のバージョンを完全に削除するには、[Permanently delete previous versions of objects (オブジェクトの前のバージョンを完全に削除する)] で [Number of days after objects become previous versions (オブジェクトが最新バージョンでなくなってからの日数)] に日数を入力します。

  11. [Delete expired delete markers or incomplete multipart uploads (期限切れの削除マーカーまたは未完了のマルチパートアップロードを削除する)] で、[Delete expired object delete markers (期限切れのオブジェクト削除マーカーを削除する)] と [Delete incomplete multipart uploads (不完全なマルチパートアップロードを削除)] を選択します。次に、マルチパートアップロードの開始から未完了のマルチパートアップロードを終了してクリーンアップするまでの日数を入力します。

    マルチパートアップロードの詳細については、「マルチパートアップロードを使用したオブジェクトのアップロードとコピー」を参照してください。

  12. [Create rule] を選択します。

    ルールにエラーがない場合は、Amazon S3 によって有効にされ、[Management (管理)] タブの [Lifecycle rules (ライフサイクルルール)] に表示されます。

CloudFormation のテンプレートと例の詳細については、AWS CloudFormation ユーザーガイドの「Working with AWS CloudFormation templates」と「 AWS::S3::Bucket」を参照してください。

次の 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

JSON
{ "Rules": [ { "Filter": { "Prefix": "documents/" }, "Status": "Enabled", "Transitions": [ { "Days": 365, "StorageClass": "GLACIER" } ], "Expiration": { "Days": 3650 }, "ID": "ExampleRule" } ] }
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>

例 2

JSON
{ "Rules": [ { "ID": "id-1", "Filter": { "And": { "Prefix": "myprefix", "Tags": [ { "Value": "mytagvalue1", "Key": "mytagkey1" }, { "Value": "mytagvalue2", "Key": "mytagkey2" } ] } }, "Status": "Enabled", "Expiration": { "Days": 1 } } ] }
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>

以下のように put-bucket-lifecycle-configuration をテストできます。

設定をテストする

  1. JSON ライフサイクル設定をファイル (lifecycle.json) に保存します。

  2. 次の AWS CLI コマンドを実行して、バケットにライフサイクル設定を指定します。

    $ aws s3api put-bucket-lifecycle-configuration  \ --bucket bucketname  \ --lifecycle-configuration file://lifecycle.json
  3. 確認するには、次のように get-bucket-lifecycle-configuration AWS CLI コマンドを使用して S3 ライフサイクル設定を取得します。

    $ aws s3api get-bucket-lifecycle-configuration  \ --bucket bucketname
  4. S3 ライフサイクル設定を削除するには、次のように delete-bucket-lifecycle AWS CLI コマンドを使用します。

    aws s3api delete-bucket-lifecycle \ --bucket bucketname
Java

AWS SDK for Java を使用して、バケットの S3 ライフサイクル設定を管理できます。S3 ライフサイクル設定の管理の詳細については、「ストレージのライフサイクルの管理」を参照してください。

注記

バケットに S3 ライフサイクル設定を追加すると、Amazon 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 では、クラス AWS::S3::BucketLifecycleConfiguration を使用して、バケットの S3 ライフサイクル設定を管理できます。Amazon S3 での AWS SDK for Ruby の使用法の詳細については、「AWS SDK for Ruby - バージョン 3 の使用」を参照してください。ライフサイクル設定の管理の詳細については、「ストレージのライフサイクルの管理」を参照してください。

Amazon Simple Storage Service API リファレンスの以下のセクションでは、S3 ライフサイクル設定に関連する REST API について説明します。