Boto3 त्रुटि: botocore.exception.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अपनी क्रेडेंशियल फ़ाइल पर सीधे इंगित करने के लिए सेट करने का प्रयास करें ।
गन्नात

जैसा कि आपने वर्णित किया है, मैंने env वैरिएबल होम सेट किया है, लेकिन अब निम्न त्रुटि हो रही है। botocore.exceptions.NoRegionError: You must specify a region. * मेरी कॉन्फ़िग फ़ाइल config उसी फ़ोल्डर में स्थित है जो मेरे क्रेडेंशियल्स के रूप में है। [default] ap-northeast-1
d -_- b

1
मैं गार्नेट की टिप्पणी का उपयोग करके समस्या को ठीक करने में सक्षम था ।
लॉन्ड्रोमेट

जवाबों:


94

मैन्युअल रूप से कुंजी निर्दिष्ट करने का प्रयास करें

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

सुनिश्चित करें कि आप अपने ACCESS_ID और ACCESS_KEY को सीधे सुरक्षा चिंताओं के लिए कोड में शामिल नहीं करते हैं। @Tiger_Mike द्वारा सुझाए गए कोड में पर्यावरण कॉन्फ़िगरेशन का उपयोग करने और उन्हें इंजेक्ट करने पर विचार करें।

उत्पादक वातावरण के लिए घूर्णन एक्सेस कुंजियों का उपयोग करने पर विचार करें: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


Django पर सीधे हैंडल करते समय यह तरीका उपयोगी है। धन्यवाद।
जोप्रेलुडियन

1
यह अधिक खतरनाक है क्योंकि आप अपने रहस्यों को अपने कोड में डाल रहे हैं जो संस्करण नियंत्रण में समाप्त हो सकते हैं।
एनयू एवरेस्ट

4
@nueverest यह सही है, लेकिन आप घोषणा को एक सेटिंग फ़ाइल में ले जाकर और फिर पर्यावरण चर के माध्यम से इंजेक्ट करके इससे बच सकते हैं।
टाइगर_माइक

हालांकि यह काम करता है, मैं कहूंगा कि यह सर्वोत्तम प्रथाओं का पालन नहीं कर रहा है।
बेन जरमन

1
धन्यवाद। यह देव सेटअप में टेम्प फिक्स के रूप में उपयोग किया जा सकता है। एक .envफ़ाइल से इन चर लोड हो रहा है (प्रतिबद्ध नहीं) आदर्श होगा और ~/.aws/फ़ोल्डर से लेने से बेहतर होगा ।
सुपरनोवा

56

मेरे पास एक ही मुद्दा था और मुझे पता चला कि मेरी ~/.aws/credentialsफ़ाइल का प्रारूप गलत था।

इसमें एक फ़ाइल के साथ काम किया गया है:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

ध्यान दें कि प्रोफ़ाइल नाम " [default]" होना चाहिए । कुछ आधिकारिक दस्तावेज " [credentials]" नाम की एक प्रोफाइल का संदर्भ देते हैं , जो मेरे लिए काम नहीं करती थी।


1
खिड़कियों पर भी काम करता है (C: \ Users \ User \ .aws \ क्रेडेंशियल्स)
Mr_and_Mrs_D

4
आप सत्र = boto3.Session (प्रोफ़ाइल_नाम = <your_profile>) का उपयोग करके boto3 में किस प्रोफ़ाइल का उपयोग कर सकते हैं
मैटिया

का उपयोग करना aws configureभी काम करता है अगर आप aws-cli स्थापित है
radtek

2
मैं इसे देखने के लिए एक और चीज़ के माध्यम से चला रहा था, अगर आप कमांड चलाते समय एक अलग उपयोगकर्ता बन जाते हैं। सुनिश्चित करें कि आप इसे उदाहरण के लिए 'sudo' के साथ नहीं कर रहे हैं या यह मूल aws क्रेडेंशियल्स को एक्सेस करने का प्रयास करेगा और यदि वे मौजूद नहीं हैं तो विफल हो जाएंगे।
राडेक

28

यदि आप एक वैकल्पिक रास्ता तलाश रहे हैं, तो AmazonCLI का उपयोग करके अपनी साख को जोड़ने का प्रयास करें

टर्मिनल प्रकार से: -

aws configure

फिर अपनी कुंजी और क्षेत्र भरें।


17

सुनिश्चित करें कि यूनिक्स में आपकी ~ / .aws / क्रेडेंशियल फ़ाइल इस प्रकार है:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

आपकी पायथन लिपि इस तरह दिखनी चाहिए, और यह काम करेगी:

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

@ कर्ट जे सैम्पसन जाँच के बिना, मुझे यकीन है कि आप सही हैं। सुधारों के लिए धन्यवाद।
TheWalkingData

मैंने AWS_PROFILE = myprofle निर्यात किया और यह काम नहीं किया लेकिन यह काम किया। ऐसा क्यों हो सकता है, इस पर कोई स्पष्टीकरण।
आदर्श त्रिवेदी

5

ये निर्देश एडब्ल्यूएस के लिए एकल उपयोगकर्ता प्रोफ़ाइल के साथ विंडोज़ मशीन के लिए हैं। सुनिश्चित करें कि आपकी ~/.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
@ ट्रेवर, मैंने इसे Jupyter नोटबुक के साथ एक विंडो 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

इन सभी को सेट करने के बाद, फिर बाल्टी को जोड़ने के लिए मेरी अजगर फ़ाइल। इस फ़ाइल को चलाएं सभी सामग्री को सूचीबद्ध करेगा।

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 में सेट करने की आवश्यकता थी। यदि आप अपने अजगर कोड को ओएस सेटिंग्स के साथ मैला नहीं करना चाहते हैं तो आप इसे अपने बैश स्क्रिप्ट में भी सेट कर सकते हैं।

अजगर:

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

दे घुमा के:

export no_proxy = "s3.amazonaws.com"

संपादित करें: ऊपर एक अमेरिकी पूर्व S3 क्षेत्र मान। अन्य क्षेत्रों के लिए: s3 का उपयोग करें। [क्षेत्र] .amazonaws.com जहां क्षेत्र हमारे जैसा कुछ है-पूर्व -1 या हम-पश्चिम -2


2
मैं ने वही समस्या थी - लेकिन कहना था no_proxyके लिए 169.254.169.254इतना एडब्ल्यूएस ग्राहक उदाहरण प्रोफ़ाइल ढूंढने के लिए मेटाडेटा सेवा करने के लिए मिल सकता है।
राल्फ बोल्टन

0

Boto3 जैसे फ़ोल्डर में क्रेडेंशियल्स की तलाश है

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

आपको इस फ़ोल्डर में दो फ़ाइलों को सहेजना चाहिए credentialsऔरconfig

आप सामान्य क्रम को देखना चाहते हैं जिसमें boto3 क्रेडेंशियल के लिए खोज करता है इस लिंककॉन्फ़िगरेशन क्रेडेंशियल उप शीर्षक के तहत देखें ।


0

यदि आप सुनिश्चित हैं कि आप अपने aws को सही तरीके से कॉन्फ़िगर कर रहे हैं, तो सुनिश्चित करें कि प्रोजेक्ट का उपयोगकर्ता / .aw से पढ़ सकता है या बस अपने रूट के रूप में चला सकता है।


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.