バケットにライフサイクル設定を設定する - Amazon Simple Storage Service

バケットにライフサイクル設定を設定する

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

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

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

伝達遅延

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

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

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

注記

ライフサイクルルールを更新、無効化、または削除する前に、LIST API オペレーション (ListObjectsV2ListObjectVersionsListMultipartUploads など) または Amazon S3 インベントリ を使用して、ユースケースに基づき、Amazon S3 が移行済みで対象となるオブジェクトの有効期限が切れていることを確認します。ライフサイクルルールの更新、無効化、削除に問題がある場合は、「Amazon S3 ライフサイクル問題のトラブルシューティング」を参照してください。

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

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

請求の変更

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

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

共有プレフィックス (共通の文字列から始まるオブジェクト名) またはタグを使用して、バケット内のすべてのオブジェクトまたはオブジェクトのサブセットに対してライフサイクルルールを定義できます。ライフサイクルルールでは、現在のバージョンまたは以前のバージョンのオブジェクトに対して独自のアクションを定義できます。詳細については、次を参照してください:

ライフサイクルルールを作成するには
  1. AWS Management Console にサインインし、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. オブジェクトサイズでルールをフィルタリングするには、[Specify minimum object size]、[Specify maximum object size]、または両方のオプションをチェックします。

    • [最小オブジェクトサイズ] または [最大オブジェクトサイズ] を指定する際は、0 バイトより大きく、5 TB 未満の範囲の値を指定する必要があります。この値はバイト、KB、MB、または GB で指定できます。

    • [minimum object size] あるいは [maximum object size] を指定しているとき、値は 0 バイトより大きく、最大 5 TB にする必要があります。

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

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

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

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

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

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

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

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

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

      • S3 Standard – IA

      • S3 Intelligent-Tiering

      • S3 1 ゾーン - IA

      • S3 Glacier Flexible Retrieval

      • S3 Glacier Deep Archive

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

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

    重要

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

  9. ストレージクラス間で最新以外のオブジェクトを移行するには、[Transition noncurrent versions of objects between storage classes] で次のとおり指定します。

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

      • S3 Standard – IA

      • S3 Intelligent-Tiering

      • S3 1 ゾーン - IA

      • S3 Glacier Flexible Retrieval

      • S3 Glacier Deep Archive

    2. [Days after object becomes noncurrent] に、オブジェクトの作成日から移行日までの日数を入力します。

  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] (オブジェクトが最新バージョンでなくなってからの日数) に日数を入力します。オプションで、[Number of newer versions to retain] (保持する新しいバージョンの数) に値を入力して、保持する新しいバージョンの数を指定できます。

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

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

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

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

CloudFormation テンプレートと例の詳細については、「AWS CloudFormation ユーザーガイド」の「AWS CloudFormation テンプレートの使用」と「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
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. 検証するには、次のとおり get-bucket-lifecycle-configuration AWS CLI コマンドを使用して S3 ライフサイクル設定を取得します。

    $ 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 でバケットの現在のライフサイクル設定 (ある場合) が置き換えられます。設定を更新するには、設定を取得して必要な変更を加え、変更済みの設定をバケットに追加します。

以下の例では、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 について説明します。