boto3 client NoRegionError: Błąd regionu należy określić tylko czasami


147

Mam klienta boto3:

boto3.client('kms')

Ale dzieje się to na nowych maszynach, otwierają się i zamykają dynamicznie.

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

Dlaczego to się dzieje? i dlaczego tylko przez część czasu?


Ponieważ klient boto3 nie może znaleźć profilu AWS z zestawu domyślnych metod uwierzytelniania: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
mootmoot

Odpowiedzi:


326

Tak czy inaczej, musisz powiedzieć boto3, w którym regionie chcesz, aby kmsklient został utworzony. Można to zrobić jawnie używając region_nameparametru, jak w:

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

lub możesz mieć domyślny region powiązany z Twoim profilem w swoim ~/.aws/configpliku, jak w:

[default]
region=us-west-2

lub możesz użyć zmiennej środowiskowej, jak w:

export AWS_DEFAULT_REGION=us-west-2

ale musisz powiedzieć boto3, którego regionu użyć.


2
Skąd mam wiedzieć, którego regionu użyć?
jononomo

1
Jeśli próbujesz uzyskać dostęp do istniejących zasobów, wybierz region, w którym te zasoby istnieją. Jeśli zamierzasz tworzyć nowe zasoby, większość ludzi wybiera region, który jest im najbliższy geograficznie, aby skrócić czas reakcji. Nie wszystkie regiony obsługują ten sam zestaw usług, więc jeśli potrzebujesz określonej usługi, wybierz region, który ją obsługuje.
garnaat

1
Aby dowiedzieć się, które regiony zapewniają jakie usługi: Tabela regionów Amazon Web Services aws.amazon.com/about-aws/global-infrastructure/…
Nick

2
czy wiesz dlaczego „export AWS_DEFAULT_REGION = us-west-2” lub plik ~ / .aws / config nie działa
fatih tekin

3
Chciałbym, żeby boto3 po prostu używał regionu instancji ec2, na której działa kod.
Selçuk Cihan

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

W moim przypadku liczy się wrażliwość.


4

Uważam, że domyślnie boto wybiera region ustawiony w aws cli. Możesz uruchomić polecenie #aws configure i nacisnąć Enter (pokazuje, jakie kredyty ustawiłeś w aws cli z regionem) dwukrotnie, aby potwierdzić swój region.


3

możesz także ustawić zmienne środowiskowe w samym skrypcie, zamiast przekazywać parametr nazwa_regionu

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

wielkość liter może mieć znaczenie.


AWS_DEFAULT_REGIONrozróżnia wielkość liter.
Jaime M.,

Powinno być: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (wielkie litery)
Joe

2

W przypadku Pythona 2 odkryłem, że biblioteka boto3 nie pobiera regionu z regionu, ~/.aws/configjeśli region jest zdefiniowany w innym profilu domyślnie. Więc musisz to zdefiniować podczas tworzenia sesji.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Gdzie mój ~/.aws/configplik wygląda tak:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Robię to, ponieważ używam różnych profili do różnych loginów do AWS, Personal i Work.


0

Dla osób korzystających z szablonu CloudFormation. Możesz ustawić AWS_DEFAULT_REGIONzmienną środowiskową za pomocą UserData i AWS::Region. Na przykład,

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.