docs: def _param_from_config(key, data):
      '''
      Return EC2 API parameters based on the given config data.
  
      Examples:
      1. List of dictionaries
      >>> data = [
      ...     {'DeviceIndex': 0, 'SubnetId': 'subid0',
      ...      'AssociatePublicIpAddress': True},
      ...     {'DeviceIndex': 1,
      ...      'SubnetId': 'subid1',
      ...      'PrivateIpAddress': '192.168.1.128'}
      ... ]
      >>> _param_from_config('NetworkInterface', data)
      ... {'NetworkInterface.0.SubnetId': 'subid0',
      ...  'NetworkInterface.0.DeviceIndex': 0,
      ...  'NetworkInterface.1.SubnetId': 'subid1',
      ...  'NetworkInterface.1.PrivateIpAddress': '192.168.1.128',
      ...  'NetworkInterface.0.AssociatePublicIpAddress': 'true',
      ...  'NetworkInterface.1.DeviceIndex': 1}
  
      2. List of nested dictionaries
      >>> data = [
      ...     {'DeviceName': '/dev/sdf',
      ...      'Ebs': {
      ...      'SnapshotId': 'dummy0',
      ...      'VolumeSize': 200,
      ...      'VolumeType': 'standard'}},
      ...     {'DeviceName': '/dev/sdg',
      ...      'Ebs': {
      ...          'SnapshotId': 'dummy1',
      ...          'VolumeSize': 100,
      ...          'VolumeType': 'standard'}}
      ... ]
      >>> _param_from_config('BlockDeviceMapping', data)
      ... {'BlockDeviceMapping.0.Ebs.VolumeType': 'standard',
      ...  'BlockDeviceMapping.1.Ebs.SnapshotId': 'dummy1',
      ...  'BlockDeviceMapping.0.Ebs.VolumeSize': 200,
      ...  'BlockDeviceMapping.0.Ebs.SnapshotId': 'dummy0',
      ...  'BlockDeviceMapping.1.Ebs.VolumeType': 'standard',
      ...  'BlockDeviceMapping.1.DeviceName': '/dev/sdg',
      ...  'BlockDeviceMapping.1.Ebs.VolumeSize': 100,
      ...  'BlockDeviceMapping.0.DeviceName': '/dev/sdf'}
  
      3. Dictionary of dictionaries
      >>> data = { 'Arn': 'dummyarn', 'Name': 'Tester' }
      >>> _param_from_config('IamInstanceProfile', data)
      {'IamInstanceProfile.Arn': 'dummyarn', 'IamInstanceProfile.Name': 'Tester'}
  
      '''
  
      param = {}
  
      if isinstance(data, dict):
          for k, v in six.iteritems(data):
              param.update(_param_from_config('{0}.{1}'.format(key, k), v))
  
      elif isinstance(data, list) or isinstance(data, tuple):
          for idx, conf_item in enumerate(data):
              prefix = '{0}.{1}'.format(key, idx)
              param.update(_param_from_config(prefix, conf_item))
  
      else:
          if isinstance(data, bool):
              # convert boolean True/False to 'true'/'false'
              param.update({key: six.text_type(data).lower()})
          else:
              param.update({key: data})
  
      return param