ไคลเอ็นต์ boto3 NoRegionError: คุณต้องระบุข้อผิดพลาดของภูมิภาคบางครั้งเท่านั้น


147

ฉันมีลูกค้า boto3:

boto3.client('kms')

แต่มันเกิดขึ้นในเครื่องใหม่พวกเขาเปิดและปิดแบบไดนามิก

    if endpoint is None:
        if region_name is None:
            # Raise a more specific error message that will give
            # better guidance to the user what needs to happen.
            raise NoRegionError()

ทำไมสิ่งนี้จึงเกิดขึ้น และทำไมส่วนหนึ่งของเวลาเท่านั้น?


เพราะลูกค้า boto3 ไม่สามารถหารายละเอียด AWS จากชุดของข้อมูลประจำตัวของวิธีการเริ่มต้น: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/...
mootmoot

คำตอบ:


326

ไม่ทางใดก็ทางหนึ่งคุณต้องบอก boto3 ในภูมิภาคที่คุณต้องการให้kmsลูกค้าสร้าง สิ่งนี้สามารถทำได้อย่างชัดเจนโดยใช้region_nameพารามิเตอร์ใน:

kms = boto3.client('kms', region_name='us-west-2')

หรือคุณสามารถมีพื้นที่เริ่มต้นที่เชื่อมโยงกับโปรไฟล์ของคุณใน~/.aws/configไฟล์ของคุณใน:

[default]
region=us-west-2

หรือคุณสามารถใช้ตัวแปรสภาพแวดล้อมเช่นเดียวกับใน:

export AWS_DEFAULT_REGION=us-west-2

แต่คุณต้องบอก boto3 ว่าจะใช้พื้นที่ไหน


2
ฉันจะรู้ได้อย่างไรว่าจะใช้พื้นที่ใด
jononomo

1
หากคุณพยายามเข้าถึงทรัพยากรที่มีอยู่ให้เลือกภูมิภาคที่มีทรัพยากรเหล่านั้นอยู่ หากคุณกำลังจะสร้างแหล่งข้อมูลใหม่ ๆ คนส่วนใหญ่จะเลือกภูมิภาคที่ใกล้เคียงกับพื้นที่ทางภูมิศาสตร์มากที่สุดสำหรับเวลาตอบสนองที่รวดเร็วขึ้น ไม่ใช่ทุกภูมิภาคที่สนับสนุนชุดบริการเดียวกันดังนั้นหากคุณต้องการบริการที่เฉพาะเจาะจงตรวจสอบให้แน่ใจว่าคุณเลือกภูมิภาคที่รองรับ
garnaat

1
หากต้องการทราบว่าภูมิภาคใดให้บริการใด: ตารางภูมิภาคบริการเว็บของ Amazon aws.amazon.com/about-aws/global-infrastructure/…
นิค

2
คุณรู้หรือไม่ว่าทำไม "ส่งออก AWS_DEFAULT_REGION = us-west-2" หรือไฟล์ ~ / .aws / config ไม่ทำงาน
fatih tekin

3
ฉันหวังว่า boto3 สามารถใช้พื้นที่ของอินสแตนซ์ ec2 ที่รันโค้ดได้
Selçuk Cihan


4

ฉันเชื่อว่าโดยค่าเริ่มต้น boto เลือกภูมิภาคที่ตั้งค่าไว้ใน aws cli คุณสามารถเรียกใช้คำสั่ง #aws กำหนดค่าและกด Enter (มันแสดงให้เห็นว่าเครดิตที่คุณได้ตั้งค่าใน aws cli กับภูมิภาค) สองครั้งเพื่อยืนยันภูมิภาคของคุณ


3

คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อมในสคริปต์แทนการส่งผ่านพารามิเตอร์ region_name

os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

ความไวของกรณีอาจมีความสำคัญ


AWS_DEFAULT_REGIONคำนึงถึงขนาดตัวพิมพ์
Jaime M.

ควรเป็น: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (ตัวพิมพ์ใหญ่)
Joe

2

สำหรับ Python 2 ฉันได้พบว่าไลบรารี boto3 ไม่ได้มาจากภูมิภาค~/.aws/configถ้าหากมีการกำหนดขอบเขตในโปรไฟล์ที่แตกต่างไปเป็นค่าเริ่มต้น ดังนั้นคุณต้องกำหนดมันในการสร้างเซสชั่น

session = boto3.Session(
    profile_name='NotDefault',
    region_name='ap-southeast-2'
)

print(session.available_profiles)

client = session.client(
    'ec2'
)

~/.aws/configไฟล์ของฉันมีลักษณะดังนี้:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

ฉันทำเช่นนี้เพราะฉันใช้รูปแบบที่แตกต่างกันสำหรับการเข้าสู่ระบบที่แตกต่างกันไปยัง AWS ส่วนบุคคลและที่ทำงาน


0

สำหรับผู้ที่ใช้แม่แบบ CloudFormation คุณสามารถตั้งค่าAWS_DEFAULT_REGIONตัวแปรสภาพแวดล้อมโดยใช้ UserData AWS::Regionและ ตัวอย่างเช่น,

MyInstance1:
    Type: AWS::EC2::Instance                
    Properties:                           
        ImageId: ami-04b9e92b5572fa0d1 #ubuntu
        InstanceType: t2.micro
        UserData: 
            Fn::Base64: !Sub |
                    #!/bin/bash -x

                    echo "export AWS_DEFAULT_REGION=${AWS::Region}" >> /etc/profile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.