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!
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