

# ディレクトリバケットの S3 ライフサイクルの使用
S3 ライフサイクルの使用

 S3 ライフサイクルは、ユーザーに代わって期限切れのオブジェクトを削除することで、S3 Express One Zone のオブジェクトをディレクトリバケットにコスト効率良く保存するのに役立ちます。オブジェクトのライフサイクルを管理するには、ディレクトリバケットの S3 ライフサイクル設定を作成します。S3 ライフサイクル設定は、Amazon S3 がオブジェクトのグループに適用するアクションを定義するルールのセットです。ディレクトリバケットに Amazon S3 ライフサイクル設定をセットアップするには、AWS コマンドラインインターフェイス (AWS CLI)、AWS SDK、Amazon S3 REST API、AWS CloudFormation を使用できます。

S3 ライフサイクル設定では、ルールを使用して、Amazon S3 がオブジェクトに実行するアクションを定義します。ディレクトリバケットに保存されているオブジェクトの場合、古くなったオブジェクトを期限切れにするライフサイクルルールを作成できます。また、ディレクトリバケット内の不完全なマルチパートアップロードを毎日削除するライフサイクルルールを作成することもできます。

ライフサイクル設定をバケットに追加すると、設定ルールは既存のオブジェクトとそれ以降に追加されるオブジェクトの両方に適用されます。例えば、ライフサイクル設定ルールを今日追加し、特定のプレフィックスが付いたオブジェクトを作成から 30 日後に期限切れにするように設定すると、S3 は、30 日を超えた既存のオブジェクトのうち、指定したプレフィックスが付いたものを削除キューに追加します。

## ディレクトリバケットの S3 ライフサイクルの違い


ディレクトリバケット内のオブジェクトの場合、オブジェクトを期限切れにし、不完全なマルチパートアップロードを削除するライフサイクルルールを作成できます。ただし、ディレクトリバケットの S3 ライフサイクルは、ストレージクラス間の移行アクションをサポートしていません。

**CreateSession**

ライフサイクルは、パブリックの `DeleteObject` および `DeleteObjects` API オペレーションを使用して、ディレクトリバケット内のオブジェクトを期限切れにします。これらの API オペレーションを使用するために、S3 ライフサイクルは `CreateSession` API を使用してディレクトリバケット内のオブジェクトにアクセスするための一時的なセキュリティ認証情報を設定します。詳細については、「[*Amazon S3 API リファレンス*の `CreateSession`](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html)」を参照してください。

ライフサイクルプリンシパルに対して削除アクセス許可を拒否するアクティブなポリシーがある場合、S3 ライフサイクルがユーザーに代わってオブジェクトを削除することを許可できなくなります。

### バケットポリシーを使用して S3 ライフサイクルサービスプリンシパルにアクセス許可を付与する


次のバケットポリシーは、S3 ライフサイクルサービスプリンシパルに、`DeleteObject` や `DeleteObjects` などのオペレーションを実行するためのセッションを作成するアクセス許可を付与します。`CreateSession` リクエストでセッションモードが指定されていない場合、セッションはアクセス許可によって最大許容特権で作成されます (最初に `ReadWrite` を試行し、`ReadWrite` が許可されていない場合は `ReadOnly` を試行します)。ただし、`ReadOnly` オブジェクトを変更または削除するライフサイクルオペレーションにはセッションだけでは不十分です。したがって、この例では、`s3express:SessionMode` 条件キーを使用して `ReadWrite` セッションモードを明示的に要求します。

**Example – ライフサイクルオペレーションの明示的な `ReadWrite` セッションモードで `CreateSession` 呼び出しを許可するバケットポリシー**  

```
 { 
   "Version":"2008-10-17",		 	 	  
   "Statement":[
      {
         "Effect":"Allow",
         "Principal": {
            "Service":"lifecycle.s3.amazonaws.com"
          },
          "Action":"s3express:CreateSession", 
          "Condition": { 
             "StringEquals": {
                "s3express:SessionMode": "ReadWrite"
              }
           }, 
           "Resource":"arn:aws:s3express:us-east-2:412345678921:bucket/amzn-s3-demo-bucket--use2-az2--x-s3"
       }
   ] 
}
```

### ライフサイクルルールのモニタリング


ディレクトリバケットに保存されているオブジェクトの場合、S3 ライフサイクルは AWS CloudTrail 管理とデータイベントのログを生成します。詳細については、「[S3 Express One Zone の CloudTrail ログファイルの例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-log-files.html)」を参照してください。

ライフサイクル設定の作成および S3 ライフサイクル関連の問題のトラブルシューティングの詳細については、以下のトピックを参照してください。

**Topics**

