code: func (p *AWSSDProvider) ApplyChanges(changes *plan.Changes) error {
  	// return early if there is nothing to change
  	if len(changes.Create) == 0 && len(changes.Delete) == 0 && len(changes.UpdateNew) == 0 {
  		log.Info("All records are already up to date")
  		return nil
  	}
  
  	// convert updates to delete and create operation if applicable (updates not supported)
  	creates, deletes := p.updatesToCreates(changes)
  	changes.Delete = append(changes.Delete, deletes...)
  	changes.Create = append(changes.Create, creates...)
  
  	namespaces, err := p.ListNamespaces()
  	if err != nil {
  		return err
  	}
  
  	// Deletes must be executed first to support update case.
  	// When just list of targets is updated `[1.2.3.4] -> [1.2.3.4, 1.2.3.5]` it is translated to:
  	// ```
  	// deletes = [1.2.3.4]
  	// creates = [1.2.3.4, 1.2.3.5]
  	// ```
  	// then when deletes are executed after creates it will miss the `1.2.3.4` instance.
  	err = p.submitDeletes(namespaces, changes.Delete)
  	if err != nil {
  		return err
  	}
  
  	err = p.submitCreates(namespaces, changes.Create)
  	if err != nil {
  		return err
  	}
  
  	return nil
  }
docs: // ApplyChanges applies Kubernetes changes in endpoints to AWS API