Bash与AWS CLI - 无法定位凭据

62

我有一个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):

感谢您的任何帮助!
11个回答

67

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

例如,请确保您已执行sudo aws configure。并尝试

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

您可能更喜欢从脚本内部删除所有sudo,并仅对脚本本身使用sudo。


谢谢,你说得完全正确... 这是问题的根源(使用sudo运行脚本但指定普通用户的凭据)。谢谢。 - Smajl
在VS Code远程容器中遇到了这个问题:以root身份运行aws configure,但npm脚本执行aws codeartifact login无法访问~/.aws/credentials文件。指定containerUser有所帮助。 - alexanderdavide

39
无法定位凭证错误通常发生在使用不同的 AWS 配置文件时,当前终端无法识别当前配置文件的凭证。

请注意,您不需要每次通过 aws configure 填写所有凭证 - 您只需要引用已经配置好的相关配置文件即可。

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

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

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

~/.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

1
我完全同意使用导出方式。这是因为在某些脚本中,您无法每次都传递AWS配置文件。因此,最好使用导出AWS_PROFILE。 - Mohit Sharma
如果因为它不是 tty 设备而无法进行配置,该怎么办?例如,如何使用存储在环境变量中的凭据? - Peter Kionga-Kamau

24

即使您已经将凭据和配置文件正确地放置在~/.aws中,也可能无法被您的用户帐户所识别。

运行以下命令以查看是否设置了凭据:aws configure list

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


16

如果有人因问题标题而遇到此问题,我来回答一下。

我曾经遇到过AWS CLI报告“无法定位凭据”的问题。

我从我的凭据文件中删除了[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

我的问题类似。我在Rails中创建了一个rake任务,利用了一些bash命令,并从我的.aws/credentials文件中删除了[default]块。我之前一直在调用特定的配置文件,并且它一直在工作 - 所以我只是将那个配置文件中的凭据移动到了我重新添加的[default]下。 - Smitty
关键在于缺少“default”配置文件。我也删除了我的默认配置文件,这样我就不会意外地运行没有命名配置文件的命令了。 ‍♀️ - Metro Smurf

7

虽然这与原问题不一定相关,但我在谷歌搜索相关问题时遇到了这个问题,所以我会写下来以帮助其他人。我在特定用户上设置了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

2
一个生动的、警示性的故事,讲述了一个生锈的脚本编写者:
我在脚本中定义了变量HOME,作为构建平台的位置。这个变量覆盖了env变量,该变量定义了shell用户的$HOME。因此,AWS命令找不到~/.aws/credentials,因为~引用的是错误的位置。
我不想承认,但我希望它能帮助节省别人的时间。

2

今天在EC2上运行aws cli时遇到了这个错误。我的情况是当我运行aws configure list时可以获取凭据信息。然而,我在一个需要使用PROXY的企业环境中运行像aws kms decrypt这样的命令。一旦设置代理,aws凭据信息就会消失。

原始答案: "最初的回答"

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

原来我还需要设置NO_PROXY,并将ec2元数据地址添加到列表169.254.169.254中。此外,由于您应该通过s3端点进行访问,因此在no_proxy中通常也应该有.amazonaws.com。最初的回答。
export NO_PROXY=169.254.169.254,.amazonaws.com

1

我在尝试从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/)


1
如果您正在使用带有角色的.aws/config文件,请确保您的配置文件格式正确。在我的情况下,我忘记在arn前面放置role_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"
}

0
尝试在aws命令后添加sudo,例如sudo aws ec2 命令,并且正如meuh所提到的,需要使用sudo来配置awscli。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接