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
}