ข้อผิดพลาด 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จากที่ Boto ควรอ่านข้อมูลรับรองของฉัน

การตั้งค่าของฉันผิดหรือไม่?

นี่คือผลลัพธ์จาก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 จะค้นหาตำแหน่งไม่กี่แห่งสำหรับไฟล์ config หนังสือรับรอง แต่ดูเหมือนจะไม่ได้ดูในโฮมไดเร็กทอรีของฉันด้วยเหตุผลบางประการ ...
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
ง -_- ข

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

1
ขอบคุณ. สิ่งนี้สามารถใช้เป็นการแก้ไขชั่วคราวในการตั้งค่า dev การโหลดตัวแปรเหล่านี้จาก.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>)
Mattia Paterna

การใช้aws configureงานยังใช้งานได้หากคุณติดตั้ง aws-cli
radtek

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

@ เคิร์ตเจ. แซมป์สันโดยไม่ต้องตรวจสอบฉันแน่ใจว่าคุณพูดถูก ขอบคุณสำหรับการแก้ไข
TheWalkingData

ฉันส่งออก AWS_PROFILE = myprofle แล้ว แต่ใช้ไม่ได้ผล คำอธิบายเกี่ยวกับสาเหตุที่อาจเกิดขึ้น
Adarsh ​​Trivedi

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 ก่อนที่ฉันจะสามารถทำให้ทุกอย่างทำงานได้ คุณสามารถตั้งค่าในสคริปต์ทุบตีของคุณได้เช่นกันหากคุณไม่ต้องการทำให้โค้ด Python ของคุณยุ่งเหยิงด้วยการตั้งค่าระบบปฏิบัติการ

Python:

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

ทุบตี:

export no_proxy = "s3.amazonaws.com"

แก้ไข: ข้างต้นถือว่าเป็นภูมิภาค US East S3 สำหรับภูมิภาคอื่น ๆ : ใช้ s3. [region] .amazonaws.com โดยที่ region คือ us-east-1 หรือ us-west-2


2
ฉันมีปัญหาคล้ายกัน - แต่ต้องพูดno_proxyเพื่อ169.254.169.254ให้ไคลเอนต์ AWS สามารถเข้าถึงบริการข้อมูลเมตาเพื่อค้นหาโปรไฟล์อินสแตนซ์ได้
Ralph Bolton

0

boto3 กำลังมองหาข้อมูลประจำตัวในโฟลเดอร์เช่น

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

คุณควรบันทึกสองไฟล์ในโฟลเดอร์นี้credentialsและconfig .

คุณอาจต้องการดูลำดับทั่วไปที่ boto3 ค้นหาข้อมูลรับรองในลิงค์นี้ ดูภายใต้หัวข้อย่อยConfiguring Credentials


0

หากคุณแน่ใจว่าคุณกำหนดค่า aws ของคุณอย่างถูกต้องตรวจสอบให้แน่ใจว่าผู้ใช้ของโครงการสามารถอ่านจาก ./ awsหรือเรียกใช้โครงการของคุณในฐานะรูท


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)

การได้รับข้อมูลประจำตัวจากสภาพแวดล้อมระบบปฏิบัติการเป็นสิ่งที่ดีเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.