34

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

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

目前我boto每个帐户使用一个配置文件。例如:

  • ~/.boto默认账户
  • ~/.boto_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'))

好,坏,还是冷漠?建议的改进?

4

5 回答 5

73

更新于 2015 年 2 月 6 日,在 2015 年 3 月 19 日通过以下顶部部分更正

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

从 boto 2.29 开始,有一种新的简单方法可以共享 BOTO 和 AWS CLI 凭证,如 Mike Garnaat 在A New and Standardized Way to Manage Credentials in the AWS SDKs 中所述

目的是:

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

创建凭据文件

创建文件~/.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_PROFILEenv 设置的显式配置文件。变量

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

$ 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. 配置文件凭据部分

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

为了使事情保持干净和简单,最好摆脱旧方法,因此删除任何旧样式文件(如~/.aws/configor ~/.boto),取消设置环境变量(BOTO_CONFIG如果已设置),还可能还有此类变量指向的文件。

这就是 boto >=2.29.0 的全部内容

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

使用 boto 配置文件 (boto>=2.24.0)

以下描述仅适用于无法升级到 boto 2.29.0 或更高版本的用户

自 boto 2.24.0 以来,有一个名为profile_name

在您的~/.boto文件中,您已经有 [Credentials] 部分,这将作为后备选项,然后 [profile ] 部分用于不同的配置文件:

[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. 保留~/.aws/config由 AWSCLI 创建的文件(这是默认位置)
  2. 复制部分[default]并将其重命名为[Credentials](内部保留相同的值)。
  3. 添加我使用的任何配置文件
  4. 设置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 共享,包括配置文件。

于 2014-01-25T01:48:47.977 回答
11

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

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

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

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

如果您对如何在 boto 中工作有任何想法,请告诉我!

于 2012-07-02T13:02:35.563 回答
6

与其创建一堆单独的 boto 配置文件,不如考虑使用 ConfigParser 模块并在 .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 代码中使用,以轻松设置正确的帐户。

于 2013-10-24T00:22:02.240 回答
0

从 boto >= 2.38 开始,似乎所有以前的解决方案都会引起巨大的头痛和问题。

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

请注意,这仍然不适用于 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
于 2016-01-14T18:32:28.403 回答
0

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

cloudwatch_region_endpoint

或者,当从 EC2 中的实例本身推送数据时(当实例位于与其推送到的不同区域时),连接仍将使用与当前实例相同的区域。

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
于 2018-06-26T22:11:20.333 回答