如何覆盖 env 变量并在 AWS CLI 中使用 AWS 凭证文件?

How to override the env variables and use the AWS credential file instead in AWS CLI?

使用 AWS CLI 时,有没有一种方法可以指定它使用凭证文件而不是环境变量中存储的值?

$ aws ec2 describe-instances --profile saml

saml 是存储在 ~/.aws/credentials 中的凭据文件中的配置文件名称。我希望 AWS CLI 默认使用此凭证文件,而不使用存储在 env 变量中的凭证文件。我该怎么做?

遗憾的是,您无法指定凭据文件优先于环境变量。

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment

Environment variables override configuration and credential files and can be useful for scripting or temporarily setting a named profile as the default.

构建另一个答案中提到的内容,您可以编写一个包装脚本,它将:

  • 用导出命令覆盖环境变量(我认为这只是脚本范围内的临时变量)
  • 将命令传递给 aws CLI
  • 完成后,包装脚本将终止,环境变量应该恢复原样(我认为)

我用下面的(非常基本的)bash 脚本对此进行了测试。我有一个名为 $REGION 的环境变量。考虑以下名为 "script.sh".

的 shell 脚本
#!/bin/bash
export REGION=""
echo "REGION = "$REGION

在调用脚本之前,我'echo $REGION'证明它确实存在:

ubuntu@ip-172-31-24-61:~$ echo $REGION
us-east-1

然后我调用脚本,该脚本清空变量并回显它显示它现在是空的。

ubuntu@ip-172-31-24-61:~$ ./script.sh
REGION =

脚本终止后,我从命令行 'echo $REGION' 并且环境变量完全没问题。

ubuntu@ip-172-31-24-61:~$ echo $REGION
us-east-1

如果将此应用于您的用例,您可以编写一个包装器脚本来清空环境变量(只需导出 AWS_ACCESS_KEY_ID=""),将所有命令行选项传递给AWS命令行界面。当 CLI 执行时,它不会看到环境变量,因为它们已在其执行范围内被清零。

我不知道该怎么做的一件事是让 bash 脚本获取所有未知数量的命令行参数并将它们全部传递给另一个命令。我不认为这很难,我只是不知道该怎么做。

但是,我敢肯定,如果您提出另一个问题,有人可以提供帮助!

另一种方法是,如果您永远不会使用它们,只需删除环境变量。

编辑 2 我已经找到了如何制作一个非常简单的包装脚本来解决您的问题。在您实施此之前,我强烈建议您查看以下链接,以更好地了解其工作原理以及可以使用哪些其他方法来实现此目的。例如,您可以使用 $@ 和 $* 来执行此操作,这可能是更普遍接受的方式。

#!/bin/bash

params=""
export AWS_ACCESS_KEY_ID=""
export AWS_SECRET_ACCESS_KEY=""

for arg; do
        params="$params $arg"
done

aws $params

两个'export'链接使环境变量无效。同样,环境变量只会在此包装脚本的生命周期内被清空,因为它是在脚本范围内而不是全局范围内完成的。

然后,for 循环遍历您用于 运行 脚本的所有命令行参数,将它们附加到一个字符串变量,然后调用 'aws'命令行参数。

http://tldp.org/LDP/abs/html/wrapper.html
Bash: convert command line arguments into array
https://linuxconfig.org/bash-script-how-to-check-number-of-supplied-command-line-arguments
Check number of arguments passed to a Bash script

aws命令行不支持指定不同的配置文件。

你可以做的是制作一个包装器,然后在 运行 aws 命令之前写入文件 ~/.aws/credentials,然后删除凭证文件

您可以使用 env 临时取消设置变量:

env --unset=AWS_ACCESS_KEY_ID --unset=AWS_SECRET_ACCESS_KEY aws ec2 describe-instances --profile saml

由于变量将变为未设置,aws 将改用您的凭据文件。