Lỗi Boto3: botocore.exceptions.NoCredentialsError: Không thể định vị thông tin đăng nhập


112

Khi tôi chỉ đơn giản chạy mã sau, tôi luôn gặp lỗi này.

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)

Tôi đã lưu tệp thông tin xác thực của mình trong

C:\Users\myname\.aws\credentials, từ đó Boto sẽ đọc thông tin đăng nhập của tôi.

Cài đặt của tôi có sai không?

Đây là kết quả từ 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

1
Bạn có thể đăng đầu ra gỡ lỗi bằng cách thêm vào boto3.set_stream_logger('botocore', level='DEBUG')trước mã của bạn không? Nó sẽ hiển thị nơi nó đang tìm kiếm thông tin đăng nhập.
jamesls

có vẻ như Boto tìm kiếm khá vài địa điểm cho các tập tin cấu hình chứng chỉ, nhưng dường như không nhìn vào thư mục chính của tôi đối với một số lý do ...
d -_- b

2
Thử đặt biến môi trường HOMEđể trỏ tới C:\Users\mynamehoặc đặt AWS_SHARED_CREDENTIALS_FILEđể trỏ trực tiếp đến tệp thông tin xác thực của bạn.
garnaat

Tôi đã đặt biến env HOME như bạn mô tả, nhưng bây giờ gặp lỗi sau. botocore.exceptions.NoRegionError: You must specify a region. * tệp cấu hình của tôi ↓ nằm trong cùng thư mục với thông tin đăng nhập của tôi. [default] ap-northeast-1
d -_- b

1
Tôi đã có thể khắc phục sự cố bằng cách sử dụng nhận xét của garnaat .
LaundroMat 29/09/17

Câu trả lời:


94

thử chỉ định các khóa theo cách thủ công

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

Đảm bảo bạn không bao gồm ACCESS_ID và ACCESS_KEY trực tiếp trong mã vì những lo ngại về bảo mật. Cân nhắc sử dụng cấu hình môi trường và đưa chúng vào mã theo đề xuất của @Tiger_Mike.

Đối với môi trường Sản phẩm, hãy cân nhắc sử dụng các khóa truy cập xoay: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


Cách này rất hữu ích khi xử lý trực tiếp trên Django. Cảm ơn bạn.
Joepreludian

1
Điều này nguy hiểm hơn vì bạn đang đưa các bí mật của mình vào mã của bạn, điều này có thể dẫn đến việc kiểm soát phiên bản.
nu everest

4
@nueverest Điều này đúng, nhưng bạn có thể tránh điều này bằng cách chuyển khai báo sang tệp cài đặt và sau đó chèn qua các biến môi trường.
Tiger_Mike

Mặc dù điều này hiệu quả, tôi sẽ nói rằng nó không tuân theo các phương pháp hay nhất.
ben jarman

1
Cảm ơn. Điều này có thể được sử dụng như một bản sửa lỗi tạm thời trong thiết lập nhà phát triển. Tải các biến này từ một .envtệp (không được cam kết) sẽ là lý tưởng và tốt hơn là phải chọn từ ~/.aws/thư mục.
SuperNova

56

Tôi đã gặp vấn đề tương tự và phát hiện ra rằng định dạng ~/.aws/credentialstệp của tôi bị sai.

Nó hoạt động với một tệp chứa:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Lưu ý rằng tên hồ sơ phải là " [default]". Một số tài liệu chính thức liên quan đến tiểu sử có tên " [credentials]", không phù hợp với tôi.


1
Hoạt động trên windows (C: \ Users \ User \ .aws \ uỷ nhiệm)
Mr_and_Mrs_D

4
bạn có thể chỉ định hồ sơ để sử dụng trong boto3 sử dụng phiên = boto3.Session (profile_name = <your_profile>)
Mattia Paterna

Sử dụng aws configurecũng hoạt động nếu bạn đã AWS-cli cài đặt
radtek

2
Tôi đã chạy nó thông qua ansible nên một điều khác cần tìm là nếu bạn trở thành một người dùng khác trong khi chạy lệnh. Hãy chắc chắn rằng bạn không làm điều đó với 'sudo' chẳng hạn hoặc nó sẽ cố gắng truy cập thông tin đăng nhập aws root thay vào đó và thất bại nếu chúng không tồn tại.
radtek

28

Nếu bạn đang tìm kiếm một cách thay thế, hãy thử thêm thông tin đăng nhập của mình bằng AmazonCLI

từ loại thiết bị đầu cuối: -

aws configure

sau đó điền vào các khóa và khu vực của bạn.


17

Đảm bảo rằng tệp ~ / .aws / uỷ nhiệm của bạn trong Unix trông giống như sau:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Tập lệnh Python của bạn sẽ trông như thế này và nó sẽ hoạt động:

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'])

Nguồn: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration .


1
Bình output = jsonthường được đặt ~/.aws/configtrong một [profile MyProfile1]phần. Nó có thể không hoạt động nếu được chỉ định trong credentialstệp thay thế.
cjs

@Curt J. Sampson Nếu không kiểm tra, tôi chắc chắn bạn đúng. Cảm ơn vì sự đúng đắn của bạn.
TheWalkingData

