【问题标题】:Bash with AWS CLI - unable to locate credentials使用 AWS CLI 进行 Bash - 无法找到凭证
【发布时间】:2015-07-15 08:58:15
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: linux bash amazon-web-services aws-cli


    【解决方案1】:

    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 脚本本身。

    【讨论】:

    • 谢谢,你是绝对正确的......这是问题的根源(使用 sudo 运行脚本,但将凭据指定为普通用户)。谢谢
    • 在 VS Code 远程容器中遇到此问题:aws configure 以 root 身份运行,但执行 aws codeartifact login 的 npm 脚本无法访问 ~/.aws/credentials 文件。指定 containerUser 有帮助。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      我遇到了同样的问题,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
      

      【讨论】:

      • 我的问题类似。我在 Rails 中创建了一个使用一些 bash 命令的 rake 任务,并且我从我的 .aws/credentials 文件中删除了 [default] 块。我之前一直在调用一个特定的配置文件并且它正在工作 - 所以我只是将凭据从该配置文件中移到 [default] (我添加回来)下。
      • 这里的关键是缺少default 配置文件。我也删除了我的默认配置文件,因此我不会意外运行没有命名配置文件的命令。 ??‍♀️
      【解决方案4】:

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

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

      来自 AWS 文档中的 Named profiles section

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

      以下示例显示了一个包含两个配置文件的凭据文件。这 first [default] 在您运行没有配置文件的 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)后,您可以选择特定配置文件:

      aws ec2 describe-instances --profile user1
      

      或者导出到终端:

      $ export AWS_PROFILE=user1
      

      【讨论】:

      • 我完全同意导出的方式。其背后的原因是因为在某些脚本中您不能每次都传递 AWS 配置文件。因此,最好使用导出 AWS_PROFILE。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        今天在 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
        

        【讨论】:

          【解决方案7】:

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

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

          此变量覆盖了定义 shell 用户 $HOMEenv 变量。因此,AWS 命令​​找不到 ~/.aws/credentials,因为 ~ 引用了错误的位置。

          我不想承认,但我希望它可以帮助节省一些时间。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:
                  pip install --upgrade awscli
                  

                  pip3 install --upgrade awscli
                  

                  【讨论】:

                    猜你喜欢
                    • 2021-09-29
                    • 1970-01-01
                    • 2014-03-23
                    • 2019-06-01
                    • 2022-12-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-11-16
                    • 1970-01-01
                    相关资源
                    最近更新 更多