Boto3错误:botocore.exceptions.NoCredentialsError:无法找到凭据

时间:2015-10-23 07:40:47

标签: boto boto3

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

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

15 个答案:

答案 0 :(得分:60)

尝试手动指定密钥

    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

答案 1 :(得分:37)

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

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

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

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

答案 2 :(得分:21)

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

来自终端类型的

: -

aws configure

然后填写你的钥匙和区域。

答案 3 :(得分:7)

确保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

答案 4 :(得分:3)

这些说明适用于具有AWS单个用户配置文件的Windows计算机。确保您的~/.aws/credentials文件如下所示

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

我必须将AWS_DEFAULT_PROFILE的环境变量设置为在您的凭据中找到的profile_name
然后我的python就可以连接了。例如来自here

import boto3

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

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

答案 5 :(得分:2)

我在一家大公司工作,遇到了相同的错误,但是需要其他解决方法。我的问题与代理设置有关。我已经设置了代理,因此需要先将no_proxy设置为将AWS列入白名单,然后才能使所有功能正常工作。如果不想使用os设置混淆Python代码,也可以在bash脚本中进行设置。

Python:

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

重击:

no_proxy = "s3.amazonaws.com"

答案 6 :(得分:2)

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

创建一个配置文件:

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)

您还可以参考以下链接:

答案 7 :(得分:1)

从终端类型:-

aws configure

然后填写您的按键和区域。

在此之后,请使用任何环境进行下一步。您可以根据自己的帐户使用多个键。可以管理多个环境或密钥

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

答案 8 :(得分:1)

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

如果是Windows

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

答案 9 :(得分:0)

boto3正在像这样的文件夹中寻找凭据

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

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

您可能要检查boto3在this link中搜索凭证的一般顺序。在配置凭据子标题下查看。

答案 10 :(得分:0)

如果您确定正确配置了AWS,则只需确保项目用户可以从 ./ aws 中读取,或者仅以root用户身份运行项目即可即可。

答案 11 :(得分:0)

如果您在~/.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中运行export命令,然后从同一终端t1中打开JupyterLab或任何其他终端。

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

我只是有这个问题。这对我有用:

!pip install botocore==1.13.20

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

答案 14 :(得分:0)

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

原因不是在您的 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)