Boto3 Hatası: botocore.exceptions.NoCredentialsError: Kimlik bilgileri bulunamıyor


113

Sadece aşağıdaki kodu çalıştırdığımda, her zaman bu hatayı alıyorum.

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)

Kimlik bilgisi dosyamı şuraya kaydettim

C:\Users\myname\.aws\credentials, Boto'nun kimlik bilgilerimi okuması gereken yerden.

Ayarım yanlış mı?

İşte buradan çıktı 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
Hata ayıklama çıktısını boto3.set_stream_logger('botocore', level='DEBUG')kodunuzun önüne ekleyerek gönderebilir misiniz ? Kimlik bilgilerini nerede aradığını gösterecektir.
jamesls

Görünüşe göre Boto, kimlik bilgileri yapılandırma dosyası için epeyce konum arıyor, ancak görünüşe göre bir nedenden dolayı ana dizinime bakmıyor ...
d -_- b

2
Ortam değişkenini doğrudan kimlik bilgileri dosyanızı gösterecek şekilde ayarlamayı veya doğrudan kimlik bilgileri dosyanızı HOMEgösterecek şekilde ayarlamayı deneyin . C:\Users\mynameAWS_SHARED_CREDENTIALS_FILE
garnaat

Env değişkenini HOME açıkladığınız gibi ayarladım, ancak şimdi aşağıdaki hatayı alıyorum. botocore.exceptions.NoRegionError: You must specify a region. * yapılandırma dosyam ↓, kimlik bilgilerimle aynı klasörde bulunur. [default] ap-northeast-1
d -_- b

Yanıtlar:


93

anahtarları manuel olarak belirtmeyi deneyin

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

Güvenlik endişeleri nedeniyle ACCESS_ID ve ACCESS_KEY'inizi koda doğrudan eklemediğinizden emin olun. Ortam yapılandırmalarını kullanmayı ve bunları @Tiger_Mike tarafından önerildiği gibi koda eklemeyi düşünün.

Üretim ortamları için dönüşümlü erişim anahtarlarını kullanmayı düşünün: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


Bu yol, doğrudan Django üzerinde işlem yaparken kullanışlıdır. Teşekkür ederim.
Joepreludian

1
Sırlarınızı kodunuza koyduğunuz için bu daha tehlikelidir ve bu da sürüm kontrolüne geçebilir.
nu everest

5
@nueverest Bu doğrudur, ancak bildirimi bir ayarlar dosyasına taşıyıp daha sonra ortam değişkenleri yoluyla enjekte ederek bundan kaçınabilirsiniz.
Tiger_Mike

Bu işe yarasa da, en iyi uygulamaları takip etmediğini söyleyebilirim.
ben jarman

1
Teşekkürler. Bu, geliştirici kurulumunda geçici bir düzeltme olarak kullanılabilir. Bu değişkenleri bir .envdosyadan (kaydedilmemiş) yüklemek ideal olacaktır ve ~/.aws/klasörden seçim yapmaktan daha iyi olacaktır .
SuperNova

56

Aynı sorunu yaşadım ve dosyamın formatının ~/.aws/credentialsyanlış olduğunu öğrendim .

Şunları içeren bir dosya ile çalıştı:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Profil adının " [default]" olması gerektiğini unutmayın . Bazı resmi belgeler [credentials], benim için çalışmayan " " adlı bir profile gönderme yapıyor .


1
Windows üzerinde de çalışır (C: \ Users \ User \ .aws \ kimlik bilgileri)
Mr_and_Mrs_D

4
boto3'te hangi profilin kullanılacağını session = boto3.Session (profil_adı = <profiliniz>)
Mattia Paterna

Kullanmak aws configure, aws-cli kuruluysa da işe yarar
radtek

2
Ben yanıtlayıcı aracılığıyla çalıştırıyordum, bu yüzden bakılması gereken başka bir şey, komutu çalıştırırken farklı bir kullanıcı olursanız. Örneğin, 'sudo' ile yapmadığınızdan emin olun, yoksa bunun yerine kökler aws kimlik bilgilerine erişmeye çalışır ve yoksa başarısız olur.
radtek

28

Alternatif bir yol arıyorsanız, kimlik bilgilerinizi AmazonCLI kullanarak eklemeyi deneyin.

terminal tipinden: -

aws configure

ardından anahtarlarınızı ve bölgenizi girin.


17

Unix'teki ~ / .aws / credentials dosyanızın aşağıdaki gibi göründüğünden emin olun:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Python betiğiniz şöyle görünmeli ve çalışacaktır:

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

Kaynak: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration .


1
output = jsonNormal olarak yerleştirilir ~/.aws/configbir yer [profile MyProfile1]bölümü. Bunun credentialsyerine dosyada belirtilirse çalışmayabilir .
cjs

@Curt J. Sampson Kontrol etmeden, haklı olduğunuza eminim. Düzeltme için teşekkürler.
TheWalkingData

