【问题标题】:Why would security credentials sometimes be missing from EC2 metadata为什么 EC2 元数据中有时会缺少安全凭证
【发布时间】:2016-01-18 15:03:31
【问题描述】:

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

boto==2.38.0
botocore==0.81.0

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

除了尝试boto3之外还有什么建议/解释吗?

【问题讨论】:

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


    【解决方案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
    

    因此,如果您直接访问它们,您将找到预期值。如果你对它们进行迭代,你可能会得到惊喜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 2017-04-22
      • 2014-01-20
      • 2021-01-11
      • 2021-06-20
      • 2014-01-05
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多