awsでVPC内にスポットインスタンスをリクエストしてEIP割り当てるまでのbashスクリプト
前回のエントリ、mac環境にbrew installでawsコマンドラインツールをインストールしてスポットインスタンスをあれこれとawsコマンドラインツールで起動したスポットインスタンスにEIPを割り当てる(VPC環境)の内容をbashスクリプトにまとめてみます。
利用するコマンド
コマンド(リンク) | 説明 |
---|---|
ec2-request-spot-instances ( ec2rsi ) | スポットインスタンスをリクエストする |
ec2-describe-instances ( ec2din ) | ec2インスタンスの情報を取得する |
ec2-allocate-address ( ec2allocaddr ) | EIPを取得する |
ec2-associate-address ( ec2assocaddr ) | EIPをインスタンスに割り当てる |
処理手順
今回bashスクリプトにした手順
- スポットインスタンスをリクエストしてリクエストIDを変数に設定
- 3分待機
- リクエストIDを指定して、ec2のインスタンス情報を取得する(取得できるまで30秒毎に実行する)
- ec2インスタンス情報が取得できたらIPアドレスを取得する
- 取得したIPアドレスをec2インスタンスに割り当てる
- sshでのアクセス方法や、インスタンスを止める方法等を出力して終了
create-spot-instances.sh (今回作ったbashスクリプト)
#!/bin/bash AMI='ami-xxxxxxxx'; INSTANCE_TYPE='t1.micro'; PRICE='.003'; SUBNET='subnet-xxxxxxxx'; KEYPAIR='xxxxxxxx'; SECURITYGROUP='sg-xxxxxxxx'; #スポットインスタンスのリクエストを行う SIR_ID=` ec2rsi $AMI -t $INSTANCE_TYPE -p $PRICE -n 1 -r one-time -s $SUBNET -k $KEYPAIR -g $SECURITYGROUP | awk '{if(NR==1) print $2;}' ` #3分間待機 sleep 180 TMP_EC2=''; while true; do #ec2のインスタンス情報取得(スポットインスタンスのIDを指定) TMP_EC2=`ec2din --filter "spot-instance-request-id=$SIR_ID"`; if test ${#TMP_EC2} -gt 0 ; then #情報が取得できた場合 #インスタンス情報、ローカルIPの情報を取得する INSTANCE_ID=`echo $TMP_EC2 | awk '{ print $5 }'`; LOCAL_IP=`echo $TMP_EC2 | awk '{ print $52 }'`; #ループを抜ける break fi #30秒待機 sleep 30 done #IPアドレスを取得する EIP_OBJ=`ec2allocaddr -d vpc`; EIPALLOC=`echo $EIP_OBJ | awk '{ print $4 }'` GLOBAL_IP=`echo $EIP_OBJ | awk '{ print $2 }'` #IPアドレスをec2インスタンスに割り当てる EIPASSOC_OBJ=`ec2assocaddr -a $EIPALLOC -i $INSTANCE_ID -p $LOCAL_IP ` EIPASSOC=`echo $EIPASSOC_OBJ | awk '{ print $4}'` #結果出力 echo "[info]instance_id: $INSTANCE_ID"; echo "[info]globalId: $GLOBAL_IP"; echo "[info]eipassoc: $EIPASSOC"; echo "[info]eipalloc: $EIPALLOC"; echo "[example] ssh -i ${KEYPAIR}.pem ec2-user@${GLOBAL_IP} "; echo "[example] ec2disaddr -a $EIPASSOC ; ec2reladdr -a $EIPALLOC ; ec2kill $INSTANCE_ID ; "
実行結果
$ time ./create-spot-instances.sh [info]instance_id: i-bb4b84d4 [info]globalId: 54.236.67.208 [info]eipassoc: eipassoc-69a40b05 [info]eipalloc: eipalloc-9ea50af2 [example] ssh -i xxxxxxxx.pem ec2-user@54.236.67.208 [example] ec2disaddr -a eipassoc-69a40b05 ; ec2reladdr -a eipalloc-9ea50af2 ; ec2kill i-bb4b84d4 ; real 4m53.571s user 1m9.905s sys 0m2.175s
sshアクセスする
ssh -i xxxxxxxx.pem ec2-user@54.236.67.208
シャットダウンする
ec2disaddr -a eipassoc-69a40b05 ; ec2reladdr -a eipalloc-9ea50af2 ; ec2kill i-bb4b84d4 ;
起動したあとに、atコマンドで50分後にシャットダウンするようにしておけば、使い過ぎは防げるかもしれません。