@@ -475,6 +475,7 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
475
475
iamSvc := iam .New (prov )
476
476
temp := * renderCustomCloudFormation (t )
477
477
var (
478
+ iamUsers []* cfn_iam.User
478
479
iamRoles []* cfn_iam.Role
479
480
instanceProfiles []* cfn_iam.InstanceProfile
480
481
policies []* cfn_iam.ManagedPolicy
@@ -485,6 +486,9 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
485
486
// temp.Resources is a map. Traversing that directly results in undetermined order.
486
487
for _ , val := range temp .Resources {
487
488
switch val .AWSCloudFormationType () {
489
+ case configservice .ResourceTypeAwsIamUser :
490
+ user := val .(* cfn_iam.User )
491
+ iamUsers = append (iamUsers , user )
488
492
case configservice .ResourceTypeAwsIamRole :
489
493
role := val .(* cfn_iam.Role )
490
494
iamRoles = append (iamRoles , role )
@@ -499,6 +503,19 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
499
503
groups = append (groups , group )
500
504
}
501
505
}
506
+ for _ , user := range iamUsers {
507
+ By (fmt .Sprintf ("deleting the following user: %q" , user .UserName ))
508
+ repeat := false
509
+ Eventually (func (gomega Gomega ) bool {
510
+ err := DeleteUser (prov , user .UserName )
511
+ if err != nil && ! repeat {
512
+ By (fmt .Sprintf ("failed to delete user '%q'; reason: %+v" , user .UserName , err ))
513
+ repeat = true
514
+ }
515
+ code , ok := awserrors .Code (err )
516
+ return err == nil || (ok && code == iam .ErrCodeNoSuchEntityException )
517
+ }, 5 * time .Minute , 5 * time .Second ).Should (BeTrue (), fmt .Sprintf ("Eventually failed deleting the user: %q" , user .UserName ))
518
+ }
502
519
for _ , role := range iamRoles {
503
520
By (fmt .Sprintf ("deleting the following role: %s" , role .RoleName ))
504
521
repeat := false
@@ -599,6 +616,24 @@ func detachAllPoliciesForRole(prov client.ConfigProvider, name string) error {
599
616
return nil
600
617
}
601
618
619
+ // DeleteUser deletes an IAM user in a best effort manner.
620
+ func DeleteUser (prov client.ConfigProvider , name string ) error {
621
+ iamSvc := iam .New (prov )
622
+
623
+ // if role does not exist, return.
624
+ _ , err := iamSvc .GetUser (& iam.GetUserInput {UserName : aws .String (name )})
625
+ if err != nil {
626
+ return err
627
+ }
628
+
629
+ _ , err = iamSvc .DeleteUser (& iam.DeleteUserInput {UserName : aws .String (name )})
630
+ if err != nil {
631
+ return err
632
+ }
633
+
634
+ return nil
635
+ }
636
+
602
637
// DeleteRole deletes roles in a best effort manner.
603
638
func DeleteRole (prov client.ConfigProvider , name string ) error {
604
639
iamSvc := iam .New (prov )
0 commit comments