Помилка Boto3: botocore.exceptions.NoCredentialsError: Не вдається знайти облікові дані


112

Коли я просто запускаю наступний код, я завжди отримую цю помилку.

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, звідки Бото повинен прочитати мої облікові дані.

Моє налаштування неправильне?

Ось вихід з 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
Чи можете ви розмістити вихід налагодження, додавши boto3.set_stream_logger('botocore', level='DEBUG')перед кодом? Він покаже, де він шукає повноваження.
джемсел

здається, що Boto шукає зовсім небагато локацій для файлу конфігурації облікових даних, але, мабуть, чомусь не заглядає до мого домашнього каталогу ...
d -_- b

2
Спробуйте встановити змінну середовища HOMEдля вказівки C:\Users\mynameабо налаштувати AWS_SHARED_CREDENTIALS_FILEнапрямок на ваш файл облікових даних.
garnaat

Я встановив змінну env HOME, як ви описали, але тепер отримую наступну помилку. botocore.exceptions.NoRegionError: You must specify a region. * мій конфігураційний файл located розташований у тій самій папці, що і мої облікові дані. [default] ap-northeast-1
d -_- b

1
Мені вдалося виправити проблему за допомогою коментаря garnaat .
LaundroMat

Відповіді:


94

спробуйте вказати ключі вручну

    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


Цей спосіб корисний при роботі безпосередньо з Django. Спасибі.
Joepreludian

1
Це небезпечніше, оскільки ви вводите у свій код секрети, які можуть закінчитися контролем версій.
nu everest

4
@nueverest Це правильно, але ви можете цього уникнути, перемістивши декларацію у файл налаштувань, а потім ввівши через змінні середовища.
Tiger_Mike

Хоча це працює, я б сказав, що це не дотримання найкращих практик.
ben jarman

1
Дякую. Це може використовуватися як тимчасове виправлення у програмі настройки. Завантаження цих змінних з .envфайлу (не вчинено) було б ідеально і було б краще, ніж вибирати з ~/.aws/папки.
SuperNova

56

У мене була та сама проблема, і я дізнався, що формат мого ~/.aws/credentialsфайлу був неправильним.

Він працював з файлом, що містить:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Зауважте, що ім'я профілю має бути " [default]". Деяка офіційна документація посилається на профіль під назвою " [credentials]", який не працював для мене.


1
Працює і в Windows (C: \ Users \ User \ .aws \ повноваження)
Mr_and_Mrs_D

4
Ви можете вказати, який профіль використовувати в boto3, використовуючи session = boto3.Session (profile_name = <Ваш_профіль>)
Mattia Paterna,

Використання aws configureтакож працює, якщо у вас встановлено
Aws

2
Я запускав його через ansible, тому інша річ, яку потрібно шукати, якщо ви станете іншим користувачем під час виконання команди. Переконайтесь, що ви цього не робите, наприклад, з «sudo», або він намагатиметься отримати доступ до облікових даних root aws, а якщо вони відсутні,
radtek

28

Якщо ви шукаєте альтернативний спосіб, спробуйте додати свої облікові дані за допомогою AmazonCLI

від типу терміналу: -

aws configure

потім заповніть ваші ключі та регіон.


17

Переконайтесь, що файл ~ / .aws / облікових даних у Unix виглядає так:

[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 .


1
output = jsonЯк правило , поміщають в ~/.aws/configв [profile MyProfile1]секції. Він може не працювати, якщо credentialsзамість нього вказано у файлі.
cjs

@Curt J. Sampson Не перевіряючи, я впевнений, що ти маєш рацію. Дякуємо за виправлення.
TheWalkingData

Я експортував AWS_PROFILE = myprofle, і він не працював, але це працювало. Будь-яке пояснення, чому це може статися.
Adarsh ​​Trivedi

5

Ці інструкції призначені для Windows-машини з єдиним профілем користувача для AWS. Переконайтеся, що ваш ~/.aws/credentialsфайл виглядає приблизно так

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Мені довелося встановити AWS_DEFAULT_PROFILEзмінну середовища, яку можна profile_nameзнайти у ваших облікових даних.
Тоді мій пітон зміг підключитися. наприклад звідси

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
Якщо ви встановите змінну середовища на Win10 в машинному розділі, вам, ймовірно, доведеться також зробити перезавантаження.
Тревор

1
@Trevor, я тестував це на машині Windows 7 з ноутбуком Юпітер, мені довелося перезапустити сервер Jupyter, і він працював на мене, але я думаю, перезавантаження буде гарною ідеєю.
Грушікеш Дхумал

5

У мене також була така ж проблема, її можна вирішити, створивши файл конфігурації та облікових даних у домашньому каталозі. Нижче покажіть кроки, які я зробив для вирішення цього питання.

Створіть конфігураційний файл:

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)

Ви також можете посилатися нижче за посиланнями:


4

від типу терміналу: -

aws configure

потім заповніть ваші ключі та регіон.

після цього виконайте наступний крок, використовуйте будь-яке середовище. Ви можете мати кілька клавіш залежно від вашого акаунта. Може керувати кількома оточеннями або клавішами

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

2

Я працюю у великій корпорації і зіткнувся з цією ж помилкою, але мені потрібна була інша робота. Моя проблема була пов’язана з налаштуваннями проксі. У мене був налаштований проксі, тому мені потрібно було встановити свій no_proxy до білого списку AWS, перш ніж я зміг змусити все працювати. Ви також можете встановити його у вашому скрипті bash, якщо ви не хочете замучувати код Python за допомогою параметрів OS.

Пітон:

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

Bash:

export no_proxy = "s3.amazonaws.com"

Редагувати: вищенаведене передбачає Східний регіон S3 США. Для інших регіонів використовуйте s3. [Region] .amazonaws.com, де регіон є на зразок us-1 або us-west-2


2
У мене була аналогічна проблема - але повинен був сказати no_proxyдля 169.254.169.254того , щоб клієнт міг отримати AWS до служби метаданих , щоб знайти профіль примірника.
Ральф Болтон

0

Boto3 шукає облікові дані в папці типу

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

Ви повинні зберегти два файли у цій папці credentialsта config.

Ви можете перевірити загальний порядок, коли boto3 шукає облікові дані за цим посиланням . Подивіться підзаголовок Налаштування облікових даних .


0

Якщо ви впевнені, що правильно налаштувати свої Aws, просто переконайтеся, що користувач проекту може читати з ./aws або просто запускати проект як корінь


0

Якщо у вас є кілька профілів AWS в ~/.aws/credentialsяк ...

[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і ви відкриєте JupyterLab або будь-який інший з t2, ви отримаєте NoCredentialsError: Не вдається знайти помилку облікових даних .

Рішення:

  • Запустіть команду експортування t1та відкрийте JupyterLab або будь-який інший з того ж терміналу t1.

0

Створіть об’єкт клієнта 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.