@@ -475,6 +475,7 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
475475 iamSvc := iam .New (prov )
476476 temp := * renderCustomCloudFormation (t )
477477 var (
478+ iamUsers []* cfn_iam.User
478479 iamRoles []* cfn_iam.Role
479480 instanceProfiles []* cfn_iam.InstanceProfile
480481 policies []* cfn_iam.ManagedPolicy
@@ -485,6 +486,9 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
485486 // temp.Resources is a map. Traversing that directly results in undetermined order.
486487 for _ , val := range temp .Resources {
487488 switch val .AWSCloudFormationType () {
489+ case configservice .ResourceTypeAwsIamUser :
490+ user := val .(* cfn_iam.User )
491+ iamUsers = append (iamUsers , user )
488492 case configservice .ResourceTypeAwsIamRole :
489493 role := val .(* cfn_iam.Role )
490494 iamRoles = append (iamRoles , role )
@@ -499,6 +503,19 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
499503 groups = append (groups , group )
500504 }
501505 }
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+ }
502519 for _ , role := range iamRoles {
503520 By (fmt .Sprintf ("deleting the following role: %s" , role .RoleName ))
504521 repeat := false
@@ -599,6 +616,24 @@ func detachAllPoliciesForRole(prov client.ConfigProvider, name string) error {
599616 return nil
600617}
601618
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+
602637// DeleteRole deletes roles in a best effort manner.
603638func DeleteRole (prov client.ConfigProvider , name string ) error {
604639 iamSvc := iam .New (prov )
0 commit comments