WORM特性
WORM特性
S3 object lock,也被称为对象存储的WORM特性:write-once-read-many。这个特性主要目的是确保object在设定的时间内或者永远不会被删除或者覆盖。其主要的应用场景就是数据保护场景,例如法规遵从。
保证数据文件“不可删除、不可篡改”,规则启用后,用户可以在Bucket中上传和读取文件(Object),但是在Object的保留时间到期之前,任何用户都不能修改、覆盖、删除处于合规保留期的对象;Object的保留时间到期后,才可以删除Object。
合规保留设置注意事项如下:
规则生效:
- 一个Bucket支持添加一条WORM规则,WORM规则创建后,状态默认为【未启用】。用户需主动启用规则。规则启用后,规则不可禁用、不可删除,且无法缩短保护时间,只可延长保护时间。
- 启用后的规则不可删除
- 保留时间精确到秒,如对象A的最后更新时间为2021-7-1 12:00:00,保护周期1天,则A会在2021-7-2 12:00:01过合规保留期。
关于Bucket操作:
- 如当前Bucket有生效的WORM规则,且有处于合规保留期内的文件,则无法通过控制台、API、SDK删除Bucket。
- 如当前Bucket有生效的WORM规则,但没有处于合规保留期期的文件,或者Bucket为空,则可以删除Bucket,从而间接删除WORM规则。
对于对象的操作:
- 如对象处于保护周期,则无法通过控制台、API、SDK修改、覆盖、删除对象。
- 若设置了生命周期 - 删除文件的操作,需要等对象过了合规保留期后才可生效。
给存储桶开启合规保留
使用golang代码,开启存储桶合规保留
(1)使用ak,sk,endpoint创建S3客户端
func (cfg *ClientCfg) NewClient() (*s3.S3, error) {
ssl := !strings.HasPrefix(cfg.Endpoint, "https://")
cred := credentials.NewStaticCredentials(cfg.Ak, cfg.Sk, "")
transport := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, //控制客户端是否验证服务器端的证书链和主机名
},
}
httpClient := http.Client{Transport: transport}
config := &aws.Config{
DisableSSL: aws.Bool(ssl),
S3ForcePathStyle: aws.Bool(true),
Region: aws.String("default"),
Endpoint: aws.String(cfg.Endpoint),
Credentials: cred,
HTTPClient: &httpClient,
//LogLevel: aws.LogLevel(aws.LogDebugWithSigning),
}
sess, err := session.NewSession(config)
if err != nil {
return nil, err
}
return s3.New(sess), nil
}
(2)开启存储桶合规保留
func PutBucketRetention(s3Client *s3.S3, bucketname string, days int64) error {
req, _ := s3Client.PutObjectLockConfigurationRequest(&s3.PutObjectLockConfigurationInput{
Bucket: aws.String(bucketname),
ObjectLockConfiguration: &s3.ObjectLockConfiguration{
ObjectLockEnabled: aws.String("Enabled"),
Rule: &s3.ObjectLockRule{
DefaultRetention: &s3.DefaultRetention{
Mode: aws.String("GOVERNANCE"),
Days: aws.Int64(days),
},
},
},
})
req.HTTPRequest.Header.Add("x-amz-bucket-object-lock-enabled", "true")
err := req.Send()
return err
}
(3)获取存储桶合规保留配置信息
func GetBucketRetention(s3Client *s3.S3, bucketName string) (*s3.GetObjectLockConfigurationOutput, error) {
data, err := s3Client.GetObjectLockConfiguration(&s3.GetObjectLockConfigurationInput{
Bucket: aws.String(bucketName),
})
return data, err
}