I'm somewhat baffled on how this can happen.
WARNING:INSTANCE i-39AC0623: File "/usr/lib/python2.6/dist-packages/cloudinit/DataSourceEc2.py", line 64, in get_instance_id
WARNING:INSTANCE i-39AC0623: return(self.metadata['instance-id'])
That indicates that somehow, the 'metadata' member of self (DataSourceEc2.py) does not have an 'instance-id' field.
That field gets populated in cloudinit/DataSourceEc2.py's get_data, which does something like:
if not self.wait_for_metadata_service():
self.userdata_raw = boto_utils.get_instance_userdata(self.api_ver)
self.metadata = boto_utils.get_instance_metadata(self.api_ver)
self.wait_for_metadata_service is an attempt to make sure the metadata service is up before calling boto's get_instance_userdata and get_instance_metadata methods to populate the members.
both of get_instance_userdata and get_instance_metadata also take precautions to wait on the metadata service. So, it appears that the metadata service was correctly parsed / crawled by boto, and that it did not have an 'instance-id' field .