aws memo

AWS関連の備忘録 (※本ブログの内容は個人的見解であり、所属組織及び企業の意見を代弁するものではありません。1年以上古いエントリは疑ってかかってください)

Spotインスタンスで Private IPを指定して起動する

VPC内でspot requestする際、Management Consoleでは Private IP を指定する項目が無いため、指定したサブネット内の空きアドレスが自動で振られることになる。(正確には、サブネット内の空きアドレスの一つからENIが作られ割り振られる)

 

コマンドラインでは、既存ENIを指定することが可能。なので、まずは事前にspotで使いそうな数だけENIを作っておく。

# 例オレゴンリージョンのVPCの サブネットsubnet-a5b991d1 に、
# 172.16.1.101〜108のENIを作成する
$ for i in {101..108} ; do ec2-create-network-interface --region us-west-2 --private-ip-address 172.16.1.$i subnet-a5b991d1; done

その上で、起動時には

# 172.16.1.102 のeni-idを取得する
$ ENIID=`ec2-describe-network-interfaces --region us-west-2 | grep 172.16.1.102 | grep eni | awk '{print $2;}'`
# eniをeth0としてスポットリクエスト発行
$ ec2-request-spot-instances ami-f8f297c8 --region us-west-2 \
         --instance-type c3.8xlarge --k id_rsa \
         --network-attachment $ENIID:0 \
         -p 2.0 

ちなみに、通常のオンデマンドインスタンス起動でもこのテクニックは利用可能。コマンドが異なるだけで、オプションはほぼ一緒である(値段指定が無いくらい)ことがわかる。

# 172.16.1.102 のeni-idを取得する
$ ENIID=`ec2-describe-network-interfaces --region us-west-2 | grep 172.16.1.102 | grep eni | awk '{print $2;}'`
# eniをeth0として起動
$ ec2-run-instances ami-f8f297c8 --region us-west-2 \
         --instance-type c3.8xlarge --k id_rsa \
         --network-attachment $ENIID:0 

 

これをうまくスクリプト化しておくと便利。