

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Bekerja dengan Siklus Hidup S3 untuk bucket direktori
<a name="directory-buckets-objects-lifecycle"></a>

 Siklus Hidup S3 membantu Anda menyimpan objek di S3 Express One Zone dalam bucket direktori dengan biaya efektif dengan menghapus objek kedaluwarsa atas nama Anda. Untuk mengelola siklus hidup objek Anda, buat konfigurasi Siklus Hidup S3 untuk bucket direktori Anda. Konfigurasi Siklus Hidup S3 adalah serangkaian aturan yang menetapkan tindakan yang diterapkan Amazon S3 pada sekelompok objek. Anda dapat mengatur konfigurasi Siklus Hidup Amazon S3 pada bucket direktori dengan menggunakan AWS Command Line Interface (AWS CLI), API REST AWS SDKs Amazon S3, dan. AWS CloudFormation 

Dalam konfigurasi siklus hidup, Anda menggunakan aturan untuk menentukan tindakan yang ingin dilakukan Amazon S3 pada objek Anda. Untuk objek yang disimpan dalam bucket direktori, Anda dapat membuat aturan siklus hidup untuk objek kedaluwarsa seiring bertambahnya usia. Anda juga dapat membuat aturan siklus hidup untuk menghapus unggahan multibagian yang tidak lengkap dalam bucket direktori pada frekuensi harian. 

Ketika Anda menambahkan konfigurasi Siklus Hidup ke dalam bucket, aturan konfigurasi berlaku untuk objek yang ada dan objek yang Anda tambahkan kemudian. Misalnya, jika Anda menambahkan aturan konfigurasi Siklus Hidup hari ini dengan tindakan kedaluwarsa yang menyebabkan objek dengan awalan tertentu kedaluwarsa 30 hari setelah pembuatan, S3 akan mengantri untuk menghapus objek yang ada yang berusia lebih dari 30 hari dan yang memiliki awalan yang ditentukan.

## Bagaimana Siklus Hidup S3 untuk bucket direktori berbeda
<a name="directory-bucket-lifecycle-differences"></a>

Untuk objek dalam bucket direktori, Anda dapat membuat aturan siklus hidup untuk menghapus objek kedaluwarsa dan menghapus unggahan multibagian yang tidak lengkap. Namun, Siklus Hidup S3 untuk bucket direktori tidak mendukung tindakan transisi antar kelas penyimpanan. 

**CreateSession**

Lifecycle menggunakan operasi publik `DeleteObject` dan `DeleteObjects` API untuk menghapus objek dalam bucket direktori. Untuk menggunakan operasi API ini, S3 Lifecycle akan menggunakan `CreateSession` API untuk membuat kredensil keamanan sementara untuk mengakses objek dalam bucket direktori. Untuk informasi selengkapnya, lihat [`CreateSession`di Referensi *API Amazon S3*](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html). 

Jika Anda memiliki kebijakan aktif yang menolak izin hapus ke prinsipal siklus hidup, ini akan mencegah Anda mengizinkan Siklus Hidup S3 untuk menghapus objek atas nama Anda. 

### Menggunakan kebijakan bucket untuk memberikan izin kepada prinsipal layanan Siklus Hidup S3
<a name="lifecycle-directory-bucket-policy"></a>

Kebijakan bucket berikut memberikan izin utama layanan Siklus Hidup S3 untuk membuat sesi untuk melakukan operasi seperti dan. `DeleteObject` `DeleteObjects` Ketika tidak ada mode sesi yang ditentukan dalam `CreateSession` permintaan, sesi dibuat dengan hak istimewa maksimum yang diizinkan oleh izin di (mencoba `ReadWrite` terlebih dahulu, kemudian `ReadOnly` jika `ReadWrite` tidak diizinkan). Namun, `ReadOnly` sesi tidak cukup untuk operasi siklus hidup yang memodifikasi atau menghapus objek. Oleh karena itu, contoh ini secara eksplisit memerlukan mode `ReadWrite` sesi dengan menggunakan kunci `s3express:SessionMode` kondisi.

**Example — Kebijakan bucket untuk mengizinkan `CreateSession` panggilan dengan mode `ReadWrite` sesi eksplisit untuk operasi siklus hidup**  

```
 { 
   "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"
       }
   ] 
}
```

### Memantau aturan siklus hidup
<a name="lifecycle-directory-bucket-monitoring"></a>

Untuk objek yang disimpan dalam bucket direktori, S3 Lifecycle menghasilkan log peristiwa AWS CloudTrail manajemen dan data. Untuk informasi selengkapnya, lihat [contoh file CloudTrail log untuk S3 Express One Zone](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-log-files.html). 

Untuk informasi selengkapnya tentang membuat konfigurasi siklus hidup dan memecahkan masalah terkait Siklus Hidup S3, lihat topik berikut: 

**Topics**

# Membuat dan mengelola konfigurasi Siklus Hidup untuk bucket direktori Anda
<a name="directory-bucket-create-lc"></a>

