Skip to content

Commit 2234387

Browse files
authored
Merge pull request #4667 from thefirstofthe300/reduce-log-spam
🐛 cleanup: eliminate log spam when using S3 secrets
2 parents 988d136 + 0be00ee commit 2234387

File tree

6 files changed

+47
-19
lines changed

6 files changed

+47
-19
lines changed

cmd/clusterawsadm/cloudformation/bootstrap/cluster_api_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ func (t Template) ControllersPolicy() *iamv1.PolicyDocument {
284284
Action: iamv1.Actions{
285285
"s3:CreateBucket",
286286
"s3:DeleteBucket",
287+
"s3:GetObject",
287288
"s3:PutObject",
288289
"s3:DeleteObject",
289290
"s3:PutBucketPolicy",

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_s3_bucket.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ Resources:
289289
- Action:
290290
- s3:CreateBucket
291291
- s3:DeleteBucket
292+
- s3:GetObject
292293
- s3:PutObject
293294
- s3:DeleteObject
294295
- s3:PutBucketPolicy

controllers/awsmachine_controller.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,6 @@ func (r *AWSMachineReconciler) deleteIgnitionBootstrapDataFromS3(machineScope *s
850850
return nil
851851
}
852852

853-
machineScope.Info("Deleting unneeded entry from AWS S3", "secretPrefix", machineScope.GetSecretPrefix())
854-
855853
if err := objectStoreSvc.Delete(machineScope); err != nil {
856854
return errors.Wrap(err, "deleting bootstrap data object")
857855
}

controllers/awsmachine_controller_unit_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,6 @@ func TestAWSMachineReconciler(t *testing.T) {
11361136

11371137
_, err := reconciler.reconcileDelete(ms, cs, cs, cs, cs)
11381138
g.Expect(err).To(BeNil())
1139-
g.Expect(buf.String()).To(ContainSubstring("Deleting unneeded entry from AWS S3"))
11401139
})
11411140
})
11421141

pkg/cloud/services/s3/s3.go

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -173,27 +173,52 @@ func (s *Service) Delete(m *scope.MachineScope) error {
173173
bucket := s.bucketName()
174174
key := s.bootstrapDataKey(m)
175175

176-
s.scope.Info("Deleting object", "bucket_name", bucket, "key", key)
177-
178-
_, err := s.S3Client.DeleteObject(&s3.DeleteObjectInput{
176+
_, err := s.S3Client.HeadObject(&s3.HeadObjectInput{
179177
Bucket: aws.String(bucket),
180178
Key: aws.String(key),
181179
})
182-
if err == nil {
183-
return nil
184-
}
185-
186-
aerr, ok := err.(awserr.Error)
187-
if !ok {
180+
if err != nil {
181+
if aerr, ok := err.(awserr.Error); ok {
182+
switch aerr.Code() {
183+
case "Forbidden":
184+
// In the case that the IAM policy does not have sufficient
185+
// permissions to get the object, we will attempt to delete it
186+
// anyway for backwards compatibility reasons.
187+
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)
188+
189+
_, err = s.S3Client.DeleteObject(&s3.DeleteObjectInput{
190+
Bucket: aws.String(bucket),
191+
Key: aws.String(key),
192+
})
193+
if err != nil {
194+
return errors.Wrap(err, "deleting S3 object")
195+
}
196+
197+
s.scope.Debug("Delete object call succeeded despite missing GetObject permission", "bucket", bucket, "key", key)
198+
199+
return nil
200+
case s3.ErrCodeNoSuchKey:
201+
s.scope.Debug("Object already deleted", "bucket", bucket, "key", key)
202+
return nil
203+
case s3.ErrCodeNoSuchBucket:
204+
s.scope.Debug("Bucket does not exist", "bucket", bucket)
205+
return nil
206+
default:
207+
return errors.Wrap(aerr, "deleting S3 object")
208+
}
209+
}
210+
}
211+
212+
s.scope.Info("Deleting S3 object", "bucket", bucket, "key", key)
213+
214+
_, err = s.S3Client.DeleteObject(&s3.DeleteObjectInput{
215+
Bucket: aws.String(bucket),
216+
Key: aws.String(key),
217+
})
218+
if err != nil {
188219
return errors.Wrap(err, "deleting S3 object")
189220
}
190221

191-
switch aerr.Code() {
192-
case s3.ErrCodeNoSuchBucket:
193-
default:
194-
return errors.Wrap(aerr, "deleting S3 object")
195-
}
196-
197222
return nil
198223
}
199224

pkg/cloud/services/s3/s3_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,8 @@ func TestDeleteObject(t *testing.T) {
631631
},
632632
}
633633

634+
s3Mock.EXPECT().HeadObject(gomock.Any())
635+
634636
s3Mock.EXPECT().DeleteObject(gomock.Any()).Do(func(deleteObjectInput *s3svc.DeleteObjectInput) {
635637
t.Run("use_configured_bucket_name_on_cluster_level", func(t *testing.T) {
636638
t.Parallel()
@@ -672,7 +674,7 @@ func TestDeleteObject(t *testing.T) {
672674
},
673675
}
674676

675-
s3Mock.EXPECT().DeleteObject(gomock.Any()).Return(nil, awserr.New(s3svc.ErrCodeNoSuchBucket, "", nil)).Times(1)
677+
s3Mock.EXPECT().HeadObject(gomock.Any()).Return(nil, awserr.New(s3svc.ErrCodeNoSuchBucket, "", nil))
676678

677679
if err := svc.Delete(machineScope); err != nil {
678680
t.Fatalf("Unexpected error, got: %v", err)
@@ -696,6 +698,7 @@ func TestDeleteObject(t *testing.T) {
696698
},
697699
}
698700

701+
s3Mock.EXPECT().HeadObject(gomock.Any())
699702
s3Mock.EXPECT().DeleteObject(gomock.Any()).Return(nil, errors.New("foo")).Times(1)
700703

701704
if err := svc.Delete(machineScope); err == nil {
@@ -747,6 +750,7 @@ func TestDeleteObject(t *testing.T) {
747750
},
748751
}
749752

753+
s3Mock.EXPECT().HeadObject(gomock.Any()).Times(2)
750754
s3Mock.EXPECT().DeleteObject(gomock.Any()).Return(nil, nil).Times(2)
751755

752756
if err := svc.Delete(machineScope); err != nil {

0 commit comments

Comments
 (0)