# ディレクトリバケットのライフサイクル設定の作成と管理
ライフサイクル設定の作成と管理

ディレクトリバケットのライフサイクル設定は、AWS Command Line Interface (AWS CLI)、AWS SDK、REST API を使用して作成できます。

## AWS CLI の使用
の使用AWS CLI

次の AWS CLI コマンドを使用して、S3 ライフサイクル設定を管理できます。
+ `put-bucket-lifecycle-configuration`
+ `get-bucket-lifecycle-configuration`
+ `delete-bucket-lifecycle`

AWS CLI の設定の手順については、「Amazon S3 API リファレンス」の「[AWS CLI を使用した Amazon S3 での開発](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)」を参照してください。**

Amazon S3 ライフサイクル設定は XML ファイルである点に注意してください。ただし、AWS CLI を使用する場合、XML 形式を指定することはできません。代わりに JSON 形式を指定する必要があります。XML ライフサイクル設定の例と、AWS CLI コマンドで指定できる同等の JSON の設定は、次のとおりです。

次の AWS CLI の例では、ディレクトリバケットにライフサイクル設定ポリシーを配置します。このポリシーでは、フラグ付きのプレフィックス (myprefix) を持ち、定義されたオブジェクトサイズであるすべてのオブジェクトが 7 日後に期限切れになることを指定します。この例を使用するには、各*ユーザー入力プレースホルダー*を独自の情報に置き換えます。

ライフサイクル設定ポリシーを JSON ファイルに保存します。この例では、ファイルの名前を lifecycle1.json とします。

**Example**  

```
{
    "Rules": [
        {
        "Expiration": {
            "Days": 7
        },
        "ID": "Lifecycle expiration rule",
        "Filter": {
            "And": {
                "Prefix": "myprefix/",
                "ObjectSizeGreaterThan": 500,
                "ObjectSizeLessThan": 64000
            }
        },
        "Status": "Enabled"
    }
    ]
}
```
`put-bucket-lifecycle-configuration` CLI コマンドの一部として JSON ファイルを送信します。このコマンドを使用するには、各*ユーザー入力プレースホルダー*を独自の情報に置き換えます。  

```
aws s3api put-bucket-lifecycle-configuration --region us-west-2 --profile default --bucket amzn-s3-demo-bucket--usw2-az1--x-s3 --lifecycle-configuration file://lc-policy.json --checksum-algorithm crc32c 
```

**Example**  

```
<LifecycleConfiguration>
    <Rule>
        <ID>Lifecycle expiration rule</ID>
        <Filter>
            <And>
                <Prefix>myprefix/</Prefix>
                <ObjectSizeGreaterThan>500</ObjectSizeGreaterThan>
                <ObjectSizeLessThan>64000</ObjectSizeLessThan>
            </And>
        </Filter>
        <Status>Enabled</Status>     
        <Expiration>
             <Days>7</Days>
        </Expiration>
    </Rule>
</LifecycleConfiguration>
```

## AWS SDK の使用


------
#### [ SDK for Java ]

**Example**  

```
import software.amazon.awssdk.services.s3.model.PutBucketLifecycleConfigurationRequest;
import software.amazon.awssdk.services.s3.model.PutBucketLifecycleConfigurationResponse;
import software.amazon.awssdk.services.s3.model.ChecksumAlgorithm;
import software.amazon.awssdk.services.s3.model.BucketLifecycleConfiguration;
import software.amazon.awssdk.services.s3.model.LifecycleRule;
import software.amazon.awssdk.services.s3.model.LifecycleRuleFilter;
import software.amazon.awssdk.services.s3.model.LifecycleExpiration;
import software.amazon.awssdk.services.s3.model.LifecycleRuleAndOperator;
import software.amazon.awssdk.services.s3.model.GetBucketLifecycleConfigurationResponse;
import software.amazon.awssdk.services.s3.model.GetBucketLifecycleConfigurationRequest;
import software.amazon.awssdk.services.s3.model.DeleteBucketLifecycleRequest;
import software.amazon.awssdk.services.s3.model.DeleteBucketLifecycleResponse;
import software.amazon.awssdk.services.s3.model.AbortIncompleteMultipartUpload;

// PUT a Lifecycle policy
LifecycleRuleFilter objectExpirationFilter = LifecycleRuleFilter.builder().and(LifecycleRuleAndOperator.builder().prefix("dir1/").objectSizeGreaterThan(3L).objectSizeLessThan(20L).build()).build();
LifecycleRuleFilter mpuExpirationFilter = LifecycleRuleFilter.builder().prefix("dir2/").build();
       
LifecycleRule objectExpirationRule = LifecycleRule.builder().id("lc").filter(objectExpirationFilter).status("Enabled").expiration(LifecycleExpiration.builder()
                    .days(10)
                    .build())
                .build();
LifecycleRule mpuExpirationRule = LifecycleRule.builder().id("lc-mpu").filter(mpuExpirationFilter).status("Enabled").abortIncompleteMultipartUpload(AbortIncompleteMultipartUpload.builder()
                        .daysAfterInitiation(10)
                        .build())
                .build();
        
PutBucketLifecycleConfigurationRequest putLifecycleRequest = PutBucketLifecycleConfigurationRequest.builder()
                .bucket("amzn-s3-demo-bucket--usw2-az1--x-s3")
                .checksumAlgorithm(ChecksumAlgorithm.CRC32)
                .lifecycleConfiguration(
                        BucketLifecycleConfiguration.builder()
                                .rules(objectExpirationRule, mpuExpirationRule)
                                .build()
                ).build();

PutBucketLifecycleConfigurationResponse resp = client.putBucketLifecycleConfiguration(putLifecycleRequest);

// GET the Lifecycle policy 
GetBucketLifecycleConfigurationResponse getResp = client.getBucketLifecycleConfiguration(GetBucketLifecycleConfigurationRequest.builder().bucket("amzn-s3-demo-bucket--usw2-az1--x-s3").build());

// DELETE the Lifecycle policy
DeleteBucketLifecycleResponse delResp = client.deleteBucketLifecycle(DeleteBucketLifecycleRequest.builder().bucket("amzn-s3-demo-bucket--usw2-az1--x-s3").build());
```

