2017-07-09 5 views
0

geben Ich habe eine Methode, die ich als Sellerie Aufgabe zu nennen bin versucht:boto3.client Instanz Sellerie Aufgaben wirft JSON Serialisierung Fehler

@app.task 
def launch_compute_node(client, timeout=20, wait_interval=5): 

try: 
    status = client.run_instances(
     InstanceType='t2.micro', 
     MinCount=1, 
     MaxCount=1, 
     ImageId=XXXXXXX, 
     KeyName=KEY_NAME, 
     SecurityGroupIds=[XXXXXXX, XXXXXXXX], 
     SubnetId=SUBNET_ID, 
     PrivateIpAddress=XXXXXXX, 
     TagSpecifications=[ 
     {'ResourceType': 'instance', 
      'Tags': [ 
      {'Key': 'Name', 
      'Value': NODE_NAME}]}] 
    ) 
except ClientError as ex: 
    logger.error(str(ex)) 
    return None 

state = get_instance_state(status) 
instance_id = status['Instances'][0]['InstanceId'] 
counter = timeout 

while state != 'running': 
    logger.debug('Instance not in running state, waiting...') 
    time.sleep(wait_interval) # sleep `wait_interval' seconds 
    counter = counter - 1 
    if counter <= 0: 
     logger.warning('Timed out after %s attempts' % timeout) 
     # TODO: Probably it's a good idea do terminate the failed instance here. 
     return None 

    status = client.describe_instances(InstanceIds=[instance_id]) 
    state = get_instance_state(status['Reservations'][0]) 
    instance_id = status['Reservations'][0]['Instances'][0]['InstanceId'] 
    logger.debug('Instance \'%s\' in state \'%s\'' % (instance_id, state)) 

logger.info('Instance \'%s\' ready for jobs' % instance_id) 

return instance_id 

Ein perfekt Klang Methode, aber wenn ich eine Sellerie-Aufgabe erstellen ich :

kombu.exceptions.EncodeError: <botocore.client.EC2 object at 0x106113438> is not JSON serializable

was Sinn macht - keinen Grund, warum ein boto EC2 Client JSON serializable sein sollte. Aber damit bin ich in der Klemme. Wie kann ich den Status einer EC2-Instanz aus einer Sellerie-Aufgabe erstellen und überprüfen, ohne den Code wesentlich zu überarbeiten?

Alle Ideen werden sehr geschätzt!

Antwort

1

Standardmäßig wird jede Nachricht an den Broker in Sellerie in JSON codiert. Kombu is responsible for the serialization of these messages.

In Ihrem Fall versuchen Sie, ein botocore.client.EC2-Objekt zu senden, und Kombu versucht, das zu serialisieren, um eine richtige AMQP-Nachricht zu erstellen, die vom Broker gespeichert und an Sellerie verfüttert wird. JSON kann jedoch standardmäßig serialize only a limited set von Typen verwenden. Da JSON das Objekt nicht serialisieren kann, wird dieser Fehler ausgelöst.

Meine Vermutung wäre, dass das Problem auftritt, wenn Sie die Instanz-ID zurückgeben. Was passiert, wenn Sie stattdessen nichts zurückgeben?

This article für die Serialisierung Django Aufgaben könnten für Sie nützlich sein.

+0

Dies ist sinnvoll. Ich habe mich entschieden, eine einfachere Aufgabe zu verwenden, um die Methode launch_compute_node aufzurufen. Danke für den Link – fiacre