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

223
当我运行以下代码时,总是会得到这个错误。
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

5
你能否在你的代码之前添加 boto3.set_stream_logger('botocore', level='DEBUG') 并输出调试信息?这将显示它正在寻找凭据的位置。 - jamesls
3
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - garnaat
1
我按照你的描述设置了环境变量HOME,但现在出现以下错误。 botocore.exceptions.NoRegionError: You must specify a region.*我的配置文件↓与我的凭据位于同一文件夹中。 [default] ap-northeast-1 - d-_-b
1
我使用garnaat的评论成功修复了这个问题。 - Mathieu Dhondt
也要注意,如果您使用Amazon的客户端输入凭据,它似乎只适用于您当时使用的用户。如果您以root身份运行脚本,但您没有将凭据保存为root,它将无法找到它们。 - Andrew
显示剩余2条评论
18个回答

4
如果您在~/.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或打开编辑器的终端中运行上述命令,即同一个终端。[理解以下场景]

场景:

  • 如果您打开了两个终端:t1和t2。
  • 您在t1中运行导出命令,并在t2中打开JupyterLab或任何其他应用,则会收到NoCredentialsError: Unable to locate credentials 错误消息。

解决方案:

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

3
如果您无法向AWS3 / MinIO数据湖中写入内容,则在使用MLflow时调用mlflow.log_artifact()会引发此错误。原因是在Python环境中未设置凭据(作为这两个环境变量):
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)

在我的情况下,我不得不为所有内容设置os.environ:MLFLOW_S3_ENDPOINT_URL、AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。 - gndps

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

之后它对我起作用了


0

如果使用AWS

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

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

0
如果您从EC2实例运行这些命令,并且元数据端点配置为需要HTTP令牌,那么您可能会遇到相同的错误。请将HTTP令牌设置为可选,或者升级您的客户端。

0

boto3 会在文件夹中寻找凭证,例如:

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

你应该在这个文件夹中保存两个文件,分别是credentialsconfig
你可能想查看boto3搜索凭据的通用顺序,可以参考this link,查看配置凭证子标题下的内容。

0

如果您确定已正确配置AWS,请确保项目用户可以从./aws读取,或者以root身份运行您的项目。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接