Ошибка Boto3: botocore.exceptions.NoCredentialsError: невозможно найти учетные данные


113

Когда я просто запускаю следующий код, я всегда получаю эту ошибку.

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')перед кодом? Он покажет, где он ищет учетные данные.
jamesls

похоже, что Boto ищет довольно мало мест для файла конфигурации учетных данных, но, по-видимому, по какой-то причине не смотрит в мой домашний каталог ...
d -_- b

2
Попробуйте установить переменную окружения , HOMEчтобы указать на C:\Users\mynameили настройки , AWS_SHARED_CREDENTIALS_FILEчтобы указать непосредственно в файл мандатной.
garnaat

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

1
Я смог решить проблему с помощью комментария garnaat .
LaundroMat

Ответы:


93

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

    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

5
@nueverest Это правильно, но вы можете избежать этого, переместив объявление в файл настроек, а затем введя его через переменные среды.
Tiger_Mike

Хотя это работает, я бы сказал, что это не соответствует лучшим практикам.
Ben Jarman 05

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 \ credentials)
Mr_and_Mrs_D

4
вы можете указать, какой профиль использовать в boto3, используя session = boto3.Session (profile_name = <your_profile>)
Маттиа Патерна

Использование aws configureтакже работает, если у вас установлен aws-
cli

2
Я запускал его через ansible, поэтому еще одна вещь, которую нужно искать, - это если вы станете другим пользователем во время выполнения команды. Убедитесь, что вы не делаете это, например, с помощью sudo, иначе вместо этого он попытается получить доступ к учетным данным root aws и потерпит неудачу, если они не существуют.
radtek

28

Если вы ищете альтернативный способ, попробуйте добавить свои учетные данные с помощью AmazonCLI.

от типа терминала: -

aws configure

затем введите свои ключи и регион.


17

Убедитесь, что ваш файл ~ / .aws / credentials в 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 05

@ Курт Дж. Сэмпсон. Я уверен, что вы правы. Спасибо за исправление.
TheWalkingData

Я экспортировал AWS_PROFILE = myprofle, и это не сработало, но это сработало. Любое объяснение того, почему это может происходить.
Адарш Триведи,

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 в разделе машины, вам, вероятно, также потребуется выполнить перезагрузку.
Trevor

1
@Trevor, я тестировал это на машине с Windows 7 с ноутбуком Jupyter, мне пришлось перезапустить сервер Jupyter, и это сработало для меня, но я думаю, что перезагрузка была бы хорошей идеей.
Hrushikesh Dhumal

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 настройками ОС.

Python:

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

Баш:

export no_proxy = "s3.amazonaws.com"

Изменить: вышеупомянутое предполагает регион S3 востока США. Для других регионов: используйте s3. [Регион] .amazonaws.com, где регион - это что-то вроде us-east-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, или просто запустите ваш проект от имени пользователя root.


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)

Всегда полезно получить учетные данные из среды ОС

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.