developer's diary

最近はc#のエントリが多いです

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スクリプトにした手順

  1. スポットインスタンスをリクエストしてリクエストIDを変数に設定
  2. 3分待機
  3. リクエストIDを指定して、ec2のインスタンス情報を取得する(取得できるまで30秒毎に実行する)
  4. ec2インスタンス情報が取得できたらIPアドレスを取得する
  5. 取得したIPアドレスをec2インスタンスに割り当てる
  6. 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分後にシャットダウンするようにしておけば、使い過ぎは防げるかもしれません。