2011-10-04 12 views
8

Acabo de empezar a usar la API de Amazon EC2 en Java.EC2 Java Api Espere hasta que se cree Ec2 Instance.

He creado instancias usando ec2.runInstances (runInstancesRequest);

Pero la iniciación de la instancia tardará un tiempo (normalmente de 1 a 2 minutos). Necesito obtener el DNS público de la máquina a través de la API Java EC2.

¿Cómo puedo saber cuándo las instancias cambian de estado "pendiente" a estado "procesado" y cómo puedo obtener el DNS público de la instancia EC2 a través de la API EC2?

Gracias de antemano. Kanna

+0

hacer la nota hay una pregunta similar para los usuarios de shell http://stackoverflow.com/questions/2644742/getting-id-of-an-instance-newly-launched-with-ec2-api-tools y la respuesta es la misma, tienes que sondear (prueba repetidamente). – bortzmeyer

Respuesta

9

No hay ningún modelo de evento u otra señal generada por el SDK para indicarle cuándo un objeto EC2 cambia de estado: la única manera de averiguarlo es emitir una llamada DescribeXXXXXXXX al objeto repetidamente, digamos una vez cada 30 segundos, hasta que el campo de estado cambie.

Hay un tiempo mínimo finito para que la llamada se ejecute y responda, por lo que debe encontrar un intervalo que no active las solicitudes antes de que la anterior se haya completado. O simplemente espere la respuesta y espere otros 'n' segundos antes de volver a emitir la llamada. Tampoco desea enviar spam a la API de AWS con solicitudes rápidas, incluso si están cronometradas entre las respuestas. En mi aplicación de controlador, configuro el intervalo en 30 segundos, emite la solicitud, espero la respuesta y luego resta el tiempo transcurrido del intervalo y duermo todo ese tiempo. En un modelo multiproceso, puedo realizar un seguimiento de los cambios de estado en muchos objetos simultáneamente sin saturar mi CPU local o la API.

Una vez que se ha detectado el cambio de estado (y suponiendo que el nuevo estado es el esperado - no olvide manejar los modos de falla) puede obtener una amplia variedad de información descriptiva, incluida la dirección DNS pública (en el caso de objetos instancia) de la estructura devuelta en el objeto de respuesta API.

+0

gracias @Jonners. Pude hacer que funcione. Gracias por tu ayuda. – kanap008

-1

En realidad, puede ENCONTRAR para conocer el estado de una instancia. Aquí hay un código de Bash para hacer eso, simplemente adáptelo a JAVA. PUEDE tener un comando similar en Java SDK para que no tenga que realizar una ejecución de Bash desde Java. El comando 'ec2-describe-instances' proviene del Amazon AWS CLI. Comenzaría la función o el método para esperar a que el estado de ejecución se pruebe si la instancia está 'pendiente', y fallaré si no está comenzando o 'pendiente'. Luego, registre el tiempo y déjelo como máximo de 3 minutos, y simplemente siga sondeando para ver el estado de "ejecución" en un ciclo, verificando el límite de 3 minutos. Regrese al punto de llamada, lo que ocurra primero, 'no iniciado', 'tiempo de inicio excedido' o 'en ejecución'.

setInstanceStatus() { 
    instanceStatus=`ec2-describe-instances $INSTANCE_ID -C $CERTIFICATE_FILE -K $PRIVATE_KEY --region $REGION -U $AWS_URL` 

    is_pending="`echo $instanceStatus|grep -c " pending "`" 
    is_running="`echo $instanceStatus|grep -c " running "`" 
    is_shutting_down="`echo $instanceStatus|grep -c " shutting-down "`" 
    is_terminated="`echo $instanceStatus|grep -c " terminated "`" 
    is_stopping="`echo $instanceStatus|grep -c " stopping "`" 
    is_stopped="`echo $instanceStatus|grep -c " stopped "`" 

    if [ "$is_pending" -eq "1" ]; then 
    status="pending" 
    elif [ "$is_running" -eq "1" ]; then 
    status="running" 
    elif [ "$is_shutting_down" -eq "1" ]; then 
    status="shutting-down" 
    elif [ "$is_terminated" -eq "1" ]; then 
    status="terminated" 
    elif [ "$is_stopping" -eq "1" ]; then 
    status="stopping" 
    elif [ "$is_stopped" -eq "1" ]; then 
    status="stopped" 
    else 
    status="bad-instance-state" 
    fi 
}