code: func (c *Cloud) GetCandidateZonesForDynamicVolume() (sets.String, error) {
  	// We don't currently cache this; it is currently used only in volume
  	// creation which is expected to be a comparatively rare occurrence.
  
  	// TODO: Caching / expose v1.Nodes to the cloud provider?
  	// TODO: We could also query for subnets, I think
  
  	filters := []*ec2.Filter{newEc2Filter("instance-state-name", "running")}
  
  	instances, err := c.describeInstances(filters)
  	if err != nil {
  		return nil, err
  	}
  
  	if len(instances) == 0 {
  		return nil, fmt.Errorf("no instances returned")
  	}
  
  	zones := sets.NewString()
  
  	for _, instance := range instances {
  		// We skip over master nodes, if the installation tool labels them with one of the well-known master labels
  		// This avoids creating a volume in a zone where only the master is running - e.g. #34583
  		// This is a short-term workaround until the scheduler takes care of zone selection
  		master := false
  		for _, tag := range instance.Tags {
  			tagKey := aws.StringValue(tag.Key)
  			if awsTagNameMasterRoles.Has(tagKey) {
  				master = true
  			}
  		}
  
  		if master {
  			klog.V(4).Infof("Ignoring master instance %q in zone discovery", aws.StringValue(instance.InstanceId))
  			continue
  		}
  
  		if instance.Placement != nil {
  			zone := aws.StringValue(instance.Placement.AvailabilityZone)
  			zones.Insert(zone)
  		}
  	}
  
  	klog.V(2).Infof("Found instances in zones %s", zones)
  	return zones, nil
  }
docs: // GetCandidateZonesForDynamicVolume retrieves  a list of all the zones in which nodes are running
  // It currently involves querying all instances