client boto3 NoRegionError: è necessario specificare un errore di regione solo a volte


147

Ho un client boto3:

boto3.client('kms')

Ma succede su nuove macchine, si aprono e si chiudono 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()

Perché sta succedendo? e perché solo una parte del tempo?


Perché il client boto3 non riesce a trovare il profilo AWS dall'insieme del metodo delle credenziali predefinito: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
mootmoot,

Risposte:


326

In un modo o nell'altro devi dire a boto3 in quale regione desideri kmscreare il client. Questo potrebbe essere fatto esplicitamente usando il region_nameparametro come in:

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

oppure puoi avere una regione predefinita associata al tuo profilo nel tuo ~/.aws/configfile come in:

[default]
region=us-west-2

oppure puoi usare una variabile d'ambiente come in:

export AWS_DEFAULT_REGION=us-west-2

ma devi dire a boto3 quale regione usare.


2
Come faccio a sapere me stesso quale regione utilizzare?
jononomo,

1
Se si sta tentando di accedere alle risorse esistenti, selezionare l'area in cui tali risorse esistono. Se hai intenzione di creare nuove risorse, la maggior parte delle persone sceglie una regione più vicina geograficamente per tempi di risposta più rapidi. Non tutte le regioni supportano lo stesso set di servizi, quindi se hai bisogno di un servizio particolare assicurati di scegliere una regione che lo supporti.
garnaat

1
Per scoprire quali regioni forniscono quali servizi: Tabella delle regioni dei servizi Web di Amazon aws.amazon.com/about-aws/global-infrastructure/…
Nick,

2
sai perché "esportazione AWS_DEFAULT_REGION = us-west-2" o file ~ / .aws / config non funzionante
fatih tekin,

3
Vorrei che boto3 potesse semplicemente usare la regione dell'istanza ec2 che esegue il codice.
Selçuk Cihan,

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

Nel mio caso la sensibilità contava.


4

Credo che, per impostazione predefinita, boto scelga la regione impostata in aws cli. Puoi eseguire il comando #aws configure e premere invio (mostra quali credenziali hai impostato in aws cli con region) due volte per confermare la tua regione.


3

puoi anche impostare variabili di ambiente nello script stesso, anziché passare il parametro region_name

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

la distinzione tra maiuscole e minuscole può avere importanza.


AWS_DEFAULT_REGIONfa distinzione tra maiuscole e minuscole.
Jaime M.

Dovrebbe essere: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (maiuscolo)
Joe

2

Per Python 2 ho scoperto che la libreria boto3 non ha origine dalla regione ~/.aws/configse la regione è definita in un profilo diverso da quello predefinito. Quindi devi definirlo nella creazione della sessione.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Dove il mio ~/.aws/configfile è simile al seguente:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Lo faccio perché utilizzo profili diversi per accessi diversi a AWS, Personal e Work.


0

Per coloro che utilizzano il modello CloudFormation. È possibile impostare AWS_DEFAULT_REGIONla variabile di ambiente utilizzando UserData e AWS::Region. Per esempio,

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.