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?

WebQube
źródło
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ć.

garnaat
źródło
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ść.

Anthony G.
źródło
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.

josh eversman
źródło
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.

Abhishek Garg
źródło
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.

David Edson
źródło
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
Marcin
źródło