------
#### [ SDK for Go ]

**Example**  

```
package main

import (
    "context"
    "log"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/aws/aws-sdk-go-v2/service/s3/types"
)
// PUT a Lifecycle policy
func putBucketLifecycleConfiguration(client *s3.Client, bucketName string ) error {
    lifecycleConfig := &s3.PutBucketLifecycleConfigurationInput{
        Bucket: aws.String(bucketName),
        LifecycleConfiguration: &types.BucketLifecycleConfiguration{
            Rules: []types.LifecycleRule{
                {
                    ID:     aws.String("lc"),
                    Filter: &types.LifecycleRuleFilter{
                        And: &types.LifecycleRuleAndOperator{
                            Prefix: aws.String("foo/"), 
                            ObjectSizeGreaterThan: aws.Int64(1000000), 
                            ObjectSizeLessThan:    aws.Int64(100000000), 
                            },
                        },
                    
                    Status: types.ExpirationStatusEnabled,
                    Expiration: &types.LifecycleExpiration{
                        Days: aws.Int32(int32(1)), 
                    },
                },
                {
                    ID:     aws.String("abortmpu"),
                    Filter: &types.LifecycleRuleFilter{
                        Prefix: aws.String("bar/"), 
                    },
                    Status: types.ExpirationStatusEnabled,
                    AbortIncompleteMultipartUpload: &types.AbortIncompleteMultipartUpload{
                        DaysAfterInitiation: aws.Int32(int32(5)), 
                    },
                },
            },
        },
    }
    _, err := client.PutBucketLifecycleConfiguration(context.Background(), lifecycleConfig)
    return err
}
// Get the Lifecycle policy
func getBucketLifecycleConfiguration(client *s3.Client, bucketName string) error {
    getLifecycleConfig := &s3.GetBucketLifecycleConfigurationInput{
        Bucket: aws.String(bucketName),
    }

    resp, err := client.GetBucketLifecycleConfiguration(context.Background(), getLifecycleConfig)
    if err != nil {
        return err
    }
    return nil
}
// Delete the Lifecycle policy
func deleteBucketLifecycleConfiguration(client *s3.Client, bucketName string) error {
    deleteLifecycleConfig := &s3.DeleteBucketLifecycleInput{
        Bucket: aws.String(bucketName),
    }
    _, err := client.DeleteBucketLifecycle(context.Background(), deleteLifecycleConfig)
    return err
}
func main() {
    cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion("us-west-2")) // Specify your region here
    if err != nil {
        log.Fatalf("unable to load SDK config, %v", err)
    }
    s3Client := s3.NewFromConfig(cfg)
    bucketName := "amzn-s3-demo-bucket--usw2-az1--x-s3" 
    putBucketLifecycleConfiguration(s3Client, bucketName)
    getBucketLifecycleConfiguration(s3Client, bucketName)
    deleteBucketLifecycleConfiguration(s3Client, bucketName)
    getBucketLifecycleConfiguration(s3Client, bucketName)
}
```

------
#### [ SDK for .NET ]

**Example**  

