2011-10-04 6 views
8

Je viens de commencer à utiliser l'API Amazon EC2 en Java.EC2 Java Api Attendre que l'instance Ec2 soit créée.

J'ai créé des instances en utilisant ec2.runInstances (runInstancesRequest);

Mais l'instance ne prendra pas de temps avant d'être lancée (généralement 1 à 2 minutes). J'ai besoin d'obtenir le DNS public de la machine via l'API Java EC2. Comment savoir si les instances passent de l'état "en attente" à l'état "traité" et comment puis-je obtenir le DNS public de l'instance EC2 via l'API EC2.

Merci d'avance. Kanna

+0

Prenez note il y a une question similaire pour les utilisateurs de shell http://stackoverflow.com/questions/2644742/getting-id-of-an-instance-newly-launched-with-ec2-api-tools et la réponse est la même, vous devez interroger (tester à plusieurs reprises). – bortzmeyer

Répondre

9

Il n'existe aucun modèle d'événement ou autre signal généré par le SDK pour vous avertir lorsqu'un objet EC2 change d'état - la seule façon de savoir est d'émettre un appel DescribeXXXXXXXX sur l'objet de manière répétée, disons une fois toutes les 30 secondes, jusqu'à ce que le champ d'état change.

L'appel doit s'exécuter et répondre dans un délai minimum. Vous devez donc trouver un intervalle qui ne déclenche pas les requêtes avant la fin de l'appel précédent. Ou attendez simplement la réponse, puis attendez encore 'n' secondes avant de réémettre l'appel. Vous ne voulez pas non plus que l'API AWS soit spammée par des requêtes rapides, même si elles sont synchronisées entre les réponses. Dans mon application de contrôleur, je règle l'intervalle à 30 secondes, émet la demande, attend la réponse, puis soustrais le temps écoulé de l'intervalle et dors aussi longtemps. Dans un modèle multithread, je peux ainsi suivre les changements d'état sur de nombreux objets simultanément sans submerger mon processeur local ou l'API. Une fois que le changement d'état a été détecté (et en supposant que le nouvel état est ce que vous attendez - n'oubliez pas de gérer les modes de défaillance) vous pouvez obtenir une grande variété d'informations descriptives, y compris l'adresse DNS publique (dans le cas des objets d'instance) à partir de la structure renvoyée dans l'objet de réponse API.

+0

merci @Jonners. J'étais capable de le faire fonctionner. Merci de votre aide. – kanap008

-1

En fait, vous pouvez chercher à connaître l'état d'une instance. Voici un code Bash pour le faire, il suffit de l'adapter à JAVA. Vous pouvez avoir une commande similaire dans le SDK Java afin que vous n'ayez pas à faire une exécution de Bash à partir de Java. La commande 'ec2-describe-instances' provient du Amazon AWS CLI. Je voudrais commencer la fonction ou la méthode d'attendre l'état en cours d'exécution pour tester si l'instance est 'en attente', et échouer si elle ne démarre pas ou 'en attente'. Ensuite, enregistrez l'heure, et donnez-lui un maximum de 3 minutes, et continuez à interroger le statut «en cours» dans une boucle, en vérifiant la limite de 3 minutes. Revenez au point d'appel selon la première éventualité, 'non démarré', 'temps de démarrage dépassé' ou 'en cours d'exécution'.

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 
}