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

d-_*_*_-b 89 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)
Run Code Online (Sandbox Code Playgroud)

我保存了我的凭据文件

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
Run Code Online (Sandbox Code Playgroud)

SHA*_*HAV 73

尝试手动指定键

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)
Run Code Online (Sandbox Code Playgroud)

为了安全起见,请确保您不直接在代码中包含ACCESS_ID和ACCESS_KEY.考虑使用环境配置并按照@Tiger_Mike的建议将它们注入代码中.

对于Prod环境,请考虑使用旋转访问键:https: //docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

  • 这是更危险的,因为您将秘密放入代码中,这可能最终会受到版本控制的影响。 (5认同)
  • @nueverest这是正确的,但您可以通过将声明移动到设置文件然后通过环境变量注入来避免这种情况. (2认同)

小智 43

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

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

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY
Run Code Online (Sandbox Code Playgroud)

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

  • 也适用于 Windows (C:\Users\User\.aws\credentials) (4认同)
  • 你可以使用session = boto3.Session(profile_name = <your_profile>)指定在boto3中使用哪个配置文件 (3认同)
  • 您不需要有默认配置文件,您可以将环境变量 AWS_PROFILE 设置为您想要的任何配置文件(例如_credentials_)`export AWS_PROFILE=credentials`,当您执行代码时,它会检查 AWS_PROFILE 值,然后它将从 .aws\credentials 文件中获取相应的凭证(在此示例中,它将搜索 _credentials_ 配置文件 (3认同)
  • 我是通过 ansible 运行它的,所以要寻找的另一件事是您在运行命令时是否成为不同的用户。例如,确保您没有使用“sudo”来执行此操作,否则它将尝试访问根 aws 凭据,如果它们不存在则失败。 (2认同)

Amr*_*mri 24

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

从终端类型: -

aws configure
Run Code Online (Sandbox Code Playgroud)

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


The*_*ata 11

确保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
Run Code Online (Sandbox Code Playgroud)

你的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'])
Run Code Online (Sandbox Code Playgroud)

资料来源:https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration.


Nij*_*lai 11

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

创建一个配置文件:

touch ~/.aws/config
Run Code Online (Sandbox Code Playgroud)

在那个文件中我进入了该区域

[default]
region = us-west-2
Run Code Online (Sandbox Code Playgroud)

然后创建凭证文件:

touch ~/.aws/credentials
Run Code Online (Sandbox Code Playgroud)

然后输入您的凭据

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Run Code Online (Sandbox Code Playgroud)

设置完所有这些后,然后我的python文件连接bucket。运行此文件将列出所有内容。

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)
Run Code Online (Sandbox Code Playgroud)

您也可以参考以下链接:


kat*_*aja 10

使用您的凭据创建 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)
Run Code Online (Sandbox Code Playgroud)

从 os 环境获取凭据总是好的

要设置环境变量,请在终端中运行以下命令

如果是 linux 或 mac

$ export AWS_ACCESS_KEY="aws_access_key"
$ export AWS_SECRET_KEY="aws_secret_key"
Run Code Online (Sandbox Code Playgroud)

如果窗户

c:System\> set AWS_ACCESS_KEY="aws_access_key"
c:System\> set AWS_SECRET_KEY="aws_secret_key"
Run Code Online (Sandbox Code Playgroud)


avi*_*006 7

从终端类型:-

aws configure
Run Code Online (Sandbox Code Playgroud)

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

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

import boto3
aws_session = boto3.Session(profile_name="prod")
# Create an S3 client
s3 = aws_session.client('s3')
Run Code Online (Sandbox Code Playgroud)


JJF*_*rd3 6

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

Python:

import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"
Run Code Online (Sandbox Code Playgroud)

重击:

export no_proxy = "s3.amazonaws.com"
Run Code Online (Sandbox Code Playgroud)

编辑:以上假设美国东部 S3 区域。对于其他区域:使用 s3.[region].amazonaws.com,其中区域类似于 us-east-1 或 us-west-2

  • 我遇到了类似的问题 - 但不得不对“169.254.169.254”说“no_proxy”,以便 AWS 客户端可以访问元数据服务来查找实例配置文件。 (2认同)

ahm*_*raj 6

导出凭证也有效,在 linux 中:

export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX"
export AWS_ACCESS_KEY_ID="XXXXXXXXXXX"
Run Code Online (Sandbox Code Playgroud)


Hru*_*mal 5

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

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
Run Code Online (Sandbox Code Playgroud)

我必须将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)
Run Code Online (Sandbox Code Playgroud)