Kesalahan Boto3: botocore.exceptions.NoCredentialsError: Tidak dapat menemukan kredensial

113

Ketika saya hanya menjalankan kode berikut, saya selalu mendapatkan kesalahan ini.

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)

Saya telah menyimpan file kredensial saya di

C:\Users\myname\.aws\credentials, dari mana Boto harus membaca kredensial saya.

Apakah pengaturan saya salah?

Ini adalah keluaran dari 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
d -_- b
sumber
1
Dapatkah Anda memposting keluaran debug dengan menambahkan boto3.set_stream_logger('botocore', level='DEBUG')sebelum kode Anda? Ini akan menunjukkan di mana itu mencari kredensial.
jamesl
tampaknya Boto mencari cukup sedikit lokasi untuk file konfigurasi kredensial, tetapi tampaknya tidak melihat ke direktori home saya karena suatu alasan ...
d -_- b
2
Coba tetapkan variabel lingkungan HOMEuntuk diarahkan C:\Users\mynameatau tetapkan AWS_SHARED_CREDENTIALS_FILEuntuk mengarah langsung ke file kredensial Anda.
garnaat
Saya mengatur variabel env HOME seperti yang Anda jelaskan, tetapi sekarang saya mendapatkan kesalahan berikut. botocore.exceptions.NoRegionError: You must specify a region. * File konfigurasi saya ↓ terletak di folder yang sama dengan kredentail saya. [default] ap-northeast-1
d -_- b
1
Saya dapat memperbaiki masalah menggunakan komentar garnaat .
LaundroMat

Jawaban:

94

coba tentukan kunci secara manual

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

Pastikan Anda tidak menyertakan ACCESS_ID dan ACCESS_KEY Anda dalam kode secara langsung untuk masalah keamanan. Pertimbangkan untuk menggunakan konfigurasi lingkungan dan memasukkannya ke dalam kode seperti yang disarankan oleh @Tiger_Mike.

Untuk lingkungan Prod, pertimbangkan untuk menggunakan kunci akses yang berputar: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

SHASHANK MADHAV
sumber
Cara ini berguna saat menangani langsung pada Django. Terima kasih.
Joepreludian
1
Ini lebih berbahaya karena Anda memasukkan rahasia Anda ke dalam kode yang dapat berakhir di kontrol versi.
nu everest
4
@nueverest Ini benar, tetapi Anda dapat menghindari hal ini dengan memindahkan deklarasi ke file pengaturan dan kemudian memasukkan melalui variabel lingkungan.
Tiger_Mike
Meskipun ini berhasil, saya akan mengatakan itu tidak mengikuti praktik terbaik.
ben jarman
1
Terima kasih. Ini dapat digunakan sebagai perbaikan suhu dalam pengaturan dev. Memuat variabel ini dari .envfile (tidak dikomit) akan ideal dan lebih baik daripada harus memilih dari ~/.aws/folder.
SuperNova
56

Saya mengalami masalah yang sama dan menemukan bahwa format ~/.aws/credentialsfile saya salah.

Ini bekerja dengan file yang berisi:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Perhatikan bahwa nama profil harus " [default]". Beberapa dokumentasi resmi merujuk ke profil bernama " [credentials]", yang tidak bekerja untuk saya.

Fernando Ciciliati
sumber
1
Bekerja di windows juga (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D
4
Anda dapat menentukan profil mana yang akan digunakan di boto3 menggunakan session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna
Penggunaan aws configurejuga berfungsi jika Anda menginstal aws-cli
radtek
2
Saya menjalankannya melalui ansible sehingga hal lain yang harus dicari adalah jika Anda menjadi pengguna yang berbeda saat menjalankan perintah. Pastikan Anda tidak melakukannya dengan 'sudo' misalnya atau itu akan mencoba mengakses kredensial root aws dan gagal jika tidak ada.
radtek
28

Jika Anda mencari cara alternatif, coba tambahkan kredensial Anda menggunakan AmazonCLI

dari tipe terminal: -

aws configure

lalu isi kunci dan wilayah Anda.

Amri
sumber
17

Pastikan file ~ / .aws / credentials Anda di Unix terlihat seperti ini:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Skrip Python Anda akan terlihat seperti ini, dan ini akan berfungsi:

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

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

TheWalkingData
sumber
1
The output = jsonbiasanya ditempatkan di ~/.aws/configdalam [profile MyProfile1]bagian. Ini mungkin tidak berfungsi jika ditentukan dalam credentialsfile sebagai gantinya.
cjs
@Curt J. Sampson Tanpa memeriksa, saya yakin Anda benar. Terima kasih atas koreksinya.
TheWalkingData
Saya mengekspor AWS_PROFILE = myprofle dan tidak berhasil tetapi ini berhasil. Penjelasan apa pun tentang mengapa hal itu mungkin terjadi.
Adarsh ​​Trivedi
5

Instruksi ini untuk mesin windows dengan satu profil pengguna untuk AWS. Pastikan ~/.aws/credentialsfile Anda terlihat seperti ini

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Saya harus menyetel AWS_DEFAULT_PROFILEvariabel lingkungan untuk profile_nameditemukan di kredensial Anda.
Kemudian python saya bisa terhubung. misalnya dari sini

import boto3

# Let's use Amazon S3
s3 = boto3.resource('s3')

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)
Hrushikesh Dhumal
sumber
1
Jika Anda mengatur variabel lingkungan pada Win10 di bagian mesin, Anda mungkin perlu melakukan reboot juga.
Trevor
1
@Trevor, saya menguji ini pada mesin windows 7 dengan notebook Jupyter, saya harus me-restart server Jupyter dan itu berhasil untuk saya, tetapi saya pikir reboot akan menjadi ide yang bagus.
Hrushikesh Dhumal
5

