为什么EC2元数据有时会丢失安全凭证

时间:2015-10-20 05:10:48

标签: amazon-web-services amazon-ec2 boto amazon-iam

我正在使用boto库,版本信息:

boto==2.38.0
botocore==0.81.0

我在EC2实例上使用boto.utils.get_instance_metadata()其元数据,以便使用我与实例关联的安全凭据。有时凭据位于meta_data['iam']['security-credentials']['ROLE_NAME']下,但有时候“安全凭证”只指向空字典。

除了试用boto3之外还有任何建议/解释吗?

1 个答案:

答案 0 :(得分:1)

刚想通了,这是因为boto.utils.get_instance_metadata()会返回<class 'boto.utils.LazyLoadMetadata'>的实例,而不是真正的dict。它的内部dict结构也是LazyLoadMetadata的成员。对于可以懒惰地获取的数据,此类提供的迭代器似乎只返回已经显式访问的项/值。因为与实例关联的凭据是临时的,所以有意义的是它们会被懒惰地取出。

示例:

>>> import boto.utils
>>> meta_data = boto.utils.get_instance_metadata()
>>> creds = meta_data.get('iam', {}).get('security-credentials', {})
>>> debug_vals = list(creds.iteritems())
>>> debug_vals
[('ROLE_NAME', None)]
>>>
>>> creds  # printing the object evaluates/loads the entire 'tree'
{'ROLE_NAME': {u'Code': u'Success', u'LastUpdated': u'2015-10-20T15:19:27Z', u'AccessKeyId': u'AQW...', u'SecretAccessKey': u'LmA...', u'Token': u'AQ...', u'Expiration': u'2015-10-20T21:36:17Z', u'Type': u'AWS-HMAC'}}
>>> 
>>> 
>>> debug_vals  # old instance was already populated, so it won't change
[('ROLE_NAME', None)]
>>>
>>> debug_vals2 = list(creds.iteritems())  # a new call to iteritems gets the fully loaded tree
>>> debug_vals2
[('ROLE_NAME', {u'Code': u'Success', u'LastUpdated': u'2015-10-20T15:19:27Z', u'AccessKeyId': u'AQW...', u'SecretAccessKey': u'LmA...', u'Token': u'AQ...', u'Expiration': u'2015-10-20T21:36:17Z', u'Type': u'AWS-HMAC'}}]
# THE END

因此,如果您直接访问它们,您将找到预期的值。如果你迭代它们,你最终可能会有惊喜。