Skip to content

Commit 7cbec75

Browse files
committed
✨s3: ignore access denied errors during object deletion
If `S3Bucket.BestEffortDeleteObjects` is present and true, `AccessDenied` errors will be ignored when deleting S3 objects. This is useful when a user installs a clusters in an account with policies in place to prevent object deletion, e.g: ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "Deny object deletions", "Effect": "Deny", "Principal": "*", "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::<bucketname>/*" } ] } ``` Such errors should not prevent a successful install.
1 parent acfd4ef commit 7cbec75

File tree

1 file changed

+18
-9
lines changed
  • pkg/cloud/services/s3

1 file changed

+18
-9
lines changed

pkg/cloud/services/s3/s3.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"github.com/aws/aws-sdk-go/service/sts"
3333
"github.com/aws/aws-sdk-go/service/sts/stsiface"
3434
"github.com/pkg/errors"
35+
"k8s.io/utils/ptr"
3536

3637
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
3738
iam "sigs.k8s.io/cluster-api-provider-aws/v2/iam/api/v1beta1"
@@ -194,12 +195,8 @@ func (s *Service) Delete(m *scope.MachineScope) error {
194195
// anyway for backwards compatibility reasons.
195196
s.scope.Debug("Received 403 forbidden from S3 HeadObject call. If GetObject permission has been granted to the controller but not ListBucket, object is already deleted. Attempting deletion anyway in case GetObject permission hasn't been granted to the controller but DeleteObject has.", "bucket", bucket, "key", key)
196197

197-
_, err = s.S3Client.DeleteObject(&s3.DeleteObjectInput{
198-
Bucket: aws.String(bucket),
199-
Key: aws.String(key),
200-
})
201-
if err != nil {
202-
return errors.Wrap(err, "deleting S3 object")
198+
if err := s.deleteObject(bucket, key); err != nil {
199+
return err
203200
}
204201

205202
s.scope.Debug("Delete object call succeeded despite missing GetObject permission", "bucket", bucket, "key", key)
@@ -221,11 +218,23 @@ func (s *Service) Delete(m *scope.MachineScope) error {
221218

222219
s.scope.Info("Deleting S3 object", "bucket", bucket, "key", key)
223220

224-
_, err = s.S3Client.DeleteObject(&s3.DeleteObjectInput{
221+
return s.deleteObject(bucket, key)
222+
}
223+
224+
func (s *Service) deleteObject(bucket, key string) error {
225+
if _, err := s.S3Client.DeleteObject(&s3.DeleteObjectInput{
225226
Bucket: aws.String(bucket),
226227
Key: aws.String(key),
227-
})
228-
if err != nil {
228+
}); err != nil {
229+
if ptr.Deref(s.scope.Bucket().BestEffortDeleteObjects, false) {
230+
if aerr, ok := err.(awserr.Error); ok {
231+
switch aerr.Code() {
232+
case "Forbidden", "AccessDenied":
233+
s.scope.Debug("Ignoring deletion error", "bucket", bucket, "key", key, "error", aerr.Message())
234+
return nil
235+
}
236+
}
237+
}
229238
return errors.Wrap(err, "deleting S3 object")
230239
}
231240

0 commit comments

Comments
 (0)