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 用户 $HOME
的 env
变量。所以 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
我有一个 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 用户 $HOME
的 env
变量。所以 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