จะระบุข้อมูลรับรองเมื่อเชื่อมต่อกับ boto3 S3 ได้อย่างไร?


109

ใน boto ฉันเคยระบุข้อมูลประจำตัวของฉันเมื่อเชื่อมต่อกับ S3 ด้วยวิธีดังกล่าว:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )

จากนั้นฉันสามารถใช้ S3 เพื่อดำเนินการได้ (ในกรณีของฉันคือการลบวัตถุออกจากที่เก็บข้อมูล)

ด้วย boto3 ตัวอย่างทั้งหมดที่ฉันพบมีดังนี้:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()

ฉันไม่สามารถระบุข้อมูลรับรองของฉันได้ดังนั้นความพยายามทั้งหมดจึงล้มเหลวด้วยInvalidAccessKeyIdข้อผิดพลาด

ฉันจะระบุข้อมูลรับรองด้วย boto3 ได้อย่างไร?


คำตอบนี้อาจช่วยคุณได้: stackoverflow.com/a/36913771/2681632
Ilja Everilä

2
ดูส่วน "การกำหนดค่าข้อมูลรับรอง" ในเอกสารอย่างเป็นทางการ: boto3.readthedocs.io/en/latest/guide/configuration.html
Mark B

คำตอบ:


169

คุณสามารถสร้างเซสชัน :

import boto3
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY,
)

จากนั้นใช้เซสชันนั้นเพื่อรับทรัพยากร S3:

s3 = session.resource('s3')

25
ได้ผลฉันจะถือเป็นคำตอบ ทำไมพวกเขาถึงไม่บันทึกสิ่งนี้ไว้เป็นวิธีการที่ชัดเจน !!
Robert Brax

3
ตามที่ระบุไว้ในความคิดเห็นข้างต้นนี้คือในความเป็นจริงในเอกสาร
Moot

74

คุณสามารถรับclientเซสชันใหม่ได้โดยตรงตามด้านล่าง

 s3_client = boto3.client('s3', 
                      aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, 
                      aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY, 
                      region_name=REGION_NAME
                      )

10
สิ่งนี้ใช้ได้กับการรับไคลเอนต์ s3 แต่ OP ต้องการทรัพยากร s3 แทน
Alasdair

ฉันเห็นด้วยกับ @Alasdair เอกสารไม่ได้แสดงวิธีการทำอะไรกับลูกค้าและคุณก็ไม่ได้ทำเช่นกันดังนั้นฉันจึงไม่เห็นว่าคำตอบนี้เกี่ยวข้องอย่างไร
Cerin

ฉันลองแล้ว แต่มันทำให้ฉันเกิดข้อผิดพลาด "Unable to locate credentials" .. ฉันเคยลบโฟลเดอร์ ~ / .aws ออกไปก่อนหน้านี้เพื่อทดสอบสิ่งนี้เพราะฉันรู้ว่า boto จะมองหาเครดิตที่นั่นโดยค่าเริ่มต้น ...
Prathamesh dhanawade

8

เก่ากว่านี้ แต่วางไว้ที่นี่เพื่อใช้อ้างอิงด้วย boto3.resource เป็นเพียงการใช้งาน Session เริ่มต้นคุณสามารถส่งผ่านรายละเอียดเซสชัน boto3.resource

Help on function resource in module boto3:

resource(*args, **kwargs)
    Create a resource service client by name using the default session.

    See :py:meth:`boto3.session.Session.resource`.

https://github.com/boto/boto3/blob/86392b5ca26da57ce6a776365a52d3cab8487d60/boto3/session.py#L265

คุณจะเห็นว่ามันใช้อาร์กิวเมนต์เดียวกับ Boto3.Session

import boto3
S3 = boto3.resource('s3', region_name='us-west-2', aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY)
S3.Object( bucket_name, key_name ).delete()

5

ฉันต้องการขยายคำตอบของ @ JustAGuy วิธีที่ฉันชอบคือใช้AWS CLIสร้างไฟล์กำหนดค่า เหตุผลก็คือเมื่อใช้ไฟล์กำหนดค่าCLIหรือSDKจะค้นหาข้อมูลรับรองใน~/.awsโฟลเดอร์โดยอัตโนมัติ และสิ่งที่ดีAWS CLIคือเขียนด้วยภาษาไพ ธ อน

คุณสามารถรับ cli จาก pypi ได้หากคุณยังไม่มี ขั้นตอนในการตั้งค่า cli จากเทอร์มินัลมีดังนี้

$> pip install awscli  #can add user flag 
$> aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:

หลังจากนี้คุณสามารถเข้าถึงbotoและ api ใด ๆ โดยไม่ต้องระบุคีย์ (เว้นแต่คุณต้องการใช้ข้อมูลรับรองอื่น)


2

มีหลายวิธีในการจัดเก็บข้อมูลประจำตัวในขณะที่ยังใช้ boto3.resource () ฉันใช้วิธี AWS CLI ด้วยตัวเอง มันทำงานได้อย่างสมบูรณ์

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html?fbclid=IwAR2LlrS4O2gYH6xAF4QDVIH2Q2tzfF_VZ6loM3XfXsPAOR4qA-pX_qAILys

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