Boto3错误:botocore.exceptions.NoCredentialsError:无法找到凭据


112

当我简单地运行以下代码时,总是会出现此错误。

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

1
您可以通过boto3.set_stream_logger('botocore', level='DEBUG')在代码之前添加来发布调试输出吗?它将显示在哪里寻找凭证。
jamesls

似乎Boto会在凭证配置文件中查找很少的位置,但是由于某种原因显然不会在我的主目录中查找...
d -_- b

2
尝试将环境变量设置HOME,以点C:\Users\myname或设置AWS_SHARED_CREDENTIALS_FILE直接指向您的证书文件。
garnaat 2015年

我按照您的描述设置了环境变量HOME,但是现在出现以下错误。 botocore.exceptions.NoRegionError: You must specify a region. *我的配置文件↓与我的credentails位于同一文件夹中。 [default] ap-northeast-1
d -_- b

1
我可以用garnaat的评论来解决问题。
LaundroMat

Answers:


94

尝试手动指定键

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

确保出于安全方面的考虑,不要在代码中直接包含ACCESS_ID和ACCESS_KEY。考虑使用环境配置,并将其注入@Tiger_Mike建议的代码中。

对于Prod环境,请考虑使用旋转访问密钥:https : //docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


直接在Django上处理时,这种方法很有用。谢谢。
Joepreludian

1
这是更加危险的,因为您将机密放入代码中,这可能最终会导致版本控制。
nu珠穆朗玛峰'18

4
@nueverest这是正确的,但是您可以通过将声明移到设置文件然后通过环境变量进行注入来避免这种情况。
Tiger_Mike

尽管这可行,但我会说它没有遵循最佳实践。
ben jarman

1
谢谢。这可以用作开发人员设置中的临时修复程序。从.env文件(未提交)中加载这些变量将是理想的选择,并且比必须从~/.aws/文件夹中选择更好。
SuperNova '18

56

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

它可以处理包含以下内容的文件:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

请注意,配置文件名称必须为“ [default]”。一些官方文档引用了名为“ [credentials]” 的配置文件,该配置文件对我不起作用。


1
也可以在Windows上使用(C:\ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D

4
您可以使用session = boto3.Session(profile_name = <您的配置文件>)指定要在boto3中使用的配置文件
Mattia Paterna

aws configure如果您已安装aws-cli,则使用也可以使用
radtek

2
我是通过ansible运行它的,所以要寻找的另一件事是,如果您在运行命令时成为另一个用户。确保您没有使用“ sudo”作为示例,否则它将尝试访问根aws凭据,如果不存在则失败。
radtek

28

如果您正在寻找另一种方法,请尝试使用AmazonCLI添加您的凭证

从终端类型:

aws configure

然后填写您的按键和区域。


17

确保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通常被放置在~/.aws/config一个[profile MyProfile1]段。如果在credentials文件中指定,则它可能不起作用。
cjs

@Curt J. Sampson未经检查,我确定您是正确的。感谢您的更正。
TheWalkingData '19

我确实导出了AWS_PROFILE = myprofle,它没有用,但是可以用。为什么会发生这种情况的任何解释。
Adarsh Trivedi

5

这些说明适用于具有AWS单个用户配置文件的Windows计算机。确保您的~/.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服务器,并且它对我有用,但是我认为重新启动将是一个好主意。
Hrushikesh Dhumal

5

我也有同样的问题,可以通过在主目录中创建配置和凭据文件来解决。下面显示了我为解决此问题所做的步骤。

创建一个配置文件:

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)

您还可以参考以下链接:


4

从终端类型:

aws configure

然后填写您的按键和区域。

之后,请执行任何步骤。您可以根据自己的帐户使用多个键。可以管理多个环境或密钥

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

2

我在一家大公司工作,遇到了同样的错误,但是需要另一种解决方法。我的问题与代理设置有关。我已经设置了代理,因此需要先将no_proxy设置为将AWS列入白名单,然后才能使所有功能正常工作。如果不想使用os设置混淆Python代码,也可以在bash脚本中进行设置。

蟒蛇:

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

重击:

export no_proxy = "s3.amazonaws.com"

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


2
我遇到了类似的问题-但不得不说no_proxy169.254.169.254以便AWS客户端可以使用元数据服务来查找实例配置文件。
拉尔夫·博尔顿

0

boto3正在以下文件夹中寻找凭证

C:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\botocore\.aws

您应该在此文件夹中保存两个文件,credentials然后config

您可能需要检查boto3在此链接中搜索凭据的一般顺序。在“ 配置凭据”子标题下查看。



0

如果您有多个AWS个人资料~/.aws/credentials例如...

[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************

请遵循两个步骤:

  1. export AWS_DEFAULT_PROFILE=Profile 1在终端中使用命令将您要用作默认值的一个。

  2. 确保在使用boto3或打开编辑器的同一终端上运行上述命令。[了解以下情况]

场景:

  • 如果您有两个终端打开,则称为t1t2
  • 然后在中运行export命令,t1然后从中打开JupyterLab或其他任何文件t2,您将收到NoCredentialsError:无法找到凭据错误。

解:

  • 在中运行export命令,t1然后从同一终端打开JupyterLab或任何其他终端t1

0

使用您的凭据创建一个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)

从OS环境中获取凭证始终是一件好事

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.