CDPのBootstrapパターンの片鱗に触れてみる。ec2-request-spot-instancesでcloudinitでhttpd起動まで。

awsでVPC内にスポットインスタンスをリクエストしてEIP割り当てるまでのbashスクリプトは単にインスタンスが起動してEIPが割り当てられるだけでした。

次にCDP:Bootstrapパターンを試してみたいと思います。 とはいうもののcloudinit初めてなので、RPMパッケージのhttpdをインストールして起動するだけのシンプルな構成を試してみます。

#!/bin/bash

AMI='ami-xxxxxxxx';
INSTANCE_TYPE='t1.micro';
PRICE='.003';
SUBNET='subnet-xxxxxxxx';
KEYPAIR='xxxxxxxx';
SECURITYGROUP='sg-xxxxxxxx';
DATA='#cloud-config

packages:
  - httpd
  - httpd-devel

runcmd:
  - [/sbin/chkconfig, httpd, on]
  - [/etc/init.d/httpd, start]
';

#スポットインスタンスのリクエストを行う
SIR_ID=` ec2rsi $AMI -t $INSTANCE_TYPE -p $PRICE -n 1 -r one-time -s $SUBNET -k $KEYPAIR -g $SECURITYGROUP -d "$DATA" | awk '{if(NR==1) print $2;}' `

#2分間待機
sleep 120

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 }'`

sleep 10

#IPアドレスをec2インスタンスに割り当てる
EIPASSOC_OBJ=`ec2assocaddr -a $EIPALLOC  -i $INSTANCE_ID -p $LOCAL_IP `

sleep 10

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 ; "

上記スクリプトで、httpdがインストールされて起動されるインスタンスが立ち上がりました。

f:id:mitsugi-bb:20130410035625p:plain

これを改良していけば、git-hubやS3からサイトをダウンロードしてWEBサイトを起動するのはシンプルにできそうです。

参考エントリ