当我简单地运行下面的代码时,我总是得到这个错误。
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
确保你的~/。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交互性配置。
如果在~/中有多个aws配置文件。aws /凭证等……
[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
遵循两个步骤:
在终端中使用export AWS_DEFAULT_PROFILE=Profile 1命令创建一个您想使用的默认值。
请确保在使用boto3或打开编辑器的同一终端上运行上述命令。[理解以下场景]
场景:
如果有两个终端,分别是t1和t2。
然后在t1中运行export命令,然后从t2中打开JupyterLab或任何其他命令,您将得到NoCredentialsError: Unable to locate credentials错误。
解决方案:
在t1中运行export命令,然后从同一终端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)
你也可以参考以下链接:
带有Python Boto3库的Amazon S3
Boto 3文档
Boto3: Amazon S3 as Python Object Store
对于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)