Помилка 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.