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

Posted

技术标签:

【中文标题】如何在 AWS CLI 中覆盖环境变量并使用 AWS 凭证文件?【英文标题】:How to override the env variables and use the AWS credential file instead in AWS CLI? 【发布时间】:2016-05-12 00:56:03 【问题描述】:

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

$ aws ec2 describe-instances --profile saml

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

【问题讨论】:

【参考方案1】:

很遗憾,您不能指定凭证文件的优先级高于环境变量。

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

环境变量覆盖配置和凭据文件,可用于编写脚本或临时将命名配置文件设置为默认值。

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

用 export 命令覆盖环境变量(我认为这只是脚本范围内的临时命令) 将命令传递给 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 =

脚本终止后,我从命令行“回显 $REGION”,环境变量就很好了。

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

如果您将此应用到您的用例,您可以编写一个封装脚本,将环境变量清空(只需导出 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

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

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

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

【讨论】:

详细说明我的问题:我们使用为 AWS CLI 生成凭证的脚本,并且仅在一个小时内有效。所以我总是想使用这个(每次生成时都会覆盖)凭证文件,而不是环境变量。在这种情况下我需要做什么? 查看我修改后的答案......你总是可以删除环境变量(可能是最简单的)。 为什么不直接重置环境变量? 我以为 OP 不想永久删除它们,但建议这样做。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

OP 希望 CLI 使用凭证文件而不是环境变量,而不是使用不同的凭证文件。据推测,OP 希望保留环境变量并使用凭据。 请看我上面的评论(在布鲁克的回答中)。

以上是关于如何在 AWS CLI 中覆盖环境变量并使用 AWS 凭证文件?的主要内容,如果未能解决你的问题,请参考以下文章

AWS IAM-如何禁止用户通过控制台进行更改,但允许通过CLI更改API

AWS CLI实例ID在变量中

如何通过docker-compose在docker环境中使AWS CLI可用

如何在 AWS Beanstalk 环境中覆盖 nginx

如何在不使用 Vue CLI 的情况下覆盖 Vuetify 2 变量

如何在 AWS 中创建环境变量(空格)?