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

时间:2015-07-15 08:58:16

标签: bash aws-cli

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

感谢您的帮助!

10 个答案:

答案 0 :(得分:18)

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,并且只是自己编写脚本。

答案 1 :(得分:4)

这并不一定与原始问题相关,但我在搜索相关问题时遇到过这个问题,所以我会写一下,以防它可以帮助其他人。我为特定用户设置了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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

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

来自 AWS 文档中的 Named profiles section

<块引用>

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

以下示例显示了具有两个配置文件的凭据文件。这 当您运行没有配置文件的 CLI 命令时,将使用第一个 [默认]。 当您使用
--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)后,您可以选择特定配置文件:< /p>

aws ec2 describe-instances --profile user1

或者导出到终端:

$ export AWS_PROFILE=user1

答案 4 :(得分:1)

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

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

我从[default]文件中删除了credentials组凭据,因为我不使用它们,也不认为它们是不需要的。看来他们是。

然后我按如下所示重新整理了文件,它就起作用了...

[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

答案 5 :(得分:0)

生锈的脚本投石者的愚蠢而谨慎的尾巴:

我在脚本中将变量HOME定义为脚本应用于构建平台的位置。

此变量将覆盖定义外壳程序用户env的{​​{1}}变量。因此,AWS命令找不到$HOME,因为~/.aws/credentials引用了错误的位置。

我不愿意承认这一点,但我希望它可以帮助您节省一些时间。

答案 6 :(得分:0)

如果您正在使用具有角色的.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"
}

答案 7 :(得分:0)

今天在 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并将ec2保留的默认本地IP保留在列表169.254.169.254中。

export NO_PROXY=169.254.169.25

答案 8 :(得分:0)

我碰巧试图从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://...

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

答案 9 :(得分:0)

尝试使用sudo aws ec2 command之类的aws命令添加sudo,是的,因为meuh提到awscli需要使用sudo配置