```
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 = "amzn-s3-demo-bucket--usw2-az1--x-s3";
        // 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 = "delete rule",
                                  Filter = new LifecycleFilter()
                                 {
                                     LifecycleFilterPredicate = new LifecyclePrefixPredicate()
                                     {
                                         Prefix = "projectdocs/"
                                     }
                                 },
                                 Status = LifecycleRuleStatus.Enabled,
                                 Expiration = new LifecycleRuleExpiration()
                                 {
                                       Days = 10
                                 }
                            }
                        }
                };

                // 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 = "mpu abort rule",
                    Filter = new LifecycleFilter()
                    {
                        LifecycleFilterPredicate = new LifecyclePrefixPredicate()
                        {
                            Prefix = "YearlyDocuments/"
                        }
                    },
                    Expiration = new LifecycleRuleExpiration()
                    {
                        Days = 10
                    },
                    AbortIncompleteMultipartUpload = new LifecycleRuleAbortIncompleteMultipartUpload()
                    {
                        DaysAfterInitiation = 10
                    }
                });

                // Add the configuration to the bucket. 
                await AddExampleLifecycleConfigAsync(client, lifeCycleConfiguration);

                // Verify that there are now two rules.
                lifeCycleConfiguration = await RetrieveLifecycleConfigAsync(client);
                Console.WriteLine("Expected # of rulest=2; 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);
        }
    }
}
```

------
#### [ SDK for Python ]

**Example**  

```
import boto3

client = boto3.client("s3", region_name="us-west-2")
bucket_name = 'amzn-s3-demo-bucket--usw2-az1--x-s3'

client.put_bucket_lifecycle_configuration(
    Bucket=bucket_name,
    ChecksumAlgorithm='CRC32',
    LifecycleConfiguration={
        'Rules': [
            {
                'ID': 'lc',
                'Filter': {
                    'And': {
                        'Prefix': 'foo/',
                        'ObjectSizeGreaterThan': 1000000,
                        'ObjectSizeLessThan': 100000000,
                    }
                },
                'Status': 'Enabled',
                'Expiration': {
                    'Days': 1
                }
            },
            {
                'ID': 'abortmpu',
                'Filter': {
                    'Prefix': 'bar/'
                },
                'Status': 'Enabled',
                'AbortIncompleteMultipartUpload': {
                    'DaysAfterInitiation': 5
                }
            }
        ]
    }
)

result = client.get_bucket_lifecycle_configuration(
    Bucket=bucket_name
)

client.delete_bucket_lifecycle(
    Bucket=bucket_name
)
```

------

# ディレクトリバケットの S3 ライフサイクルに関する問題のトラブルシューティング
ディレクトリバケットの S3 ライフサイクルのトラブルシューティング

**Topics**
+ [

## ライフサイクル設定をセットアップしたが、ディレクトリバケット内のオブジェクトの有効期限が切れていない
](#troubleshoot-directory-bucket-lifecycle-1)
+ [

## ライフサイクルルールによって実行されたアクションをモニタリングするにはどうすればよいですか？
](#troubleshoot-directory-bucket-lifecycle-2)

## ライフサイクル設定をセットアップしたが、ディレクトリバケット内のオブジェクトの有効期限が切れていない


ディレクトリバケットの S3 ライフサイクルは、パブリック API を使用して S3 Express One Zone のオブジェクトを削除します。オブジェクトレベルのパブリック API を使用するには、`CreateSession` へのアクセスを許可し、オブジェクトを削除するためのアクセス許可を S3 ライフサイクルに付与する必要があります。削除を拒否するアクティブなポリシーがある場合、S3 ライフサイクルがユーザーに代わってオブジェクトを削除することを許可できなくなります。

削除するオブジェクトが確実に期限切れになるように、バケットポリシーを正しく設定することが重要です。AWS CloudTrail で `CreateSession` API 呼び出しに対する `AccessDenied` 証跡を CloudTrail ログでチェックし、アクセスが拒否されたかどうかを確認できます。CloudTrail ログを確認することは、アクセス問題のトラブルシューティングや、アクセス拒否エラーの根本原因の特定に役立ちます。次に、関連するポリシーを更新することで、誤ったアクセスコントロールを修正できます。

バケットポリシーの設定が正しいことを確認しても、問題が発生する場合は、ライフサイクルルールを見直して、適切なオブジェクトのサブセットに適用されていることを確認してください。

## ライフサイクルルールによって実行されたアクションをモニタリングするにはどうすればよいですか？


 AWS CloudTrail データイベントログを使用して、ディレクトリバケットで S3 ライフサイクルが実行したアクションをモニタリングできます。詳細については、「[CloudTrail ログファイルの例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-log-files.html)」を参照してください。