Saya juga mengalami masalah yang sama, ini dapat diselesaikan dengan membuat file konfigurasi dan kredensial di direktori home. Di bawah ini menunjukkan langkah-langkah yang saya lakukan untuk mengatasi masalah ini.

Buat file konfigurasi:

touch ~/.aws/config

Dan di file itu saya memasuki wilayah tersebut

[default]
region = us-west-2

Kemudian buat file kredensial:

touch ~/.aws/credentials

Kemudian masukkan kredensial Anda

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Setelah mengatur semua ini, maka file python saya untuk menghubungkan ember. Jalankan file ini akan menampilkan semua konten.

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)

Anda juga dapat merujuk tautan di bawah ini:

Nija I Pillai
sumber
4

dari tipe terminal: -

aws configure

lalu isi kunci dan wilayah Anda.

setelah ini lakukan langkah selanjutnya gunakan lingkungan apapun. Anda dapat memiliki banyak kunci tergantung akun Anda. Dapat mengelola banyak lingkungan atau kunci

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

Saya bekerja untuk perusahaan besar dan mengalami kesalahan yang sama, tetapi membutuhkan penyelesaian yang berbeda. Masalah saya terkait dengan pengaturan proxy. Saya sudah menyiapkan proxy, jadi saya perlu mengatur no_proxy saya ke daftar putih AWS sebelum saya bisa membuat semuanya berfungsi. Anda dapat mengaturnya di skrip bash Anda juga jika Anda tidak ingin membuat kode Python Anda kotor dengan pengaturan os.

Python:

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

Pesta:

export no_proxy = "s3.amazonaws.com"

Edit: Di atas asumsikan wilayah S3 Timur AS. Untuk wilayah lain: gunakan s3. [Wilayah] .amazonaws.com dengan wilayah seperti us-east-1 atau us-west-2

JJFord3
sumber
2
Aku punya masalah yang sama - tetapi harus mengatakan no_proxyuntuk 169.254.169.254sehingga klien AWS bisa mendapatkan layanan metadata untuk menemukan profil misalnya.
Ralph Bolton
0

Boto3 mencari kredensial di folder seperti

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

Anda harus menyimpan dua file di folder ini credentialsdan config.

Anda mungkin ingin memeriksa urutan umum di mana boto3 mencari kredensial di tautan ini . Lihat di bawah sub judul Mengonfigurasi Kredensial .

Samuel Nde
sumber
0

Jika Anda yakin Anda mengkonfigurasi aws Anda dengan benar, pastikan saja pengguna proyek dapat membaca dari ./aws atau jalankan proyek Anda sebagai root

Mohamed Hamed
sumber
0

Jika Anda memiliki beberapa profil aws di ~/.aws/credentialsseperti ...

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

Ikuti dua langkah:

  1. Buat satu yang ingin Anda gunakan sebagai default menggunakan export AWS_DEFAULT_PROFILE=Profile 1perintah di terminal.

  2. Pastikan untuk menjalankan perintah di atas di terminal yang sama dari tempat Anda menggunakan boto3 atau Anda membuka editor. [Pahami skenario berikut]

Skenario:

  • Jika Anda memiliki dua terminal terbuka disebut t1dan t2.
  • Dan Anda menjalankan perintah ekspor t1dan membuka JupyterLab atau yang lainnya t2, Anda akan mendapatkan NoCredentialsError: Tidak dapat menemukan kesalahan kredensial .

Larutan:

  • Jalankan perintah ekspor di t1lalu buka JupyterLab atau lainnya dari terminal yang sama t1.
Sanket Patel
sumber
0

Buat objek klien S3 dengan kredensial Anda

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)

Itu selalu bagus untuk mendapatkan kredensial dari lingkungan os

kathir raja
sumber