关于amazon Web服务:如何覆盖env变量并在AWS CLI中使用AWS凭证文件?

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

当使用aws cli时,是否可以指定它使用凭证文件而不是存储在env变量中的值?

$ 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 variables override configuration and credential files and can be useful for scripting or temporarily setting a named profile as the default.

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

  • 使用export命令覆盖环境变量(我认为这只是脚本范围内的临时变量)
  • 将命令传递给aws cli
  • 完成后,包装器脚本将终止,环境变量应该回到原来的样子(我认为)

我用下面的(非常基本的)bash脚本测试了这一点。我有一个名为$region的环境变量。考虑下面的shell脚本"script.sh"。

1
2
3
#!/bin/bash
export REGION=""
echo"REGION ="$REGION

在调用脚本之前,我将"echo$region"证明它确实存在:

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

然后我调用脚本,该脚本将变量空出来,echo's it显示它现在是空的。

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

一旦脚本终止,我将从命令行中"echo$region",环境变量将非常好。

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

如果将此应用于用例,则可以编写一个包装脚本,将环境变量(只需导出aws_access_key_id=")空出来,并将所有命令行选项传递给aws cli。当CLI执行时,它将看不到环境变量,因为它们已经在其执行范围内被空了。

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

但是,我敢肯定如果你再问一个问题,有人会帮你的!

另一种选择是,如果您不使用环境变量,只需删除它们即可。

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

1
2
3
4
5
6
7
8
9
10
11
#!/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.htmlbash:将命令行参数转换为数组https://linuxconfig.org/bash-script-how-to-check-number-of-supplied-command-line-arguments检查传递给bash脚本的参数数量


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

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

由于变量将变为未设置状态,因此aws将使用您的凭证文件。


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

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