cliente boto3 NoRegionError: debe especificar un error de región solo a veces

147

Tengo un cliente boto3:

boto3.client('kms')

Pero sucede en máquinas nuevas, se abren y cierran dinámicamente.

    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 qué está pasando esto? ¿Y por qué solo una parte del tiempo?

WebQube
fuente
Debido a que el cliente boto3 no puede encontrar el perfil de AWS del conjunto de método de credenciales predeterminado: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
mootmoot el

Respuestas:

326

De una forma u otra, debe decirle a boto3 en qué región desea kmsque se cree el cliente. Esto podría hacerse explícitamente usando el region_nameparámetro como en:

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

o puede tener una región predeterminada asociada con su perfil en su ~/.aws/configarchivo como en:

[default]
region=us-west-2

o puede usar una variable de entorno como en:

export AWS_DEFAULT_REGION=us-west-2

pero necesita decirle a boto3 qué región usar.

Garnaat
fuente
2
¿Cómo sé qué región usar?
jononomo
1
Si está intentando acceder a los recursos existentes, elija la región en la que existen esos recursos. Si va a crear nuevos recursos, la mayoría de las personas eligen una región que está más cerca de ellos geográficamente para tiempos de respuesta más rápidos. No todas las regiones admiten el mismo conjunto de servicios, por lo que si necesita un servicio en particular, asegúrese de elegir una región que lo admita.
garnaat 01 de
1
Para saber qué regiones proporcionan qué servicios: Tabla de regiones de servicios web de Amazon aws.amazon.com/about-aws/global-infrastructure/…
Nick
2
¿sabe por qué "exportar AWS_DEFAULT_REGION = us-west-2" o el archivo ~ / .aws / config no funciona?
fatih tekin
3
Desearía que boto3 pudiera usar la región de la instancia ec2 que ejecuta el código.
Selçuk Cihan
12
os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

En mi caso, la sensibilidad importaba.

Anthony G
fuente
4

Creo que, por defecto, boto elige la región que se establece en aws cli. Puede ejecutar el comando #aws configure y presionar enter (muestra los créditos que ha establecido en aws cli con region) dos veces para confirmar su región.

josh eversman
fuente
3

También puede establecer variables de entorno en el script en sí, en lugar de pasar el parámetro region_name

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

mayúsculas y minúsculas pueden importar.

Abhishek Garg
fuente
AWS_DEFAULT_REGIONes sensible a mayúsculas y minúsculas
Jaime M.
Debería ser: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (mayúscula)
Joe
2

Para Python 2, descubrí que la biblioteca boto3 no obtiene la región de ~/.aws/configsi la región está definida en un perfil diferente al predeterminado. Entonces debes definirlo en la creación de la sesión.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Donde mi ~/.aws/configarchivo se ve así:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Hago esto porque utilizo diferentes perfiles para diferentes inicios de sesión en AWS, Personal y Trabajo.

David Edson
fuente
0

Para aquellos que usan la plantilla CloudFormation. Puede establecer AWS_DEFAULT_REGIONla variable de entorno utilizando UserData y AWS::Region. Por ejemplo,

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
fuente