in pkg/providers/instanceprofile/instanceprofile.go [65:107]
func (p *DefaultProvider) Create(ctx context.Context, instanceProfileName string, roleName string, tags map[string]string) error {
instanceProfile, err := p.Get(ctx, instanceProfileName)
if err != nil {
if !awserrors.IsNotFound(err) {
return serrors.Wrap(fmt.Errorf("getting instance profile, %w", err), "instance-profile", instanceProfileName)
}
o, err := p.iamapi.CreateInstanceProfile(ctx, &iam.CreateInstanceProfileInput{
InstanceProfileName: lo.ToPtr(instanceProfileName),
Tags: utils.IAMMergeTags(tags),
})
if err != nil {
return serrors.Wrap(fmt.Errorf("creating instance profile, %w", err), "instance-profile", instanceProfileName)
}
instanceProfile = o.InstanceProfile
}
// Instance profiles can only have a single role assigned to them so this profile either has 1 or 0 roles
// https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html
if len(instanceProfile.Roles) == 1 {
if lo.FromPtr(instanceProfile.Roles[0].RoleName) == roleName {
return nil
}
if _, err = p.iamapi.RemoveRoleFromInstanceProfile(ctx, &iam.RemoveRoleFromInstanceProfileInput{
InstanceProfileName: lo.ToPtr(instanceProfileName),
RoleName: instanceProfile.Roles[0].RoleName,
}); err != nil {
return serrors.Wrap(fmt.Errorf("removing role for instance profile, %w", err), "role", lo.FromPtr(instanceProfile.Roles[0].RoleName), "instance-profile", instanceProfileName)
}
}
// If the role has a path, ignore the path and take the role name only since AddRoleToInstanceProfile
// does not support paths in the role name.
roleName = lo.LastOr(strings.Split(roleName, "/"), roleName)
if _, err = p.iamapi.AddRoleToInstanceProfile(ctx, &iam.AddRoleToInstanceProfileInput{
InstanceProfileName: lo.ToPtr(instanceProfileName),
RoleName: lo.ToPtr(roleName),
}); err != nil {
return serrors.Wrap(fmt.Errorf("adding role to instance profile, %w", err), "role", roleName, "instance-profile", instanceProfileName)
}
instanceProfile.Roles = []iamtypes.Role{{
RoleName: lo.ToPtr(roleName),
}}
p.cache.SetDefault(instanceProfileName, instanceProfile)
return nil
}