如何临时切换AWS CLI的配置文件?

101

更新的答案(2021年7月10日):对于AWS CLI v1,请执行以下操作:

export AWS_DEFAULT_PROFILE=user2

对于AWS CLI v2,以下内容将有效:

export AWS_PROFILE=user2

以下是完整的问题,以便理解背景:


(1.) 成功配置了AWS CLI的第二个配置文件后,我尝试使用以下命令在我的bash会话中将配置文件设置为user2,但未成功:

export AWS_PROFILE=user2

...根据此处的建议:https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html

(2.) 以下命令可行:

aws s3 ls --profile user2

我知道AWS CLI和user2配置文件都在我的电脑上工作。

(3.) 但是,当我随后尝试执行以下操作时(即在输入“export AWS_PROFILE=user2”之后):

aws s3 ls

... AWS的回应假设我想以默认用户(而非user2)的身份进行查询

(4.) 所以我唯一能够从命令行使用user2配置文件的方式就是继续将“--profile user2”附加到每个单独的命令中,这很繁琐。

(5.)

echo $AWS_PROFILE
产生:
>> user2

就如预期的那样。

你知道这里发生了什么吗?我肯定是犯了一些愚蠢的错误。


1
你所寻找的是预期的行为。请参考AWS文档:https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence。请确认您是否在运行aws命令的同一会话中设置环境变量? - krishna_mee2004
AWS_PROFILE=user2 aws s3 ls 中你得到了什么?那个命令成功使用了 user2 吗? - Grisha Levit
你正在使用哪个版本的aws-cli? - hjpotter92
这也将帮助您了解awscli在凭据方面的操作:aws s3 ls --debug | grep botocore.session - jarmod
1
你可以尝试使用 AWS_DEFAULT_PROFILE=user2 吗? - Varun Chandak
显示剩余6条评论
9个回答

117

对于AWS CLI v1,最简洁的解决方案是:

export AWS_DEFAULT_PROFILE=user2

之后,类似以下命令:

aws s3 ls

...会从相应的账户处理。

对于AWS CLI v2,以下内容可行:

export AWS_PROFILE=user2

1
根据Diego的评论,此变量名已更名为AWS_PROFILE更多信息请参见 - emilebaizel
1
@emilebaizel 实际上,“export AWS_PROFILE=[profile_name]”从来没有对我或许多其他人起作用,因此这个问题很受欢迎。 - James Shapiro
最新的AWS CLI对您仍然无法正常工作吗? - emilebaizel
1
@emilebaizel 在 AWS CLI v2 中,"export AWS_PROFILE=user2" 是有效的。 - James Shapiro
1
对于任何感兴趣的人,这里是官方AWS文档的链接:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html#:~:text=output%3Dtext-,Using%20named%20profiles,-To%20use%20a - rsmets

28

接受的答案假定您正在使用Linux或Mac终端。我添加了Windows,Linux和Mac OS的命令。

Windows

CMD

set AWS_PROFILE=profile_name

Powershell

$env:AWS_PROFILE = 'profile_name'

Linux或Mac

export AWS_PROFILE=profile_name

这些命令将设置您的aws配置文件,每次执行aws命令时都会使用它。但是,如果您只想暂时切换配置文件,则可以在一个aws命令中使用以下命令:

aws [command] [sub-command] --profile [profile-name]


1
这里的 Windows 答案是针对 cmd 的。对于 Powershell,则为 $env:AWS_PROFILE = 'profile_name' - DollarAkshay
这个不起作用。如果我运行aws configure list,我会得到以下结果:access_key ****************BMSB shared-credentials-file
secret_key ****************JStS shared-credentials-file 然后,如果我运行set AWS_PROFILE=scoop_production并重新运行aws configure list,我会得到相同的详细信息,这些信息不是scoop_production的正确详细信息。
- Nick Wright

9

通过这样做,您可以看到它的工作原理。

$ export AWS_PROFILE=myprofile
$ aws s3 ls --debug 2>&1 | grep profile
2018-04-08 19:19:17,990 - MainThread - botocore.session - DEBUG - Loading variable profile from environment with value 'myprofile'.

