建议使用多个AWS账户管理凭证的方法?

时间:2012-07-01 23:44:48

标签: python amazon-web-services boto

通过boto管理多个Amazon Web Services(AWS)帐户的最佳方式是什么?

我熟悉我正在使用的BotoConfig个文件。但是每个文件只描述一个帐户......而且我的工作不仅仅是一个组织。出于所有常见的法律,财务和安全原因,这些帐户不能混合使用。

目前我在每个帐户使用一个boto个配置文件。 E.g:

  • ~/.boto默认帐户
  • ~/.boto_clowncollege代表“clowncollege”帐号
  • ~/.boto_razorassoc代表“razorassoc”帐号
  • ~/.boto_xyz代表“xyz”帐户

然后像:

def boto_config_path(account=None):
    """
    Given an account name, return the path to the corresponding boto
    configuration file. If no account given, return the default config file.
    """
    path = '~/.boto' + ('_' + account if account else '')
    clean_path = os.path.abspath(os.path.expanduser(path))
    if os.path.isfile(clean_path):
        return clean_path
    else:
        errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
        raise ValueError(errmsg)

def aws_credentials(account=None):
    """
    Return a tuple of AWS credentials (access key id and secret access key) for
    the given account.
    """
    try:
        cfg = INIConfig(open(boto_config_path(account)))
        return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
    except Exception:
        raise

conn = EC2Connection(*aws_credentials('razorassoc'))

好,坏,还是无动于衷?建议的改进?

5 个答案:

答案 0 :(得分:66)

更新2015-02-06,更正2015-03-19 ,请参阅上一节

boto和AWSCLI凭证的新标准化共享(boto> == 2.29.0)

自从boto 2.29以来,Mike提供了一种新的简单方式来共享BOTO和AWS CLI凭据 Garnaat在A New and Standardized Way to Manage Credentials in the AWS SDKs

