Boto3错误:botocore.exceptions.NoCredentialsError:无法定位凭据

223
当我运行以下代码时,总是会得到这个错误。
s3 = boto3.resource('s3')
bucket_name = "python-sdk-sample-%s" % uuid.uuid4()
print("Creating new bucket with name:", bucket_name)
s3.create_bucket(Bucket=bucket_name)

我已经将我的凭据文件保存在

C:\Users\myname\.aws\credentials,Boto应该从这里读取我的凭据。

我的设置有问题吗?

下面是boto3.set_stream_logger('botocore', level='DEBUG')的输出。

2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Skipping environment variable credential check because profile name was explicitly set.
2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Looking for credentials via: env
2015-10-24 14:22:28,773 botocore.credentials [DEBUG] Looking for credentials via: shared-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: config-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: ec2-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: boto-config
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: iam-role

5
你能否在你的代码之前添加 boto3.set_stream_logger('botocore', level='DEBUG') 并输出调试信息?这将显示它正在寻找凭据的位置。 - jamesls
3
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - garnaat
1
我按照你的描述设置了环境变量HOME,但现在出现以下错误。 botocore.exceptions.NoRegionError: You must specify a region.*我的配置文件↓与我的凭据位于同一文件夹中。 [default] ap-northeast-1 - d-_-b
1
我使用garnaat的评论成功修复了这个问题。 - Mathieu Dhondt
也要注意,如果您使用Amazon的客户端输入凭据,它似乎只适用于您当时使用的用户。如果您以root身份运行脚本,但您没有将凭据保存为root,它将无法找到它们。 - Andrew
显示剩余2条评论
18个回答

172

4
由于您将秘密信息放在您的代码中,可能会被存储在版本控制中,因此这更加危险。 - nu everest
8
这是正确的,但您可以通过将声明移到设置文件中,然后通过环境变量注入来避免这种情况。 - Tiger_Mike
1
虽然这个方法可行,但我认为它违反了最佳实践。 - ben jarman
1
谢谢。这可以用作开发设置中的临时修复。从 .env 文件(未提交)加载这些变量将是理想的,比从 ~/.aws/ 文件夹中选择要好。 - SuperNova
有人能解释一下为什么将access_id和access_key保存在.env文件中比保存在~/.aws文件夹中更好吗?(来自boto3文档) - haneulkim
显示剩余2条评论

114

我也遇到了同样的问题,并发现我的~/.aws/credentials文件格式有误。

以下是可行的文件内容:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

请注意,必须有一个配置文件名为 "[default]"。一些官方文档提到了一个名为 "[credentials]" 的配置文件,但对我来说并没有起作用。


4
也适用于Windows操作系统(路径为C:\Users\User.aws\credentials)。 - Mr_and_Mrs_D
7
您可以使用 session = boto3.Session(profile_name=<your_profile>) 来指定在 boto3 中使用哪个配置文件。 - Mattia Paterna
1
如果您已经安装了aws-cli,使用aws configure也可以。 - radtek
3
我是通过ansible运行它的,所以需要注意的另一件事情是,在运行命令时是否切换了不同的用户。确保你没有使用'sudo'来运行它,否则它将尝试访问root的aws凭证,如果不存在就会失败。 - radtek
3
你不需要默认配置文件,可以将环境变量AWS_PROFILE设置为任何你想要的配置文件(例如_credentials)export AWS_PROFILE=credentials,当你执行代码时,它会检查AWS_PROFILE的值,然后从.aws\credentials文件中获取相应的凭证(在这个例子中,它会搜索_credentials配置文件)。 - Ichigo
是的,我的朋友 :) 你救了我。 - Arar

43
如果您正在寻找替代方法,请尝试使用AmazonCLI添加您的凭据。
从终端键入:
aws configure

然后填写您的密钥和地区。


36

确保您的Unix下的~/.aws/credentials文件如下所示:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

你的Python脚本应该像这样,并且它会正常工作:

from __future__ import print_function
import boto3
import os

os.environ['AWS_PROFILE'] = "MyProfile1"
os.environ['AWS_DEFAULT_REGION'] = "us-east-1"

ec2 = boto3.client('ec2')

# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
print('Regions:', response['Regions'])

来源: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration

.


