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

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\证书,从那里Boto应该读我的证书。

我的设置错了吗?

下面是boto3的输出。set_stream_logger (botocore,级别=“调试”)。

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

当前回答

如果使用AWS

在我的情况下,我必须在IAM角色中添加以下策略,以允许ec2实例读取ec2标记。这将消除“无法定位凭据”错误 :

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": "ec2:DescribeTags",
        "Resource": "*"
    }
  ]
}

其他回答

我有同样的问题,并发现我的~/。Aws /凭证文件错误。

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

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

注意,必须有一个配置文件名称“[default]”。一些官方文件提到了一个名为“[凭证]”的配置文件,这对我来说并不适用。

导出证书也可以,在linux:

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

我在一家大公司工作,遇到过同样的错误,但我需要一个不同的工作方式。我的问题与代理设置有关。我已经设置了代理,所以在我能够让一切正常工作之前,我需要将我的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

对于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'

注意,您也可以使用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)

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

创建一个配置文件:

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)

你也可以参考以下链接:

带有Python Boto3库的Amazon S3 Boto 3文档 Boto3: Amazon S3 as Python Object Store