繁体   English   中英

Bash 与 AWS CLI - 无法找到凭证

[英]Bash with AWS CLI - unable to locate credentials

我有一个 shell 脚本,它应该从 S3 下载一些文件并安装一个 ebs 驱动器。 但是,我总是以“无法找到凭据”结束。

我已经使用aws configure命令指定了我的凭据,这些命令在 shell 脚本之外运行。 有人可以告诉我(最好是详细的)如何让它工作吗?

这是我的脚本

#!/bin/bash

AWS_CONFIG_FILE="~/.aws/config"

echo $1

sudo mkfs -t ext4 $1
sudo mkdir /s3-backup-test
sudo chmod -R ugo+rw /s3-backup-test
sudo mount $1 /s3-backup-test

sudo aws s3 sync s3://backup-test-s3 /s3-backup/test

du -h /s3-backup-test
ipt (short version):

谢谢你的帮助!

sudo会将$HOME目录(因此~ )更改为 /root,并从环境中删除大多数 bash 变量,如 AWS_CONFIG_FILE。 确保您以 root 或您的用户身份使用 aws 执行所有操作,不要混用。

确保你做了sudo aws configure例如。 并尝试

sudo bash -c 'AWS_CONFIG_FILE=/root/.aws/config aws s3 sync s3://backup-test-s3 /s3-backup/test'

您可能更喜欢从脚本内部删除所有 sudo,而只对脚本本身进行 sudo。

虽然您的凭据和配置文件可能正确位于 ~/.aws 中,但您的用户帐户可能无法获取它。

运行此命令以查看您的凭据是否已设置: aws configure list

要设置凭据,请运行以下命令: aws configure ,然后输入在 ~/.aws/credentials 文件中指定的凭据。

回答以防有人根据问题的标题偶然发现此问题。

我遇到了同样的问题,AWS CLI 报告unable to locate credentials

我已经从我的credentials文件中删除了[default]凭据集,因为我没有使用它们并且认为不需要它们。 似乎他们是。

然后我按如下方式修改了我的文件并且它起作用了......

[default]
aws_access_key_id=****
aws_secret_access_key=****
region=eu-west-2

[deployment-profile]
aws_access_key_id=****
aws_secret_access_key=****
region=eu-west-2

这不一定与原始问题有关,但我在谷歌搜索相关问题时遇到了这个问题,所以我将把它写下来,以防它可以帮助其他人。 我在特定用户上设置了aws ,并使用sudo -H -u thatuser aws ...进行了测试,但它不适用于安装在 Ubuntu 14.04 上的 awscli 1.2.9:

  % sudo -H -u thatuser aws configure list
        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile                <not set>             None    None
  access_key                <not set>             None    None
  secret_key                <not set>             None    None
      region                us-east-1      config_file    ~/.aws/config

我不得不使用pip install awscli升级它,它带来了较新版本的 awscli (1.11.93)、boto 和无数其他东西(awscli docutils botocore rsa s3transfer jmespath python-dateutil pyasn1 futures),但它导致了一些事情开始正常工作:

  % sudo -H -u thatuser aws configure list
        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile                <not set>             None    None
  access_key     ****************WXYZ shared-credentials-file
  secret_key     ****************wxyz shared-credentials-file
      region                us-east-1      config-file    ~/.aws/config

unable to locate credentials错误通常在使用不同的 aws 配置文件时发生,并且当前终端无法识别当前配置文件的凭据。

请注意,您不需要每次都通过aws configure填写所有凭据 - 您只需要引用一次配置的相关配置文件。

从 AWS 文档中的命名配置文件部分

AWS CLI 支持使用存储在配置和凭证文件中的多个命名配置文件中的任何一个。 您可以使用带有--profile选项的 aws configure 或通过向配置和凭据文件添加条目来配置其他配置文件。

以下示例显示了具有两个配置文件的凭据文件。 当您运行没有配置文件的 CLI 命令时,将使用第一个 [默认]。 当您运行 CLI 命令时使用第二个
--profile user1参数。

~/.aws/credentials (Linux & Mac) 或%USERPROFILE%\\.aws\\credentials (Windows):

 [default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY [user1] aws_access_key_id=AKIAI44QH8DHBEXAMPLE aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

因此,在通过aws configure或直接在~/.aws/credentials文件中设置特定命名配置文件(上例中的user1 )后,您可以选择特定配置文件:

aws ec2 describe-instances --profile user1

或将其导出到终端:

$ export AWS_PROFILE=user1

今天在EC2上运行 aws cli 时遇到了这个错误。 我的情况是我可以在运行aws configure list时获取凭据信息。 但是,我在公司环境中运行,该环境执行aws kms decrypt需要PROXY 一旦我设置了代理,aws 凭据信息就会消失。

export HTTP_PROXY=aws-proxy-qa.cloud.myCompany.com:8099
export HTTPS_PROXY=aws-proxy-qa.cloud.myCompany.com:8099

结果我还必须设置NO_PROXY并在列表169.254.169.254有 ec2 元数据地址。 此外,由于您应该通过 s3 端点,因此您通常也.amazonaws.com在 no_proxy 中包含.amazonaws.com

export NO_PROXY=169.254.169.254,.amazonaws.com

一个生锈的脚本甩尾者的愚蠢而谨慎的尾巴:

我在我的脚本中定义了变量 HOME 作为脚本应该去构建平台的地方。

这个变量覆盖了env VAR定义shell用户$HOME 所以 AWS 命令​​找不到~/.aws/credentials因为~引用了错误的地方。

我不想承认这一点,但我希望它有助于节省一些时间。

如果您使用带有角色的.aws/config文件,请确保您的配置文件格式正确。 就我而言,我忘记将role_arn =放在 arn 前面。 默认配置文件位于.aws/credentials文件中,包含 iam 身份的访问密钥 ID 和秘密访问密钥。

配置文件包含角色详细信息:

[profile myrole]
role_arn = arn:aws:iam::123456789012:role/My-Role
source_profile = default
mfa_serial = arn:aws:iam::987654321098:mfa/my-iam-identity
region=ap-southeast-2

您可以通过调用快速测试访问

aws sts get-caller-identity --profile myrole

如果您像我一样启用了 MFA,则需要在出现提示时输入它。

Enter MFA code for arn:aws:iam::987654321098:mfa/my-iam-identity:
{
    "UserId": "ARABCDEFGHIJKLMNOPQRST:botocore-session-15441234567",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/My-Role/botocore-session-15441234567"
}

我在尝试从 root cron 运行 aws-cli 命令时遇到了这个问题。

由于凭据存储在 $HOME/.aws/credentials 中,并且我通过sudo初始化了 aws-cli,因此 $HOME 仍然是 /home/user/。 从 cron 运行时,$HOME 是 /root/,因此 cron 找不到该文件。

解决方法是为特定的 cron 作业更改 $HOME。 例子:

00 12 * * * HOME=/home/user aws s3 sync s3://...

(替代方法包括将 .aws 目录从 /home/user/ 移动、复制或符号链接到 /root/)

尝试使用像sudo aws ec2 command命令这样的 aws 命令添加 sudo,是的,正如meuh提到的,需要使用 sudo 配置 awscli

pip install --upgrade awscli

或者

pip3 install --upgrade awscli

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM