【问题标题】:Boto: Dynamically get aws_access_key_id and aws_secret_access_key in Python code from config?Boto:从配置中动态获取 Python 代码中的 aws_access_key_id 和 aws_secret_access_key?
【发布时间】:2015-05-06 00:32:59
【问题描述】:

我的 aws_access_key_idaws_secret_access_key 存储在 ~/.boto 中,我想知道是否有办法让我使用 Boto 在我的 python 代码中检索这些值,因为我需要将它们插入到我的 SQL 语句中从 S3 复制 CSV 文件。

【问题讨论】:

    标签: python python-3.x amazon-web-services boto


    【解决方案1】:

    因为 aws 凭证和 boto 文件都使用 .ini 格式,您可以使用 ConfigParser 解析它们。这是解析~/.aws/credentials 文件的示例(这是python 2,但应该很容易移植到python 3):

    from os.path import expanduser
    import ConfigParser
    
    def read_credentials_from_config_section(section_name):
        # parsing ~/.aws/credentials but it's just as easy to parse ~/.boto
        aws_credentials_path = os.path.join(expanduser("~"), '.aws', 'credentials')
        c = ConfigParser.ConfigParser()
        c.read(aws_credentials_path)
        return c.get(section_name, 'aws_access_key_id'), c.get(section_name, 'aws_secret_access_key')
    

    使用途径:

    k, s = read_credentials_from_config_section('default')
    

    如果你想使用~/.boto文件,修改上面的代码以读取~/.boto文件,并调整它的命名约定——代码非常相似。

    另一种读取~/.aws/credentials 文件的方法(假设您安装了awscli)是使用aws cli 并让它处理细节。不过,这要慢得多(在我的机器上运行大约需要 1.5 秒,这对于很多用例来说是不可接受的)。

    import subprocess
    print subprocess.check_output(['aws', 'configure', 'get', 'aws_access_key_id', '--profile', aws_profile_name])
    print subprocess.check_output(['aws', 'configure', 'get', 'aws_secret_access_key', '--profile', aws_profile_name])
    

    【讨论】:

      【解决方案2】:

      如果boto.config 不起作用,这里有一个助手会在~/.aws/credentials 中查找。我没有仔细研究它,但似乎 Boto 2 并没有出现在 ~/.aws/credentials 中。

      def get_aws_credentials():
          # I think this will look in ~/.boto ([Credentials] section)
          aws_access_key_id = boto.config.get_value("Credentials", 'aws_access_key_id')
          aws_secret_access_key = boto.config.get_value("Credentials", 'aws_secret_access_key')
      
          # I don't think Boto 2 looks in ~/.aws/credentials, so we look
          if aws_access_key_id is None or aws_secret_access_key is None:
              with open(os.path.expanduser("~/.aws/credentials")) as f:
                  for line in f:
                      try:
                          key, val = line.strip().split('=')
                          if key == 'aws_access_key_id':
                              aws_access_key_id = val
                          elif key == 'aws_secret_access_key':
                              aws_secret_access_key = val
                      except ValueError:
                          pass
              return aws_access_key_id, aws_secret_access_key
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        import boto
        access_key = boto.config.get_value('Credentials', 'aws_access_key_id')
        secret_key = boto.config.get_value('Credentials', 'aws_secret_access_key')
        

        【讨论】:

        • 我想也许对于 Boto 2,这只会出现在 ~/.boto 而不是 ~/.aws/credentials
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多