client boto3 NoRegionError: vous ne devez spécifier une erreur de région que parfois


147

J'ai un client boto3:

boto3.client('kms')

Mais cela arrive sur les nouvelles machines, ils s'ouvrent et se ferment dynamiquement.

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

Pourquoi cela arrive-t-il? et pourquoi seulement une partie du temps?


Parce que le client boto3 ne peut pas trouver le profil AWS à partir de l'ensemble de la méthode d'informations d'identification par défaut: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… .
mootmoot

Réponses:


326

D'une manière ou d'une autre, vous devez indiquer à boto3 dans quelle région vous souhaitez que le kmsclient soit créé. Cela pourrait être fait explicitement en utilisant le region_nameparamètre comme dans:

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

ou vous pouvez avoir une région par défaut associée à votre profil dans votre ~/.aws/configfichier comme dans:

[default]
region=us-west-2

ou vous pouvez utiliser une variable d'environnement comme dans:

export AWS_DEFAULT_REGION=us-west-2

mais vous devez indiquer à boto3 quelle région utiliser.


2
Comment savoir moi-même quelle région utiliser?
jononomo

1
Si vous essayez d'accéder aux ressources existantes, choisissez la région dans laquelle ces ressources existent. Si vous envisagez de créer de nouvelles ressources, la plupart des gens choisissent une région qui leur est géographiquement la plus proche pour des temps de réponse plus rapides. Toutes les régions ne prennent pas en charge le même ensemble de services, donc si vous avez besoin d'un service particulier, assurez-vous de choisir une région qui le prend en charge.
garnaat

1
Pour savoir quelles régions fournissent quels services: Tableau des régions
Nick

2
savez-vous pourquoi "exporter AWS_DEFAULT_REGION = us-west-2" ou ~ / .aws / config fichier ne fonctionne pas
fatih tekin

3
Je souhaite que boto3 puisse simplement utiliser la région de l'instance ec2 qui exécute le code.
Selçuk Cihan le

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

Dans mon cas, la sensibilité importait.


4

Je crois que, par défaut, boto choisit la région définie dans aws cli. Vous pouvez exécuter la commande #aws configure et appuyez sur Entrée (elle montre les crédits que vous avez définis dans aws cli avec région) pour confirmer votre région.


3

vous pouvez également définir des variables d'environnement dans le script lui-même, plutôt que de passer le paramètre region_name

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

la sensibilité à la casse peut être importante.


AWS_DEFAULT_REGIONest sensible à la casse.
Jaime M.

Il devrait être: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (majuscules)
Joe

2

Pour Python 2, j'ai trouvé que la bibliothèque boto3 ne source pas la région à partir du ~/.aws/configsi la région est définie dans un profil différent de celui par défaut. Il faut donc le définir lors de la création de session.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Où mon ~/.aws/configfichier ressemble à ceci:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Je fais cela parce que j'utilise différents profils pour différentes connexions à AWS, Personal et Work.


0

Pour ceux qui utilisent le modèle CloudFormation. Vous pouvez définir AWS_DEFAULT_REGIONune variable d'environnement à l'aide de UserData et AWS::Region. Par exemple,

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.