cliente boto3 NoRegionError: Você deve especificar um erro de região apenas algumas vezes

147

Eu tenho um cliente boto3:

boto3.client('kms')

Mas acontece em novas máquinas, elas abrem e fecham dinamicamente.

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

Por que isso está acontecendo? e por que apenas parte do tempo?

WebQube
fonte
Como o cliente boto3 não pode encontrar o perfil da AWS no conjunto de métodos de credenciais padrão: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
mootmoot

Respostas:

325

De uma maneira ou de outra, você deve informar ao boto3 em que região você deseja que o kmscliente seja criado. Isso pode ser feito explicitamente usando o region_nameparâmetro como em:

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

ou você pode ter uma região padrão associada ao seu perfil no seu ~/.aws/configarquivo como em:

[default]
region=us-west-2

ou você pode usar uma variável de ambiente como em:

export AWS_DEFAULT_REGION=us-west-2

mas você precisa informar ao boto3 qual região usar.

garnaat
fonte
2
Como eu me conheço qual região usar?
jononomo
1
Se você estiver tentando acessar os recursos existentes, escolha a região em que esses recursos existem. Se você deseja criar novos recursos, a maioria das pessoas escolhe uma região mais próxima geograficamente para obter tempos de resposta mais rápidos. Nem todas as regiões suportam o mesmo conjunto de serviços; portanto, se você precisar de um serviço específico, escolha uma região que o suporte.
garnaat
1
Para descobrir quais regiões fornecem quais serviços: Tabela Região da Amazon Web Services aws.amazon.com/about-aws/global-infrastructure/…
Nick
2
você sabe por que "AWS_DEFAULT_REGION exportação nos-west-2 =" ~ / .aws arquivo / config ou não está funcionando
Fatih tekin
3
Eu gostaria que o boto3 pudesse apenas usar a região da instância ec2 que está executando o código.
Selçuk Cihan
12
os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

No meu caso, a sensibilidade importava.

Anthony G
fonte
4

Eu acredito que, por padrão, o boto escolhe a região que está definida no aws cli. Você pode executar o comando #aws configure e pressionar enter (mostra quais creds você definiu no aws cli with region) duas vezes para confirmar sua região.

josh eversman
fonte
3

você também pode definir variáveis ​​de ambiente no próprio script, em vez de passar o parâmetro region_name

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

a sensibilidade do caso pode ser importante.

Abhishek Garg
fonte
AWS_DEFAULT_REGIONdiferencia maiúsculas de minúsculas.
Jaime M.
Deveria ser: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (maiúscula)
Joe
2

Para Python 2, descobri que a biblioteca boto3 não origina a região ~/.aws/configse a região estiver definida em um perfil diferente ao padrão. Então você precisa defini-lo na criação da sessão.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Onde meu ~/.aws/configarquivo se parece com isso:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Faço isso porque uso perfis diferentes para logins diferentes no AWS, Personal e Work.

David Edson
fonte
0

Para aqueles que usam o modelo CloudFormation. Você pode definir AWS_DEFAULT_REGIONa variável de ambiente usando UserData e AWS::Region. Por exemplo,

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
fonte