我怀疑这对你来说不会有所不同。

您还可以验证

$ AWS_PROFILE=myprofile aws s3 ls --debug 2>&1 | grep profile

并且

$ aws s3 ls --profile myprofile --debug 2>&1 | grep profile

所有的操作都会得到相同的结果。

这些命令对我来说并没有产生相同的结果。 前两个不会产生任何输出。最后一个则会产生以下输出:"2018-04-08 23:11:33,683 - MainThread - awscli.clidriver - DEBUG - 进入 CLI 的参数:['s3', 'ls', '--profile', 'myprofile', '--debug'] 2018-04-08 23:11:33,683 - MainThread - botocore.credentials - DEBUG - 跳过环境变量凭证检查,因为配置文件名已被明确设置。" - James Shapiro
@JamesShapiro 从第一个命令中删除 | grep profile 并查看其中的内容。 - Diego Torres Milano

6
创建或编辑此文件:
% vim ~/.aws/credentials

可以列出尽可能多的键值对:

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user1]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

使用--profile user1来选择一个配置文件,然后按照您的喜好进行操作:

aws s3api list-buckets --profile user1
# any aws cli command now using user1 pair of keys

设置一个本地变量来选择你想要使用的键对:

% export AWS_PROFILE=user1

那么就做你喜欢的事吧:

aws s3api list-buckets  # any aws cli command now using user1 pair of keys

以下是您需要翻译的内容:
更多细节请参考:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html

该选项在原始问题描述中被列为次优选项。这不是一个好的选择,因为它涉及将“--profile [user]”附加到您运行的每个单独的CLI命令。 - James Shapiro
我建议删除,因为你的回答中没有任何明确说明以上回答中没有提到的内容。 - James Shapiro

2

2
user@machine:~/.aws$ aws --version
aws-cli/2.1.2 Python/3.7.3 Linux/5.4.0-53-generic exe/x86_64.linuxmint.20

如果我有很多命名的配置文件,我会在我的.bashrc中添加别名。

例如:

alias harry-tuttle='export AWS_PROFILE=harry-tuttle'

然后切换配置文件只需一条命令,输入更少。
要查看所有配置文件:
aws configure list-profiles`

2
AWS cli 有三种读取变量的方式:
  • 通过 key_id / key_secret 的环境变量
  • 通过 cred/config 文件中的配置文件(通常在 ~/.aws/cre... 目录下)
  • 通过内联提供的手动值

请参阅:https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#credentials

其中一种方式将被另一种方式覆盖。根据 OP,尽管 DEFAULT_PROFILE 被设置为 userX,但 AWS_ACCESS_KEY_ID 和/或 AWS_SECRET_ACCESS_KEY 环境变量可能被设置为其他内容。

您可以通过别名到一个 shell 函数,通过使用该函数将凭据加载到当前环境中。

"export AWS_ACCESS_KEY_ID=XXXXXXX;"... and more

或者更安全的方式是通过一个密码管理器加载。
"export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id --profile XXXX)"... and more

导出所有的访问密钥/密码等,然后检查正确的凭证是否通过内存加载。
aws configure list

最后,将变量重置为“默认值”.. 作为确保您按照AWS角色执行所需操作的良好习惯;特别是在使用多个配置文件时。希望这有所帮助。

1
对于Windows使用
set AWS_DEFAULT_PROFILE=user2

你好,欢迎来到 Stack Overflow!请阅读 如何撰写优秀的答案。尽量说明您的回答相对于已被接受的回答有什么更好或不同的地方! - Pascal Lamers

1

我想要指定Windows用户的情况 -

  1. 使用 set 命令设置当前终端会话的环境变量。

    set AWS_PROFILE=some_profile_name
    
  2. 使用 setx 命令设置即使终端关闭后也能保留的环境变量。

    setx AWS_PROFILE=some_profile_name
    
需要记住的一件事是,使用setx时,环境变量会在新的终端会话中设置。现有的会话将不会产生设置的环境变量值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接