2017-09-25 4 views
0

J'essaie de créer des instances ponctuelles dans différentes régions à l'aide de boto3. Mes régions par défaut définies comme us-east-1.Créer des instances ponctuelles dans différentes régions

Quand je suis en train de créer les instances ponctuelles dans différentes régions du par défaut, une exception est levée avec ce message:

botocore.exceptions.ClientError: An error occurred (InvalidParameterValue) when calling the RequestSpotInstances operation: Invalid availability zone: [eu-west-2b] 

Les instances créées en utilisant cet extrait de code:

for idx in range(len(regions)): 
    client.request_spot_instances(
      DryRun=False, 
      SpotPrice=price_bids, 
      InstanceCount=number_of_instances, 
      LaunchSpecification= 
      { 
       'ImageId': ami_id, 
       'KeyName': 'matrix', 
       'SecurityGroupIds': ['sg-5f07f52c'], 
       'SecurityGroups': ['MatrixSG'], 
       'InstanceType': machine_type, 
       'Placement': 
        { 
         'AvailabilityZone': regions[idx], 
        }, 
      }, 
    ) 
+0

Si vous accédez à la console de gestion EC2 de ce compte AWS et que vous vous rendez dans la région de Londres, quels sont les AZ affichés lorsque vous tentez de lancer une instance EC2 (dans le champ Sous-réseaux)? De plus, ce groupe de sécurité est-il défini dans 'eu-west-2'? (BTW, il n'y a probablement pas besoin d'inclure à la fois 'SecurityGroupIds' et' SecurityGroups'.) –

+0

@JohnRotenstein Oui, le groupe de sécurité existe dans cette région. J'ai également copié l'AMI dans cette région. – liorko

Répondre

0

Je suppose que votre liste regions contient effectivement une liste de Zones de disponibilité plutôt que des régions (puisqu'il est dit 'AvailabilityZone': regions[idx]).

Chaque région AWS fonctionne indépendamment. Lorsque vous établissez une connexion à un service AWS, vous devez vous connecter au service spécifique dans une région spécifique.

Par exemple:

client = boto3.client('ec2') 

Ce connecte à EC2 dans votre région par défaut.

Vous pouvez spécifier une région:

client = boto3.client('ec2', region_name = 'eu-west-2') 

Vous recevez l'erreur Invalid availability zone parce que votre client est connecté à une région (par exemple us-east-1), mais fait référence à une zone de disponibilité qui est dans une autre région (par exemple eu-west-2b).

Votre code crée uniquement le client une seule fois, mais tente de se connecter à plusieurs régions. La solution est créer une nouvelle connexion client pour la région que vous souhaitez utiliser. Si votre boucle se connecte à plusieurs régions, le client doit être défini dans la boucle plutôt qu'en dehors de la boucle.