目的是:

  1. 允许通过boto,AWSCLI和可能的其他SDK共享凭据
  2. 将所有配置保存在单个文件中,位于用户配置文件目录中
  3. 允许使用命名的个人资料
  4. 尽量保持简单(例如防止与其他方法发生冲突)
  5. 创建凭证文件

    创建文件~/.aws/credentials(Mac / Linux)或%USERPROFILE%\.aws\credentials(Windwos) 如下:

    [default]
    aws_access_key_id = AxxxA
    aws_secret_access_key = Zxxxr
    region = eu-west-1
    
    [jekyl]
    aws_access_key_id = AxxxA
    aws_secret_access_key = Zxxxr
    region = eu-west-1
    
    [hyde]
    aws_access_key_id = AxxxZ
    aws_secret_access_key = CxxxZ
    region = eu-west-1
    

    从现在开始,您可以使用以下代码:

    使用默认配置文件

    import boto
    con = boto.connect_s3()
    

    使用AWS_PROFILE env设置的显式配置文件。 VAR

    (这是我最喜欢的选项,保持配置文件名称不在代码中,仍然让我的应用程序的部署者有机会选择特定的配置文件)

    $ export AWS_PROFILE=jekyl
    

    并保持您的代码像以前一样简单:

    import boto
    con = boto.connect_s3()
    

    在代码中指定显式配置文件

    import boto
    con = boto.connect_s3(profile_name="jekyl")
    

    这是您通常需要做的所有事情

    boto issue #2292中描述了选择正确凭据的逻辑,如下所示:

      

    从最高优先级到最低优先级的加载顺序:

         

    1.直接从代码

    传递      
        
    1. 密钥/秘密的环境变量

    2.   
    3. 个人资料的环境变量

    4.   
    5. 共享凭据文件显式配置文件

    6.   
    7. 共享凭据文件默认配置文件

    8.   
    9. 配置文件显式配置文件

    10.   
    11. 配置文件凭据部分

    12.         

      从代码传递的配置文件会覆盖环境变量中的任何集合。

    为了保持简洁,最好摆脱旧方法,删除任何旧样式文件(如~/.aws/config~/.boto),取消设置环境变量BOTO_CONFIG设置和 也可能是这个变量指向的文件。

    而这完全适用于boto> = 2.29.0

    注意:不要尝试通过env.variable控制配置文件的位置(如AWS_CONFIG_FILE),它不能按预期工作。

    使用boto config profile(boto> = 2.24.0)

    以下说明仅针对那些无法升级到boto 2.29.0或更高版本的人

    从boto 2.24.0开始,有一个名为profile_name

    的功能

    ~/.boto文件中,您已经拥有[凭据]部分,这将作为后备选项,然后[个人资料]部分用于不同的配置文件:

    [Credentials]
    aws_access_key_id = AxxxA
    aws_secret_access_key = Zxxxr
    
    [profile jekyl]
    aws_access_key_id = AxxxA
    aws_secret_access_key = Zxxxr
    
    [profile hyde]
    aws_access_key_id = AxxxZ
    aws_secret_access_key = CxxxZ
    

    然后,在创建连接时,使用这种方式:

    import boto
    con = boto.connect_s3(profile_name="jekyl")
    

    请注意,此功能自boto 2.24.0起可用。

    教程在这里http://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile

    甚至有一些关于使用密钥环的注意事项,但我将首先习惯这个配置文件,这是我梦寐以求的几年。

    使用AWSCLI

    共享配置文件

    AWSCLI成为非常棒的工具。由于配置文件的格式几乎相同,我按照以下方式使用它:

    1. 保留由AWSCLI创建的~/.aws/config文件(这是默认位置)
    2. 复制部分[default]并将其重命名为[Credentials](内部保留相同的值)。
    3. 添加我使用的任何配置文件
    4. BOTO_CONFIG变量设置为指向此~/.aws/config文件。
    5. ~/.boto将成为`〜/ .aws / config,内容如下:

      [default]
      aws_access_key_id = AxxxA
      aws_secret_access_key = Zxxxr
      
      [Credentials]
      aws_access_key_id = AxxxA
      aws_secret_access_key = Zxxxr
      
      [profile jekyl]
      aws_access_key_id = AxxxA
      aws_secret_access_key = Zxxxr
      
      [profile hyde]
      aws_access_key_id = AxxxZ
      aws_secret_access_key = CxxxZ
      

      这样,它就会被AWSCLI和boto共享,包括个人资料。

答案 1 :(得分:8)

将来,boto将提供更好的工具来帮助您管理多个凭据,但目前有一些环境变量可能有所帮助。

首先,您可以将BOTO_CONFIG设置为指向您要使用的boto配置文件,它将覆盖在正常位置找到的任何配置文件。

其次,您可以将BOTO_PATH设置为以冒号分隔的位置列表,以查找boto配置文件,并在正常搜索位置之前首先搜索该位置。

这些都没有给你你想要的东西,但它可以使用更少的代码更容易完成。

如果您有关于如何在博托工作的想法,请告诉我!

答案 2 :(得分:5)

请考虑使用ConfigParser模块并在.boto文件中为每个帐户创建一个部分,而不是创建一堆单独的boto配置文件。

您的.boto文件可能看起来像这样

#Contents of ~/.boto
[clown-college]
aws_access_key_id = 123sesamestreet
aws_secret_access_key = 678idsaf567ujd
[razor-assoc]
aws_access_key_id = 437piedmont
aws_secret_access_key = 997567ujdfs

在您的python代码中,使用ConfigParser为您要使用的帐户加载相应的访问密钥。

import ConfigParser
from os.path import expanduser

########## BEGIN MAIN ##############

# get the path to the user's homedir
user_home = expanduser("~")

#load their .boto config file
config = ConfigParser.ConfigParser()
config.read([str(user_home + "/.boto")])

#get the keypair for ClownCollege
print config.get('clown-college', 'aws_access_key_id')
print config.get('clown-college', 'aws_secret_access_key')

print config.get('razor-assoc', 'aws_access_key_id')
print config.get('razor-assoc', 'aws_secret_access_key')

这可以包含在一个函数中,以便在您的boto代码中使用,以便轻松设置正确的帐户。

答案 3 :(得分:0)

截至boto> = 2.38,似乎所有先前的解决方案都可能导致巨大的麻烦和问题。

今天在基于多个BSD的平台上对此进行了广泛测试后,管理AWSCLI和py-boto的不同配置文件身份验证的最有效方式现在似乎是使用aws configure互动脚本。在没有配置文件的情况下调用它,它将为.aws / config和.aws / credentials文件填写[default]块,此外它还将配置使用aws工具集进行boto所需的任何其他魔法(虽然还不清楚它在你的本地主机上是什么咒语)。使用任何配置文件名称再次调用它,它将创建一个适当的条目。

请注意,这仍然不适用于boto<的版本。 2.3。

aws configure --profile somename
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-east-1
Default output format [None]: json

答案 4 :(得分:0)

请注意,对于http://boto.cloudhackers.com/en/latest/boto_config_tut.html,在Boto 2.48.0版本中使用 connect_cloudwatch()时,我实际上需要提供

cloudwatch_region_endpoint

当在EC2中从实例本身推送数据 时(当实例与推送对象位于不同的区域时),连接仍将使用与当前实例相同的区域。< / p>

cat .boto
[Boto]
cloudwatch_region_name = us-west-2
cloudwatch_region_endpoint = monitoring.us-west-2.amazonaws.com

我尝试将其添加到.aws / credentials配置文件中,但似乎不起作用。

cat .aws/credentials 
[cloudwatch_centralized_reporting]
region = us-west-2
aws_access_key_id = XXX
aws_secret_access_key = XXX