通过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'))
好,坏,还是无动于衷?建议的改进?
答案 0 :(得分:66)
更新2015-02-06,更正2015-03-19 ,请参阅上一节
自从boto 2.29以来,Mike提供了一种新的简单方式来共享BOTO和AWS CLI凭据 Garnaat在A New and Standardized Way to Manage Credentials in the AWS SDKs
目的是:
创建文件~/.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.直接从代码
传递
密钥/秘密的环境变量
个人资料的环境变量
共享凭据文件显式配置文件
共享凭据文件默认配置文件
配置文件显式配置文件
- 醇>
配置文件凭据部分
从代码传递的配置文件会覆盖环境变量中的任何集合。
为了保持简洁,最好摆脱旧方法,删除任何旧样式文件(如~/.aws/config
或~/.boto
),取消设置环境变量BOTO_CONFIG
设置和
也可能是这个变量指向的文件。
而这完全适用于boto> = 2.29.0
注意:不要尝试通过env.variable控制配置文件的位置(如AWS_CONFIG_FILE
),它不能按预期工作。
以下说明仅针对那些无法升级到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成为非常棒的工具。由于配置文件的格式几乎相同,我按照以下方式使用它:
~/.aws/config
文件(这是默认位置)[default]
并将其重命名为[Credentials]
(内部保留相同的值)。BOTO_CONFIG
变量设置为指向此~/.aws/config
文件。 ~/.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