1
output = json 通常放置在 [profile MyProfile1] 部分的 ~/.aws/config 文件中。如果在 credentials 文件中指定,可能无法正常工作。 - cjs
@Curt J. Sampson 没有检查,我相信你是对的。感谢更正。 - TheWalkingData
我曾经导出了 AWS_PROFILE=myprofile,但它没有起作用,但这个方法可以。为什么会发生这种情况,请问有什么解释吗? - Adarsh Trivedi

15

我也遇到了同样的问题,可以通过在主目录中创建配置文件和凭据文件来解决。以下是我解决此问题所执行的步骤。

创建配置文件:

touch ~/.aws/config

然后在那个文件中,我输入了该地区的信息。

[default]
region = us-west-2

然后创建凭据文件:

touch ~/.aws/credentials

然后输入您的凭据

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

完成上述设置后,运行我的Python文件以连接存储桶。运行此文件将列出所有内容。

import boto3
import os

os.environ['AWS_PROFILE'] = "Profile1"
os.environ['AWS_DEFAULT_REGION'] = "us-west-2"

s3 = boto3.client('s3', region_name='us-west-2')
print("[INFO:] Connecting to cloud")

# Retrieves all regions/endpoints that work with S3

response = s3.list_buckets()
print('Regions:', response)

您还可以参考以下链接:


13
使用您的凭证创建一个S3客户端对象。
AWS_S3_CREDS = {
    "aws_access_key_id":"your access key", # os.getenv("AWS_ACCESS_KEY")
    "aws_secret_access_key":"your aws secret key" # os.getenv("AWS_SECRET_KEY")
}
s3_client = boto3.client('s3',**AWS_S3_CREDS)

从操作系统环境中获取凭证始终是件好事。

要设置环境变量,请在终端中运行以下命令。

如果是Linux或Mac:

$ export AWS_ACCESS_KEY="aws_access_key"
$ export AWS_SECRET_KEY="aws_secret_key"

如果是Windows操作系统

c:System\> set AWS_ACCESS_KEY="aws_access_key"
c:System\> set AWS_SECRET_KEY="aws_secret_key"

1
您需要添加会话令牌和区域信息。 - Jason Li

13

从终端输入以下命令:

aws configure

然后填写你的密钥和地区。

完成上述步骤后,可以在任何环境中使用。您可以根据账户设置多个密钥,并管理多个环境或密钥。

import boto3
aws_session = boto3.Session(profile_name="prod")
# Create an S3 client
s3 = aws_session.client('s3')

11

导出凭据也是可行的,在Linux中:

export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX"
export AWS_ACCESS_KEY_ID="XXXXXXXXXXX"

6

我在一家大公司工作,遇到了相同的错误,但需要另一种解决方法。我的问题与代理设置有关。我将代理设置为需要在 AWS 白名单中设置 no_proxy 才能让一切正常运行。如果您不想用操作系统设置来混淆您的 Python 代码,您也可以在 bash 脚本中设置它。

Python:

import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"

Bash:

export no_proxy = "s3.amazonaws.com"

编辑:以上假设您使用的是美国东部的S3区域。对于其他地区,请使用s3.[region].amazonaws.com,其中region类似于us-east-1或us-west-2。

2
我曾经遇到过类似的问题 - 但是必须在 no_proxy 中添加 169.254.169.254,以便 AWS 客户端可以访问元数据服务并查找实例配置文件。 - Ralph Bolton
实际上,当您运行本地设置(DynamoDB)并尝试连接时,这是有效的。在未部署的OFFLINE模式下运行时,我遇到了错误。 - Milind Deore

6
这些指令适用于只有一个用户档案的Windows计算机,需要使用AWS。请确保您的~/.aws/credentials文件看起来像这样:
[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

我需要设置环境变量AWS_DEFAULT_PROFILE为在您的凭据中找到的profile_name,然后我的Python就能够连接了。例如,可以从这里获取更多信息。

import boto3

# Let's use Amazon S3
s3 = boto3.resource('s3')

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)

1
如果你在机器部分设置了Win10的环境变量,你可能需要重新启动。 - Trevor
1
@Trevor,我在一台安装了Jupyter笔记本的Windows 7机器上进行了测试,我不得不重新启动Jupyter服务器,然后它就可以正常工作了,但我认为重新启动电脑可能是个好主意。 - hru_d

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