AWS_PROFILE = myprofle'ı dışa aktardım ve işe yaramadı ama işe yaradı. Bunun neden olabileceğine dair herhangi bir açıklama.
Adarsh ​​Trivedi

5

Bu talimatlar, AWS için tek kullanıcı profiline sahip Windows makinesi içindir. ~/.aws/credentialsDosyanızın böyle göründüğünden emin olun

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Kimlik bilgilerinizde bulunması için AWS_DEFAULT_PROFILEortam değişkenini ayarlamam gerekiyordu profile_name.
Sonra benim python'um bağlanabildi. mesela buradan

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'da ortam değişkenini makine bölümünde ayarlarsanız, muhtemelen yeniden başlatma da yapmanız gerekecektir.
Trevor

1
@Trevor, bunu Jupyter dizüstü bilgisayarlı bir Windows 7 makinesinde test ettim, Jupyter sunucusunu yeniden başlatmak zorunda kaldım ve benim için çalıştı, ancak yeniden başlatmanın iyi bir fikir olacağını düşünüyorum.
Hrushikesh Dhumal

5

Ben de aynı sorunu yaşadım, ana dizinde bir yapılandırma ve kimlik bilgisi dosyası oluşturarak çözülebilir. Aşağıda bu sorunu çözmek için yaptığım adımları göster.

Bir yapılandırma dosyası oluşturun:

touch ~/.aws/config

Ve o dosyada bölgeye girdim

[default]
region = us-west-2

Ardından kimlik bilgisi dosyasını oluşturun:

touch ~/.aws/credentials

Ardından kimlik bilgilerinizi girin

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Tüm bunları ayarladıktan sonra, python dosyam demeti bağlamak için. Bu dosyayı çalıştır, tüm içeriği listeleyecektir.

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)

Ayrıca aşağıdaki bağlantılara da başvurabilirsiniz:


4

terminal tipinden: -

aws configure

ardından anahtarlarınızı ve bölgenizi girin.

bundan sonra sonraki adımı herhangi bir ortamı kullanın. Hesabınıza bağlı olarak birden fazla anahtarınız olabilir. Birden fazla ortamı veya anahtarı yönetebilir

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

2

Büyük bir şirket için çalışıyorum ve aynı hatayla karşılaştım, ancak farklı bir çözüm bulmaya ihtiyacım vardı. Sorunum proxy ayarlarıyla ilgiliydi. Proxy'mi kurdum, bu nedenle her şeyin çalışmasını sağlayamadan önce no_proxy'imi AWS'yi beyaz listeye alacak şekilde ayarlamam gerekiyordu. Python kodunuzu işletim sistemi ayarlarıyla karıştırmak istemiyorsanız, onu bash betiğinizde de ayarlayabilirsiniz.

Python:

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

Bash:

export no_proxy = "s3.amazonaws.com"

Düzenleme: Yukarıda bir ABD Doğu S3 bölgesi varsayılmaktadır. Diğer bölgeler için: bölgenin us-east-1 veya us-west-2 gibi olduğu s3. [Region] .amazonaws.com adresini kullanın


2
Ben benzer bir sorunu vardı - ama söylemek zorunda no_proxyiçin 169.254.169.254AWS istemci örneği profilini bulmak için meta veri servisine olsun diye.
Ralph Bolton

0

Boto3, klasörde aşağıdaki gibi kimlik bilgilerini arıyor:

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

Bu klasöre iki dosya kaydetmelisiniz credentialsve config.

Bu bağlantıda boto3'ün kimlik bilgilerini aradığı genel sırayı kontrol etmek isteyebilirsiniz . Kimlik Bilgilerini Yapılandırma alt başlığının altına bakın .


0

Aws'nizi doğru şekilde yapılandırdığınızdan eminseniz, sadece proje kullanıcısının ./aws kaynağından okuyabildiğinden emin olun veya projenizi bir kök olarak çalıştırın.


0

Eğer varsa birden aws profilleri içinde ~/.aws/credentialsgibi ...

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

İki adımı izleyin:

  1. export AWS_DEFAULT_PROFILE=Profile 1Terminaldeki komutu kullanarak varsayılan olarak kullanmak istediğinizi yapın .

  2. Yukarıdaki komutu boto3 kullandığınız veya bir düzenleyici açtığınız terminalde çalıştırdığınızdan emin olun. [Aşağıdaki senaryoyu anlayın]

Senaryo:

  • Açık iki terminaliniz varsa t1ve aradı t2.
  • Ve dışa aktarma komutunu içinde çalıştırırsanız ve t1JupyterLab'ı veya başka herhangi birini t2açarsanız, NoCredentialsError: Kimlik bilgileri bulunamıyor hatası alırsınız .

Çözüm:

  • Dışa aktarma komutunu içinde çalıştırın t1ve ardından JupyterLab'ı veya aynı terminalden başka herhangi birini açın t1.

0

Kimlik bilgilerinizle bir S3 istemci nesnesi oluşturun

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)

İşletim sistemi ortamından kimlik bilgileri almak her zaman iyidir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.