Anda dapat membuat konfigurasi siklus hidup untuk bucket direktori dengan menggunakan AWS Command Line Interface (AWS CLI), AWS SDKs dan REST. APIs

## Menggunakan AWS CLI
<a name="set-lifecycle-config-cli"></a>

Anda dapat menggunakan AWS CLI perintah berikut untuk mengelola konfigurasi Siklus Hidup S3:
+ `put-bucket-lifecycle-configuration`
+ `get-bucket-lifecycle-configuration`
+ `delete-bucket-lifecycle`

*Untuk petunjuk cara menyiapkan AWS CLI, lihat [Mengembangkan dengan Amazon S3 menggunakan AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html) di Referensi API Amazon S3.*

Konfigurasi Amazon Siklus Hidup S3 adalah berkas XML. Tetapi ketika Anda menggunakan AWS CLI, Anda tidak dapat menentukan format XMLnya. Anda harus menentukan format JSON sebagai gantinya. Berikut ini adalah contoh konfigurasi siklus hidup XMLdan konfigurasi JSON setara yang dapat Anda tentukan dalam sebuah perintah. AWS CLI

Contoh AWS CLI berikut menempatkan kebijakan konfigurasi siklus hidup pada bucket direktori. Kebijakan ini menetapkan bahwa semua objek yang memiliki awalan bertanda (myprefix) dan ukuran objek yang ditentukan akan kedaluwarsa setelah 7 hari. Untuk menggunakan contoh ini, ganti masing-masing *user input placeholder* dengan informasi Anda sendiri.

Simpan kebijakan konfigurasi siklus ke file JSON. Dalam contoh ini, file tersebut bernama lifecycle1.json.

**Example**  

```
{
    "Rules": [
        {
        "Expiration": {
            "Days": 7
        },
        "ID": "Lifecycle expiration rule",
        "Filter": {
            "And": {
                "Prefix": "myprefix/",
                "ObjectSizeGreaterThan": 500,
                "ObjectSizeLessThan": 64000
            }
        },
        "Status": "Enabled"
    }
    ]
}
```
Kirim file JSON sebagai bagian dari perintah CLI `put-bucket-lifecycle-configuration`. Untuk menggunakan perintah ini, ganti masing-masing *user input placeholder* dengan informasi Anda sendiri.  

```
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>
```

## Menggunakan AWS SDKs
<a name="directory-bucket-upload-sdks"></a>

------
#### [ 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
)
```

------

# Memecahkan masalah Siklus Hidup S3 untuk bucket direktori
<a name="directory-buckets-lifecycle-troubleshooting"></a>

**Topics**
+ [Saya mengatur konfigurasi siklus hidup saya tetapi objek di ember direktori saya tidak kedaluwarsa](#troubleshoot-directory-bucket-lifecycle-1)
+ [Bagaimana cara memantau tindakan yang diambil oleh aturan siklus hidup saya?](#troubleshoot-directory-bucket-lifecycle-2)

## Saya mengatur konfigurasi siklus hidup saya tetapi objek di ember direktori saya tidak kedaluwarsa
<a name="troubleshoot-directory-bucket-lifecycle-1"></a>

Siklus Hidup S3 untuk bucket direktori menggunakan publik APIs untuk menghapus objek di S3 Express One Zone. Untuk menggunakan public level objek APIs, Anda harus memberikan izin `CreateSession` dan mengizinkan izin Siklus Hidup S3 untuk menghapus objek Anda. Jika Anda memiliki kebijakan aktif yang menolak penghapusan, ini akan mencegah Anda mengizinkan Siklus Hidup S3 menghapus objek atas nama Anda.

Penting untuk mengonfigurasi kebijakan bucket dengan benar untuk memastikan bahwa objek yang ingin dihapus memenuhi syarat untuk kedaluwarsa. Anda dapat memeriksa AWS CloudTrail log Anda untuk `AccessDenied` Trails untuk pemanggilan `CreateSession` API CloudTrail untuk memverifikasi apakah akses telah ditolak. Memeriksa CloudTrail log Anda dapat membantu Anda dalam memecahkan masalah akses dan mengidentifikasi akar penyebab kesalahan akses ditolak. Anda kemudian dapat memperbaiki kontrol akses yang salah dengan memperbarui kebijakan yang relevan. 

Jika Anda mengonfirmasi bahwa kebijakan bucket disetel dengan benar dan masih mengalami masalah, sebaiknya tinjau aturan siklus hidup untuk memastikan bahwa kebijakan tersebut diterapkan pada subset objek yang tepat. 

## Bagaimana cara memantau tindakan yang diambil oleh aturan siklus hidup saya?
<a name="troubleshoot-directory-bucket-lifecycle-2"></a>

 Anda dapat menggunakan log peristiwa AWS CloudTrail data untuk memantau tindakan yang diambil oleh Siklus Hidup S3 di bucket direktori. Untuk informasi selengkapnya, lihat [contoh file CloudTrail log](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-log-files.html).