Bash 使用 AWS CLI - 无法找到凭据

Bash with AWS CLI - unable to locate credentials

我有一个 shell 脚本,它应该从 S3 下载一些文件并安装一个 ebs 驱动器。但是,我总是以 "Unable to locate credentials".

结尾

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

这是我的脚本

#!/bin/bash

AWS_CONFIG_FILE="~/.aws/config"

echo 

sudo mkfs -t ext4 
sudo mkdir /s3-backup-test
sudo chmod -R ugo+rw /s3-backup-test
sudo mount  /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,并使用 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 期货),但它导致事情开始正常工作:

  % 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

虽然您的凭据和配置文件可能正确位于 ~/.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

一个生锈的脚本投石器的愚蠢和警告的尾巴:

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

此变量覆盖了定义 shell 用户 $HOMEenv 变量。所以 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"
}

今天 运行 在 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 端点,因此您通常也应该在 no_proxy 中包含 .amazonaws.com

export NO_PROXY=169.254.169.254,.amazonaws.com

我 运行 进入此尝试 运行 来自 roots 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 提到的 awscli 需要使用 sudo

配置

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

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

来自 AWS 文档中的 Named profiles section

The AWS CLI supports using any of multiple named profiles that are stored in the config and credentials files. You can configure additional profiles by using aws configure with the --profile option, or by adding entries to the config and credentials files.

The following example shows a credentials file with two profiles. The first [default] is used when you run a CLI command with no profile. The second is used when you run a CLI command with the
--profile user1 parameter.

~/.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)后,您可以 select具体简介:

aws ec2 describe-instances --profile user1

或者导出到终端:

$ export AWS_PROFILE=user1
pip install --upgrade awscli

pip3 install --upgrade awscli