2017-09-25 3 views
0

Ich versuche Spot-Instanzen in verschiedenen Regionen mit Boto3 zu erstellen. Meine Standardregionen definiert als us-east-1.Erstellen Sie Spot-Instanzen in verschiedenen Regionen

Wenn ich versuche, die vor Ort Instanzen in verschiedenem Bereich von dem Standard zu erstellen, wird eine Ausnahme mit dieser Meldung ausgelöst:

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

Die Instanzen erstellt diesen Code-Schnipsel mit:

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

Wenn Sie in diesem AWS-Konto in die EC2-Verwaltungskonsole wechseln und in die Region London wechseln, welche AZs werden angezeigt, wenn Sie versuchen, eine EC2-Instanz (im Feld Subnetze) zu starten? Ist diese Sicherheitsgruppe in "eu-west-2" definiert? (Übrigens ist es wahrscheinlich nicht notwendig, sowohl "SecurityGroupIds" als auch "SecurityGroups" einzubeziehen.) –

+0

@JohnRotenstein Ja, die Sicherheitsgruppe existiert in dieser Region. Ich habe auch die AMI in diese Region kopiert. – liorko

Antwort

0

Ich nehme an, dass Ihre regions Liste enthält tatsächlich eine Liste von Availability Zones eher als Regionen (da es 'AvailabilityZone': regions[idx] sagt).

Jede AWS-Region arbeitet unabhängig voneinander. Wenn Sie eine Verbindung mit einem AWS-Dienst herstellen, müssen Sie eine Verbindung mit dem spezifischen Dienst in einer bestimmten Region herstellen.

Zum Beispiel:

client = boto3.client('ec2') 

Diese in Ihrer Standardregion zu EC2 verbindet.

Alternativ können Sie auch einen Bereich angeben:

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

Sie erhalten die Invalid availability zone Fehler, da Ihr Kunde zu einer Region verbunden ist (zB us-east-1), sondern verweist auf eine Availability Zone, die in einem anderen Bereich ist (zB eu-west-2b).

Ihr Code erstellt den Client nur einmal, versucht jedoch, eine Verbindung zu mehreren Regionen herzustellen. Die Lösung ist Erstellen Sie eine neue Clientverbindung für die Region, die Sie verwenden möchten. Wenn Ihre Schleife mit mehreren Regionen verbunden ist, sollte die clientinnerhalb der Schleife anstatt außerhalb der Schleife definiert werden.

Verwandte Themen