S3 objects 使用 Golang SDK 不会过期

S3 objects not expiring using the Golang SDK

使用 AWS Golang SDK,我试图为我正在上传的一些 object 设置到期日期。我很确定 header 设置正确,但是,当登录 S3 并查看新 object 的属性时,它似乎没有到期日期。

下面是我如何上传的片段 objects

exp := time.Now()
exp = exp.Add(time.Hour * 24)

svc := s3.New(session.New(config))
_, err = svc.PutObject(&s3.PutObjectInput{
    Bucket:        aws.String("MyBucketName"),
    Key:           aws.String("201700689.zip"),
    Body:          fileBytes,
    ContentLength: aws.Int64(size),
    ContentType:   aws.String(fileType),
    Expires:       &exp,
})

这是我登录网站时看到的

知道这里发生了什么吗?谢谢

嗯,Expires 只是错误的字段:

// The date and time at which the object is no longer cacheable.

你想要的是 Object Expiration 可以设置为存储桶规则而不是每个对象。

基本上,您添加一个生命周期规则(在存储桶属性上)指定:

Each rule has the following attributes:

Prefix – Initial part of the key name, (e.g. logs/), or the entire key name. Any object in the bucket with a matching prefix will be subject to this expiration rule. An empty prefix will match all objects in the bucket.

Status – Either Enabled or Disabled. You can choose to enable rules from time to time to perform deletion or garbage collection on your buckets, and leave the rules disabled at other times.

Expiration – Specifies an expiration period for the objects that are subject to the rule, as a number of days from the object’s creation date.

Id – Optional, gives a name to the rule.

然后将每天评估此规则并删除任何过期的对象。

有关更深入的解释,请参阅 https://aws.amazon.com/blogs/aws/amazon-s3-object-expiration/

使用 Golang SDK 使 S3 中的对象过期的一种方法是使用类似

的内容标记您的上传

Tagging: aws.String("temp=true")

然后,转到 S3 存储桶管理控制台并设置一个生命周期规则针对特定的 tag 像这样。

您可以在 LifeCycle 中的规则创建期间配置对象过期的时间范围。

你需要设置s3.PresignOptions.Expires,像这样:

func PreSignPutObject(cfg aws.Config, bucket, objectKey string) (string, error) {
    client := s3.NewFromConfig(cfg)
    psClient := s3.NewPresignClient(client)

    input := &s3.PutObjectInput{
        Bucket: &bucket,
        Key:    &objectKey,
    }
    resp, err := psClient.PresignPutObject(context.Background(), input, func(options *s3.PresignOptions){
        options.Expires = 3600 * time.Second
    })
    if err != nil {
        return "", err
    }

    return resp.URL, nil
}