2015-10-20 29 views
0

我使用的博託庫從EC2元數據丟失,版本信息:爲什麼會安全證書有時被

boto==2.38.0 
botocore==0.81.0 

我使用boto.utils.get_instance_metadata()在EC2實例元數據,以使用安全憑據我已經與該實例關聯。有時候,憑證在meta_data['iam']['security-credentials']['ROLE_NAME']之下,但其他時間的「安全憑證」僅指向空字典。

除了嘗試boto3之外,還有任何建議/解釋嗎?

回答

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 

所以,如果你直接訪問它們,你會發現預期值。如果你對它們進行迭代,你可能會得到驚喜。