172

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

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
4

16 回答 16

127

尝试手动指定键

    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

于 2017-02-20T07:34:23.853 回答
82

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

它使用包含以下内容的文件:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

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

于 2016-03-04T17:34:55.187 回答
37

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

从终端类型: -

aws configure

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

于 2016-02-01T02:18:13.653 回答
29

确保您在 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 。

于 2018-06-22T20:46:08.763 回答
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)

您也可以参考以下链接:

于 2019-08-21T07:00:40.507 回答
12

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

如果窗户

c:System\> set AWS_ACCESS_KEY="aws_access_key"
c:System\> set AWS_SECRET_KEY="aws_secret_key"
于 2020-08-14T11:50:46.550 回答
8

导出凭证也可以,在 linux 中:

export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX"
export AWS_ACCESS_KEY_ID="XXXXXXXXXXX"
于 2020-12-05T21:57:50.620 回答
7

从终端类型: -

aws configure

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

在此之后做下一步使用任何环境。根据您的帐户,您可以拥有多个密钥。可以管理多个环境或密钥

import boto3
aws_session = boto3.Session(profile_name="prod")
# Create an S3 client
s3 = aws_session.client('s3')
于 2019-10-17T11:28:13.093 回答
6

这些说明适用于具有 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)
于 2018-08-10T18:12:24.957 回答
5

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

Python:

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

于 2018-10-08T18:53:16.257 回答
4

如果您有多个类似的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
  • 然后在其中运行导出命令t1并打开 JupyterLab 或任何其他 from t2,您将收到NoCredentialsError: Unable to locate credentials错误。

解决方案:

  • 在其中运行导出命令,t1然后从同一终端打开 JupyterLab 或任何其他命令t1
于 2019-05-12T17:37:35.213 回答
1

我已经解决了这样的问题:

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

之后它对我有用

于 2021-09-10T18:58:27.453 回答
1

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

原因是没有在您的 python 环境中设置凭据(作为这两个环境变量):

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

请注意,您也可以使用minio客户端直接访问 MLflow 工件(这需要与数据湖的单独连接,除了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)
于 2021-03-15T19:22:53.467 回答
0

如果您确定您的 aws 配置正确,只需确保项目的用户可以从./aws读取或仅以 root 身份运行您的项目

于 2019-02-17T09:24:43.640 回答
0

我刚遇到这个问题。这对我有用:

pip install botocore==1.13.20

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

于 2020-12-14T09:48:28.763 回答
0

boto3 正在寻找文件夹中的凭据,例如

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

您应该在此文件夹中保存两个文件credentialsconfig.

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

于 2018-12-20T00:30:15.877 回答