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

Pra*_*lur 5 amazon-ec2 amazon-web-services aws-cli

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

$ aws ec2 describe-instances --profile saml

saml是存储在 ~/.aws/credentials 中的凭证文件内的配置文件名称。我希望 AWS CLI 默认使用此凭证文件,而不是使用存储在 env 变量中的凭证文件。我怎样才能做到这一点?

Bro*_*oks 2

不幸的是,您无法指定凭证文件相对于环境变量的优先级。

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

环境变量会覆盖配置和凭证文件,对于编写脚本或临时将命名配置文件设置为默认值非常有用。

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

  • 使用导出命令覆盖环境变量(我认为这仅在脚本范围内是临时的)
  • 将命令传递到 aws CLI
  • 一旦完成,包装器脚本将终止,环境变量应该恢复到原来的样子(我认为)

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

#!/bin/bash
export REGION=""
echo "REGION = "$REGION
Run Code Online (Sandbox Code Playgroud)

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

ubuntu@ip-172-31-24-61:~$ echo $REGION
us-east-1
Run Code Online (Sandbox Code Playgroud)

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

ubuntu@ip-172-31-24-61:~$ ./script.sh
REGION =
Run Code Online (Sandbox Code Playgroud)

脚本终止后,我从命令行“echo $REGION”,并且环境变量完全正常。

ubuntu@ip-172-31-24-61:~$ echo $REGION
us-east-1
Run Code Online (Sandbox Code Playgroud)

如果将此应用到您的使用案例,您可以编写一个包装器脚本来清空环境变量(只需导出 AWS_ACCESS_KEY_ID=""),将所有命令行选项传递到 AWS CLI。当 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
Run Code Online (Sandbox Code Playgroud)

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

然后,for 循环循环遍历用于运行脚本的所有命令行参数,将它们附加到字符串变量,然后使用包含所有命令行参数的字符串调用“aws”。

http://tldp.org/LDP/abs/html/wrapper.html
Bash:将命令行参数转换为数组
https://linuxconfig.org/bash-script-how-to-check-number-of-supplied-command -line-arguments
检查传递给 Bash 脚本的参数数量

  • 查看我修改后的答案...您总是可以删除环境变量(可能是最简单的)。 (2认同)