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

Почему это происходит? и почему только часть времени?

WebQube
источник
Поскольку клиенту 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, какой регион использовать.

garnaat
источник
2
Откуда я знаю, какой регион использовать?
jononomo
1
Если вы пытаетесь получить доступ к существующим ресурсам, выберите регион, в котором эти ресурсы существуют. Если вы собираетесь создавать новые ресурсы, большинство людей выбирают регион, наиболее близкий к ним географически, для более быстрого отклика. Не все регионы поддерживают один и тот же набор услуг, поэтому, если вам нужна конкретная услуга, убедитесь, что вы выбрали регион, который ее поддерживает.
17
1
Чтобы узнать, какие регионы предоставляют какие услуги: Таблица регионов
Ник
2
Знаете ли вы, почему не работает файл экспорта AWS_DEFAULT_REGION = us-west-2 или ~ / .aws / config
Фатих Текин
3
Я хотел бы, чтобы boto3 мог просто использовать регион экземпляра ec2, на котором выполняется код.
Сельчук Джихан
12
os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

В моем случае чувствительность имела значение.

Энтони Дж
источник
4

Я считаю, что по умолчанию boto выбирает регион, заданный в aws cli. Вы можете запустить команду #aws configure и дважды нажать клавишу ввода (она показывает, какие кредиты вы установили в aws cli с регионом), чтобы подтвердить свой регион.

Джош Эверсман
источник
3

Вы также можете установить переменные окружения в самом скрипте вместо передачи параметра region_name

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

чувствительность к регистру может иметь значение.

Абхишек Гарг
источник
AWS_DEFAULT_REGIONчувствителен к регистру.
Хайме М.
Это должно быть: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (верхний регистр)
Джо
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, Personal и Work.

Дэвид Эдсон
источник
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
Marcin
источник