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

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

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

17 ответов

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

    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.

У меня была такая же проблема, и я узнал, что формат моего ~/.aws/credentials файл был неверным.

Он работал с файлом, содержащим:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Обратите внимание, что имя профиля должно быть "[default]Msgstr ". Некоторые официальные документы ссылаются на профиль с именем"[credentials]", который не работал для меня.

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

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

aws configure

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

Убедитесь, что ваш файл ~/.aws/credentials в Unix выглядит следующим образом:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
output = json

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
output = json

Ваш скрипт на 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.

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

Создайте файл конфигурации:

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)

Вы также можете обратиться к ссылкам ниже:

Создайте клиентский объект 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)

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

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

aws configure

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

после этого сделайте следующий шаг, используйте любую среду. У вас может быть несколько ключей в зависимости от вашей учетной записи. Может управлять несколькими средами или ключами

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

Экспорт учетных данных также работает, в Linux:

export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX"
export AWS_ACCESS_KEY_ID="XXXXXXXXXXX"

Эти инструкции предназначены для 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)

Я работаю в большой корпорации и столкнулся с той же самой ошибкой, но мне нужно было обойти эту проблему. Моя проблема была связана с настройками прокси. Я настроил свой прокси-сервер, поэтому мне нужно было настроить no_proxy на белый список AWS, прежде чем я смог заставить все работать. Вы также можете установить его в своем скрипте bash, если не хотите путать ваш код Python с настройками os.

Python:

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

Bash:

NO_PROXY = "s3.amazonaws.com"

Если у вас несколько профилей 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.

В случае MLflow вызов mlflow.log_artifact() вызовет эту ошибку, если вы не можете записать в озеро данных AWS3 / MinIO.

Причина не в настройке учетных данных в вашем окружении python (как в этих двух переменных env):

      os.environ['DATA_AWS_ACCESS_KEY_ID'] = 'login'
os.environ['DATA_AWS_SECRET_ACCESS_KEY'] = 'password'

Обратите внимание, что вы также можете напрямую обращаться к артефактам MLflow, используя minio клиент (который требует отдельного подключения к озеру данных, кроме mlflowсвязь). Этот клиент можно запустить так:

      minio_client_mlflow = minio.Minio(os.environ['MLFLOW_S3_ENDPOINT_URL'].split('://')[1],
                    access_key=os.environ['AWS_ACCESS_KEY_ID'],
                    secret_key=os.environ['AWS_SECRET_ACCESS_KEY'],
                    secure=False)

Я решил проблему так:

      aws configure

После этого я вручную ввел:

      AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: us-east-1
Default output format [None]: just hit enter

После этого у меня сработало

Если вы уверены, что правильно настроили свои aws, просто убедитесь, что пользователь проекта может читать с ./aws или просто запустите ваш проект как root

Просто у меня была эта проблема. Вот что сработало для меня:

      pip install botocore==1.13.20

Источник: https://github.com/boto/botocore/issues/1892

В случае использования AWS

В моем случае мне пришлось добавить следующую политику в роль IAM, чтобы разрешить чтение тегов ec2 экземплярами EC2. Это устранило быUnable to locate credentialsошибка :

      {
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": "ec2:DescribeTags",
        "Resource": "*"
    }
  ]
}

Boto3 ищет учетные данные в папке, как

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

Вы должны сохранить два файла в этой папке credentials а также config,

Вы можете проверить общий порядок, в котором boto3 ищет учетные данные по этой ссылке. Смотрите под заголовком Configuring Credentials.

Другие вопросы по тегам