ubuntu4aws

L'automatisation du déploiement des calculs sur une plate-forme telle que AWS est un enjeu important pour gagner en productivité dans les études de Mécanique des Fluides Numériques (MFN). Il s'agit en effet d'utiliser le temps facturé au développement du modèle et non à la gestion de sessions en ligne de commande, qu'il est difficile de se remémorer lorsqu'elles sont pratiquées épisodiquement.

EIF-services a donc testé avec succès la procédure décrite ici:

  • configuration initiale dans la console AWS (interface web, c'est-à-dire manuellement via un navigateur);
  • écriture d'un script permettant de (i) démarrer une instance Ubuntu sur AWS, (ii) s'y connecter et (iii) libérer les ressources une fois le travail terminé. Vous trouverez ce script bash ci-dessous.

Il s'agit d'une étape importante sur le route menant à la MFN sur AWS. Le script a notamment été utilisé plusieurs semaines après son développement, alors que les options de la commande aws avaient été complètement oubliés par l'opérateur.

N.B. Le script suivant est compatible avec l'offre 12 mois gratuits de AWS, à condition bien sûr de ne pas oublier de libérer les ressources AWS (-t).

#!/usr/bin/env bash

usage() {
  cat << HEREDOC
Usage: ubuntu4aws.sh (-h|-r|-l|-t)
-h: Help
-r: Run instance
-l: Log in
-t: Terminate
N.B. Assuming table output (aws configure).
HEREDOC
}

INSTANCE_ID=''
IP_ADDRESS=''
get_id_ip() {
  if [ -e $OUT1 ]; then
    INSTANCE_ID=$(awk '$0~"InstanceId"{print $4}' < $OUT1)
    [ -e $OUT2 ] || aws ec2 describe-instances --instance-ids $INSTANCE_ID > $OUT2
    IP_ADDRESS=$(awk '$0~"PublicIpAddress"{print $4}' < $OUT2)
  else
    echo "Instance not started yet!"; exit 0
  fi
}

AMI_ID=ami-045a8ab02aadf4f88
INSTANCE_TYPE=t2.micro
SECURITY_GROUP=launch-wizard-1
SSH_PAIR=EC2#2
PRIVATE_KEY=~/EIF/AWS/credentials/EC2#2.pem
OUT1=~/tmp/out1.txt
OUT2=~/tmp/out2.txt

while getopts 'hrlt' option; do
  case $option in
    h) usage; exit 0;;
    r) if [ -e $OUT1 ]; then
         echo "Instance already running."; exit 0
       else
         aws ec2 run-instances --image-id $AMI_ID --instance-type $INSTANCE_TYPE \
         --security-groups $SECURITY_GROUP --key-name $SSH_PAIR > $OUT1
       fi
    ;;
    l) get_id_ip
       ssh -i $PRIVATE_KEY ubuntu@$IP_ADDRESS
    ;;
    t) get_id_ip
       aws ec2 terminate-instances --instance $INSTANCE_ID
       rm $OUT1 $OUT2 ~/.ssh/known_hosts
    ;;
    ?) usage; exit 1;;
  esac
done