[AWS] S3ライフサイクルによるObject削除

# AWS S3ライフサイクルによるObject削除

特定のオブジェクトをFilterで削除するための方法をJava, Go, C#で残しておく。

## Java

以下はJavaを使用してAWS S3にファイルをアップロードする際にTTLを付与する方法。

### ライフサイクル設定のコード

```java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

public class S3FileUploadExample {

  public static void main(String[] args) {
    String bucketName = "your-bucket-name";
    String key = "your-file-key";
    String filePath = "path/to/your/file";

    AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
            .withRegion("your-region")
            .build();

    // バケットを作成（既に存在する場合はスキップ）
    if (!s3Client.doesBucketExistV2(bucketName)) {
        s3Client.createBucket(bucketName);
    }

    // ファイルをアップロード
    s3Client.putObject(new PutObjectRequest(bucketName, key, new java.io.File(filePath)));

    // ライフサイクル設定の作成
    Transition transition = new Transition()
            .withDays(30) // 30日後にオブジェクトがIAに移動する
            .withStorageClass(StorageClass.StandardInfrequentAccess);

    Rule rule = new Rule()
            .withId("TTLRule")
            .withFilter(new LifecycleFilter(new LifecycleFilterPredicate(new LifecyclePrefixPredicate(key))))
            .addTransition(transition)
            .withStatus(BucketLifecycleConfiguration.ENABLED);

    BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration()
            .withRules(rule);

    SetBucketLifecycleConfigurationRequest lifecycleRequest = new SetBucketLifecycleConfigurationRequest(
            bucketName, configuration);

    // ライフサイクル設定をバケットに適用
    s3Client.setBucketLifecycleConfiguration(lifecycleRequest);
  }
}
```

### クライアントのコード

```java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

public class S3ClientExample {

  public static void main(String[] args) {
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
            .withRegion("your-region")
            .build();

    // S3クライアントを使用してファイルをアップロードするコード
    // ...

  }
}
```

## Go

以下はGoを使用してAWS S3にファイルをアップロードする際にTTLを付与する方法。

### ライフサイクル設定のコード

```go
package main

import (
	"log"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func main() {
	bucketName := "your-bucket-name"
	fileKey := "your-file-key"
	filePath := "path/to/your/file"

	sess, err := session.NewSession(&aws.Config{
		Region: aws.String("your-region")},
	)

	if err != nil {
		log.Fatal("Failed to create AWS session: ", err)
	}

	svc := s3.New(sess)

	// ファイルをアップロード
	_, err = svc.PutObject(&s3.PutObjectInput{
		Body:   aws.ReadSeekCloser("path/to/your/file"),
		Bucket: aws.String(bucketName),
		Key:    aws.String(fileKey),
	})

	if err != nil {
		log.Fatal("Failed to upload file: ", err)
	}

	// ライフサイクル設定の作成
	transition := &s3.Transition{
		StorageClass: aws.String("STANDARD_IA"),
		TransitionInDays: aws.Int64(30),
	}

	rules := []*s3.Rule{
		{
			ID:     aws.String("TTLRule"),
			Status: aws.String("Enabled"),
			Filter: &s3.LifecycleFilter{
				Prefix: aws.String(fileKey),
			},
			Transitions: []*s3.Transition{transition},
		},
	}

	configuration := &s3.BucketLifecycleConfiguration{
		Rules: rules,
	}

	_, err = svc.PutBucketLifecycleConfiguration(&s3.PutBucketLifecycleConfigurationInput{
		Bucket:                  aws.String(bucketName),
		LifecycleConfiguration: configuration,
	})

	if err != nil {
		log.Fatal("Failed to set bucket lifecycle configuration: ", err)
	}
}
```

### クライアントのコード

```go
package main

import (
	"log"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func main() {
	sess, err := session.NewSession(&aws.Config{
		Region: aws.String("your-region")},
	)

	if err != nil {
		log.Fatal("Failed to create AWS session: ", err)
	}

	svc := s3.New(sess)

	// S3クライアントを使用してファイルをアップロードするコード
	// ...

}
```

## C\#

以下はC\#を使用してAWS S3にファイルをアップロードする際にTTLを付与する方法。

### ライフサイクル設定のコード

```csharp
using Amazon.S3;
using Amazon.S3.Model;

class Program
{
    static void Main(string[] args)
    {
        string bucketName = "your-bucket-name";
        string fileKey = "your-file-key";
        string filePath = "path/to/your/file";

        using (var client = new AmazonS3Client(Amazon.RegionEndpoint.YourRegion))
        {
            // ファイルをアップロード
            client.PutObject(new PutObjectRequest
            {
                BucketName = bucketName,
                Key = fileKey,
                FilePath = filePath
            });

            // ライフサイクル設定の作成
            var transition = new Transition
            {
                Days = 30, // 30日後にオブジェクトがIAに移動する
                StorageClass = S3StorageClass.StandardInfrequentAccess
            };

            var rule = new LifecycleRule
            {
                Id = "TTLRule",
                Filter = new LifecycleFilter
                {
                    LifecycleFilterPredicate = new LifecyclePrefixPredicate
                    {
                        Prefix = fileKey
                    }
                },
                Transitions = new List<Transition> { transition },
                Status = LifecycleRuleStatus.Enabled
            };

            var configuration = new LifecycleConfiguration
            {
                Rules = new List<LifecycleRule> { rule }
            };

            client.PutLifecycleConfiguration(new PutLifecycleConfigurationRequest
            {
                BucketName = bucketName,
                Configuration = configuration
            });
        }
    }
}
```

### クライアントのコード

```csharp
using Amazon.S3;
using Amazon.S3.Model;

class Program
{
    static void Main(string[] args)
    {
        using (var client = new AmazonS3Client(Amazon.RegionEndpoint.YourRegion))
        {
            // S3クライアントを使用してファイルをアップロードするコード
            // ...
        }
    }
}
```

以上のサンプルコードにおいて、"your-bucket-name"を使用するバケット名、"your-file-key"を使用するファイルキー、"path/to/your/file"をアップロードするファイルのパスに適切な値を設定する。
"your-region"を適切なリージョンに置き換えて検証可能である。