[python] 推荐使用多个AWS账户管理凭证的方法?



Answers

更新2015-02-06,通过以下顶部更正2015-03-19

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

从boto 2.29开始,有一种新的简单方法可以共享BOTO和AWS CLI凭证,如Mike Garnaat所描述的以新的标准化方式管理AWS SDK中的凭据

目的是:

  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_PROFILE设置的显式配置文件。 VAR

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

$ export AWS_PROFILE=jekyl

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

import boto
con = boto.connect_s3()

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

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

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

boto问题#2292中描述了选择适当凭据的逻辑如下:

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

1.直接从代码传递

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

  2. 配置文件的环境变量

  3. 共享凭证文件显式配置文件

  4. 共享凭据文件默认配置文件

  5. 配置文件显式配置文件

  6. 配置文件凭据部分

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

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

这真的是boto> = 2.29.0

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

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

以下描述仅适用于那些无法升级到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. 保留~/.aws/config创建的~/.aws/config文件(这是默认位置)
  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共享,包括配置文件。

Question

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

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

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

  • ~/.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'))

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




截至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



Links