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がインストールされて起動されるインスタンスが立ち上がりました。
これを改良していけば、git-hubやS3からサイトをダウンロードしてWEBサイトを起動するのはシンプルにできそうです。