klien boto3 NoRegionError: Anda harus menentukan kesalahan wilayah hanya sesekali


161

Saya memiliki klien boto3:

boto3.client('kms')

Tapi itu terjadi pada mesin baru, Mereka membuka dan menutup secara dinamis.

    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()

Mengapa ini terjadi? dan mengapa hanya sebagian saja?


Karena klien boto3 tidak dapat menemukan profil AWS dari kumpulan metode kredensial default: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
diperdebatkan

Jawaban:


354

Dengan satu atau lain cara Anda harus memberi tahu boto3 di wilayah mana Anda ingin kmsklien dibuat. Ini dapat dilakukan secara eksplisit menggunakan region_nameparameter seperti di:

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

atau Anda dapat memiliki wilayah default yang terkait dengan profil Anda di ~/.aws/configfile Anda seperti di:

[default]
region=us-west-2

atau Anda dapat menggunakan variabel lingkungan seperti:

export AWS_DEFAULT_REGION=us-west-2

tetapi Anda perlu memberi tahu boto3 wilayah mana yang digunakan.


2
Bagaimana saya tahu sendiri wilayah mana yang akan digunakan?
jononomo

1
Jika Anda mencoba mengakses sumber daya yang ada, pilih wilayah tempat sumber daya tersebut berada. Jika Anda akan membuat sumber daya baru, kebanyakan orang memilih wilayah yang paling dekat dengan mereka secara geografis untuk waktu respons yang lebih cepat. Tidak semua wilayah mendukung rangkaian layanan yang sama, jadi jika Anda membutuhkan layanan tertentu, pastikan Anda memilih wilayah yang mendukungnya.
garnaat

1
Untuk mengetahui wilayah mana yang menyediakan layanan mana: Tabel Wilayah Layanan Web Amazon aws.amazon.com/about-aws/global-infrastructure/…
Nick

2
apakah Anda tahu mengapa "ekspor AWS_DEFAULT_REGION = us-west-2" atau ~ / .aws / file config tidak berfungsi
fatih tekin

3
Saya berharap boto3 bisa menggunakan wilayah contoh ec2 yang menjalankan kode.
Selçuk Cihan

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

Dalam kasus saya, kepekaan penting.


5

Untuk Python 2 saya telah menemukan bahwa pustaka boto3 tidak mengambil sumber wilayah dari ~/.aws/configjika wilayah tersebut didefinisikan dalam profil yang berbeda ke default. Jadi, Anda harus menentukannya dalam pembuatan sesi.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Di mana ~/.aws/configfile saya terlihat seperti ini:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Saya melakukan ini karena saya menggunakan profil yang berbeda untuk login berbeda ke AWS, Personal dan Work.


4

Saya percaya, secara default, boto memilih wilayah yang disetel di aws cli. Anda dapat menjalankan perintah #aws configure dan tekan enter (ini menunjukkan kredibilitas apa yang telah Anda setel di aws cli dengan wilayah) dua kali untuk mengonfirmasi wilayah Anda.


3

Anda juga dapat menyetel variabel lingkungan di skrip itu sendiri, daripada meneruskan parameter region_name

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

sensitivitas kasus mungkin penting.


AWS_DEFAULT_REGIONpeka huruf besar / kecil.
Jaime M.

Seharusnya: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (huruf besar)
Joe

0

Bagi mereka yang menggunakan template CloudFormation. Anda dapat menyetel AWS_DEFAULT_REGIONvariabel lingkungan menggunakan UserData dan AWS::Region. Sebagai contoh,

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

0

Atau Anda dapat menjalankan yang berikut ini (aws cli)

aws configure --profile $PROFILE_NAME

itu akan meminta Anda untuk wilayah tersebut.

perhatikan di ~/.aws/configdalamnya:

[default]
region = ap-southeast-1
output = json

[profile prod]
region = ap-southeast-1
output = json

[ Profil nama profil ] dalam kurung kotak

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.