有没有办法将AWS CLI配置文件导出到环境变量?

时间:2016-11-28 19:42:56

标签: amazon-web-services aws-cli

使用某些第三方工具(如Terraform)时,指定AWS CLI配置文件并不容易,我更喜欢使用环境变量而不是配置文件。

让我有一种方法让AWS CLI只将当前配置文件导出为AWS_ACCESS_KEY_IDAWS_SECRET_KEY环境变量到我的会话中吗?

7 个答案:

答案 0 :(得分:25)

您可以使用以下命令设置环境变量

aws configure get default.aws_access_key_id
aws configure get default.aws_secret_access_key

如果您有其他个人资料可以更改,另一种写作方式是

aws configure get aws_access_key_id --profile <new_profile>
aws configure get aws_secret_access_key --profile <new_profile>

所以例如它将是

export TF_VAR_access_key=`aws configure get default.aws_access_key_id`

答案 1 :(得分:6)

以前没办法,but there is now.

我写了一个脚本来完成这个,aws-env

usage: aws-env [-h] [-n] profile

Extract AWS credentials for a given profile as environment variables.

positional arguments:
  profile          The profile in ~/.aws/credentials to extract credentials
                   for.

optional arguments:
  -h, --help       show this help message and exit
  -n, --no-export  Do not use export on the variables.

如果您信任该程序的输出,则可以在shell会话中使用它来导出给定配置文件的变量:

$ aws-env profile-name
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
$ aws-env -n profile-name
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...

要将变量导出到当前环境变量中,请将输出作为命令执行(再次,在查看源代码后再执行;):

$ echo $AWS_ACCESS_KEY_ID

$ $(aws-env profile-name)
$ echo $AWS_ACCESS_KEY_ID
AKJHC...

答案 2 :(得分:5)

基于弗雷德里克(Frederic)的想法,对于sts扮演角色的情况,我得出了如下可行的shell脚本:

aws-env.sh:

#!/bin/bash
export AWS_ACCESS_KEY_ID=$(aws configure get default.aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get default.aws_secret_access_key)
export AWS_SESSION_TOKEN=$(aws configure get default.aws_session_token)

echo AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
echo AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
echo AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

bash -i

希望这会有所帮助。

答案 3 :(得分:3)

在Terraform中

Terraform实际上直接支持AWS CLI配置文件:只需在profile提供程序块中设置适当的aws属性。

类似这样的事情应该可以解决:

provider "aws" {
  profile = "my_profile"
}

环境变量

如果您不得不使用环境变量,那么可以使用Frederic的建议:

export AWS_ACCESS_KEY_ID=$(aws configure get my_profile.aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get my_profile.aws_secret_access_key)

如果要将环境变量传递给脚本,请使用:

AWS_ACCESS_KEY_ID=$(aws configure get my_profile.aws_access_key_id) \
AWS_SECRET_ACCESS_KEY=$(aws configure get my_profile.aws_secret_access_key) \
./script.sh

具有“承担角色”的环境变量

如果您使用配置文件来承担在配置字段role_arn中指定的角色,那么随着凭据的生成(在一段时间后过期),事情会变得有些棘手。

但这仍然可行:

read AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN <<< \
$(aws sts assume-role --role-arn $(aws configure get my_profile.role_arn) \
--role-session-name my_profile_session --output text | \
grep -e "^CREDENTIALS" | awk '{ print $2, $4, $5 }')

答案 4 :(得分:1)

我喜欢Kay关于导出所需配置文件的脚本的想法,所以我也写了一个:

Foo

只需将其放入文件中,然后从shell中获取(。)它。

答案 5 :(得分:1)

这些都不允许在配置文件中使用角色假设(我大量使用)。我在python3中创建了以下非常短的脚本,它使用boto3来完成角色假设等的繁重工作。这可能会有所帮助。

#!/usr/bin/env python3

# export the AWS environment for a given profile

import boto3
import argparse

parser = argparse.ArgumentParser(prog="exportaws",
    description="Extract AWS credentials for a profile as env variables.")
parser.add_argument("profile", help="profile name in ~/.aws/config.")
args = parser.parse_args()
creds = boto3.session.Session(profile_name=args.profile).get_credentials()
print(f'export AWS_ACCESS_KEY={creds.access_key}')
print(f'export AWS_SECRET_ACCESS_KEY={creds.secret_key}')
print(f'export AWS_SESSION_TOKEN={creds.token}')

答案 6 :(得分:1)

对于Zsh:

function aws-env {
    emulate -LR zsh
    profile=${1:-default}
    if [[ ${profile} == clear ]]; then
        unset AWS_ACCESS_KEY_ID
        unset AWS_SECRET_ACCESS_KEY
        unset AWS_SESSION_TOKEN
        unset AWS_SECRET_KEY
    else
        AWS_ACCESS_KEY_ID="$(aws configure get aws_access_key_id --profile ${profile})" || return 1
        AWS_SECRET_ACCESS_KEY="$(aws configure get aws_secret_access_key --profile ${profile})" || return 1
        AWS_SESSION_TOKEN="$(aws configure get aws_session_token --profile ${profile})" || return 1
        AWS_SECRET_KEY=${AWS_SECRET_ACCESS_KEY}
        export AWS_ACCESS_KEY_ID
        export AWS_SECRET_ACCESS_KEY
        export AWS_SESSION_TOKEN
        export AWS_SECRET_KEY
        env | grep AWS_ | sort
    fi
}