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

当我简单地运行下面的代码时,我总是得到这个错误。

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
339980 次浏览

如果您正在寻找另一种方法,请尝试使用 AmazonCLI < / p >

终端类型:-

aws configure

然后填写密钥和区域。

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

它处理了一个包含以下内容的文件:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

注意,必须有一个配置文件名称"[default]"。一些官方文件提到了一个名为“__abc1”的配置文件,但这对我不起作用。

尝试手动指定键

    s3 = boto3.resource('s3',
aws_access_key_id=ACCESS_ID,
aws_secret_access_key= ACCESS_KEY)
为了安全考虑,确保你没有在代码中直接包含你的ACCESS_IDACCESS_KEY。 考虑使用环境配置,并按照@Tiger_Mike的建议将它们注入到代码中 对于Prod环境,考虑使用旋转访问键: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey < / p >

确保你的~/。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

这些指令适用于具有AWS单一用户配置文件的windows机器。确保你的~/.aws/credentials文件看起来像这样

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

我必须将__abc0环境变量设置为在您的凭证中找到的profile_name 然后我的蟒蛇就能连接了。from 在这里

import boto3


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


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

我在一家大公司工作,遇到过同样的错误,但我需要一个不同的工作方式。我的问题与代理设置有关。我已经设置了代理,所以在我能够让一切正常工作之前,我需要将我的no_proxy设置为AWS白名单。你也可以在bash脚本中设置它,如果你不想用操作系统设置混淆你的Python代码。

Python:

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

Bash:

export no_proxy = "s3.amazonaws.com"

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

boto3在文件夹中查找凭据,例如

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

你应该在这个文件夹中保存两个文件credentialsconfig

你可能想要查看boto3在这个链接中搜索凭据的一般顺序。在配置的凭证子标题下查看。

如果你确定你正确配置了你的aws,只要确保项目的用户可以从/ aws。中读取或者只是作为根用户运行你的项目

如果你在~/.aws/credentials中有多个aws配置文件,比如……

[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
  • 你在t1中运行export命令,然后从t2中打开JupyterLab或任何其他命令,你会得到NoCredentialsError:无法定位凭证错误。

解决方案:

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

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

创建一个配置文件:

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)

你也可以参考以下链接:

终端类型:-

aws configure

然后填写密钥和区域。

这之后做下一步使用任何环境。你可以有多个钥匙,这取决于你的帐户。能否管理多个环境或密钥

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

使用凭证创建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环境中获取凭证总是好的

在终端中执行以下命令设置环境变量

如果是Linux或MAC

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

如果窗户

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

导出证书也可以,在linux:

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

我只是遇到了这个问题。这对我来说很管用:

pip install botocore==1.13.20

来源:https://github.com/boto/botocore/issues/1892

在MLflow的情况下,如果不能写入AWS3/MinIO数据湖,则调用mlflow.log_artifact()将引发此错误。

原因是没有在你的python env中设置凭据(就像这两个env变量一样):

os.environ['DATA_AWS_ACCESS_KEY_ID'] = 'login'
os.environ['DATA_AWS_SECRET_ACCESS_KEY'] = 'password'

注意,你也可以直接访问MLflow工件,使用minio客户端(除了mlflow的连接外,它需要一个单独的连接到数据湖)。这个客户端可以像这样启动:

minio_client_mlflow = minio.Minio(os.environ['MLFLOW_S3_ENDPOINT_URL'].split('://')[1],
access_key=os.environ['AWS_ACCESS_KEY_ID'],
secret_key=os.environ['AWS_SECRET_ACCESS_KEY'],
secure=False)

我是这样解决这个问题的:

aws configure

之后我手动输入:

AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: us-east-1
Default output format [None]: just hit enter

从那以后,它对我起作用了

如果使用AWS

在我的情况下,我必须在IAM角色中添加以下策略,以允许ec2标记被ec2实例读取。这将消除Unable to locate credentials错误 : < / p >
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:DescribeTags",
"Resource": "*"
}
]
}