Tôi đã xuất AWS_PROFILE = myprofle và nó không hoạt động nhưng điều này đã hoạt động. Bất kỳ lời giải thích nào về lý do tại sao điều đó có thể xảy ra.
Adarsh ​​Trivedi

5

Các hướng dẫn này dành cho máy windows có hồ sơ người dùng duy nhất cho AWS. Đảm bảo rằng ~/.aws/credentialstệp của bạn trông giống như thế này

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Tôi đã phải đặt AWS_DEFAULT_PROFILEbiến môi trường để profile_nametìm thấy trong thông tin đăng nhập của bạn.
Sau đó, con trăn của tôi đã có thể kết nối. ví dụ từ đây

import boto3

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

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

1
Nếu bạn đặt biến môi trường trên Win10 trong phần máy, có thể bạn cũng sẽ cần phải khởi động lại.
Trevor

1
@Trevor, tôi đã thử nghiệm điều này trên máy tính chạy windows 7 với sổ ghi chép Jupyter, tôi phải khởi động lại máy chủ Jupyter và nó hoạt động với tôi, nhưng tôi nghĩ khởi động lại sẽ là một ý kiến ​​hay.
Hrushikesh Dhumal

5

Tôi cũng gặp vấn đề tương tự, nó có thể được giải quyết bằng cách tạo tệp cấu hình và thông tin xác thực trong thư mục chính. Dưới đây là các bước tôi đã làm để giải quyết vấn đề này.

Tạo tệp cấu hình:

touch ~/.aws/config

Và trong tệp đó, tôi đã nhập vùng

[default]
region = us-west-2

Sau đó, tạo tệp thông tin xác thực:

touch ~/.aws/credentials

Sau đó nhập thông tin đăng nhập của bạn

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Sau khi đặt tất cả những thứ này, sau đó tệp python của tôi để kết nối nhóm. Chạy tệp này sẽ liệt kê tất cả các nội dung.

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)

Bạn cũng có thể tham khảo các liên kết dưới đây:


4

từ loại thiết bị đầu cuối: -

aws configure

sau đó điền vào các khóa và khu vực của bạn.

sau khi thực hiện bước tiếp theo sử dụng bất kỳ môi trường nào. Bạn có thể có nhiều khóa tùy thuộc vào tài khoản của mình. Có thể quản lý nhiều môi trường hoặc khóa

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

2

Tôi làm việc cho một tập đoàn lớn và gặp phải lỗi tương tự, nhưng cần một công việc khác. Sự cố của tôi liên quan đến cài đặt proxy. Tôi đã thiết lập proxy nên tôi cần đặt no_proxy của mình thành AWS trong danh sách trắng trước khi có thể bắt mọi thứ hoạt động. Bạn cũng có thể đặt nó trong tập lệnh bash của mình nếu bạn không muốn làm xáo trộn mã Python của mình với cài đặt hệ điều hành.

Python:

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

Bash:

export no_proxy = "s3.amazonaws.com"

Chỉnh sửa: Ở trên giả sử một vùng S3 Đông Hoa Kỳ. Đối với các khu vực khác: sử dụng s3. [Region] .amazonaws.com trong đó khu vực giống như us-East-1 hoặc us-west-2


2
Tôi đã gặp sự cố tương tự - nhưng phải nói no_proxyđể 169.254.169.254ứng dụng AWS có thể truy cập dịch vụ siêu dữ liệu để tìm hồ sơ cá thể.
Ralph Bolton

0

Boto3 đang tìm kiếm thông tin đăng nhập trong thư mục như

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

Bạn nên lưu hai tệp trong thư mục này credentialsconfig.

Bạn có thể muốn kiểm tra thứ tự chung mà boto3 tìm kiếm thông tin đăng nhập trong liên kết này . Xem dưới tiêu đề phụ Định cấu hình thông tin đăng nhập .


0

Nếu bạn chắc chắn rằng bạn định cấu hình đúng aws của mình, chỉ cần đảm bảo người dùng của dự án có thể đọc từ ./aws hoặc chỉ chạy dự án của bạn dưới dạng gốc


0

Nếu bạn có nhiều hồ sơ aws trong ~/.aws/credentialsnhư ...

[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************

Làm theo hai bước:

  1. Đặt một cái bạn muốn sử dụng làm mặc định bằng export AWS_DEFAULT_PROFILE=Profile 1lệnh trong terminal.

  2. Đảm bảo chạy lệnh trên trong cùng một thiết bị đầu cuối từ nơi bạn sử dụng boto3 hoặc bạn mở trình chỉnh sửa. [Hiểu tình huống sau]

Tình huống:

  • Nếu bạn có hai thiết bị đầu cuối đang mở được gọi t1t2.
  • Và bạn chạy lệnh xuất trong t1và bạn mở JupyterLab hoặc bất kỳ từ nào khác t2, bạn sẽ nhận được NoCredentialsError: Không thể xác định lỗi thông tin xác thực .

Giải pháp:

  • Chạy lệnh xuất trong t1và sau đó mở JupyterLab hoặc bất kỳ lệnh nào khác từ cùng một thiết bị đầu cuối t1.

0

Tạo một đối tượng khách S3 bằng thông tin đăng nhập của bạn

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)

Luôn luôn tốt để có được thông tin đăng nhập từ môi trường hệ điều hành

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.