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, "//")
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
}