AWS - ec2のインスタンスを大量生産しよう
awsの10台、20台のEC2インスタンスであれば、力技で作れる、でわ、100台,200台の場合はどうする?の場合の、大量生産の方法をざっとまとめました。
やんわりとしか書いておりませんが、それでもわかる人は(きっと)わかる!そんな内容です。
WWW HR Giger Com (Taschen 25th Anniversary Series)
- 作者: H. R. Giger
- 出版社/メーカー: Taschen America Llc
- 発売日: 2007/04/06
- メディア: ハードカバー
- クリック: 16回
- この商品を含むブログ (2件) を見る
Cyxus(シクサズ)ブルーライトカットメガネ 半フレーム眼鏡 uvカット輻射防止 [透明レンズ ] オーバーPC パソコン用メガネ 眼精疲労低減に 男女兼用
- 出版社/メーカー: Cyxus(シクサズ)
- メディア: エレクトロニクス
- この商品を含むブログを見る
Amazonギフト券(グリーティングカードタイプ ) - 1,000円 (Amazonオリジナル)
- 出版社/メーカー: Amazonギフト券
- 発売日: 2013/01/01
- メディア: Paper Gift Certificate
- この商品を含むブログを見る
前提条件
まず、これをやる前提条件です
です。GLOBAL IPが100個もあるとまじAさんで怒られますので(汗)
最初の一台
AWSマネージメントコンソールから作りましょう!ここまでコマンドでやる必要はないと思います。ただ、作成するこの一台が重要なので、NFSの設定、およびWEBサーバ、DBサーバなどを量産する場合は、この時点できっちり作成しておきます
AMIもとりあえず、AWSマネージメントコンソールで作った
これもまた、ここまでコマンドで作る理由はなかったので、こちらに関してはAWSコンソールから作った
ec2コマンドをテキストで管理
100台のインスタンスを同時に生成するのは、AWSコンソールでは無理!でも、ECコマンドで生成するのもミスがでそうで結局無理ってということで、文字列加工で済むように作成しました。作成したテキストファイルはこちらになります
左から、 ホスト名(NameTAG),プライベートIP,AMI-ID,AvailabilityZone,セキュリティグループID,SUBNET-ID,インスタンスタイプ になります。今回は、テキストにて作成しましたが、このあたりはEXCELとかスプレッドシートで連番を振って管理したりするほうがやりやすいかもしれません
# hostname,privateIPAddress,ami-id,AvailabilityZones,Security groups,Subnet,InstanceType cat << '_EOT_' > /tmp/hostlist_tmp.inc hostname01,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro hostname02,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro hostname03,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro hostname04,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro hostname05,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro hostname06,10.0.5.100,ami-9fc81df4,us-east1a,sg-79385d1d,subnet-6a61ca44,t2.micro _EOT_
EC2コマンドを生成
上記で生成したホストをリストファイルをawkで加工し、ECコマンドを生成しました。あくまでも例なのでもっと洗練した書き方があるとは思いますが勘弁してください
cat /tmp/hostlist_tmp.inc | awk -F, '{print "ec2-run-instances "$3 "-g" $5 "-k My_Private_Key -s " $6 " -t "$7" -z us-east-1c --private-ip-address "$2" --instance-initiated-shutdown-behavior stop"}'
NameタグはEC2コマンドで格納するようにした
Nameタグに値を入れるには、上記で動的にインスタンスを構築した後に生成されるインスタンスIDが必要だったため、生成後、IPアドレスと、インスタンスIDの紐づけデータが必要でした。describe-instancesコマンドと、正規表現を駆使して、こんなものを作ってみました。ちなみにこちらの例では、VPCにて、プライベートIP固定で設定したため、その紐づけを作成しました
cat /tmp/hostlist_tmp.inc | awk -F, '{print "ec2-run-instances "$3" -g "$5" -k My_Private_Key -s "$6" -t "$7" -z us-east-1c --private-ip-address "$2" --instance-initiated-shutdown-behavior stop"}'
上記の結果はこんな感じのデータでした
結果このようなデータが出力されたかと思います。そうです、これがインスタンスを生成するEC2コマンドです
ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.100 --instance-initiated-shutdown-behavior stop ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.101 --instance-initiated-shutdown-behavior stop ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.102 --instance-initiated-shutdown-behavior stop ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.103 --instance-initiated-shutdown-behavior stop ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.104 --instance-initiated-shutdown-behavior stop ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.105 --instance-initiated-shutdown-behavior stop
ちなみにNAMEタグの値なのですが
残念ながら、ec2-run-instancesで同時に作成することはできない(はず・・)です。インスタンスの生成後のインスタンスIDに対してタグを埋め込む形になるのではないかと思います。ここでのケースの場合は、プライベートIPアドレスを割り当てているため、IPアドレスとインスタンスIDの紐づけデータを生成したかったので以下のようなコマンドで表示させました
aws ec2 describe-instances | jq '.Reservations[].Instances[] | {PrivateIpAddress,InstanceId,InstanceType}' | perl -pe 's/,\n/,/g' | sed '/{/d' | sed '/}/d' | sed 's/ "PrivateIpAddress": //g' | sed 's/ "InstanceId": //g' | sed 's/ "InstanceType": //g' | sed 's/"//g'
上記にて生成したPrivateIpAddressに紐づくインスタンスIDをベースにして、インスタンスIDを決めればいいので・・
10.0.5.181,i-5a1cb4fc 10.0.5.131,i-96d2b33d 10.0.5.226,i-9600863d 10.0.5.209,i-690583c2 10.0.5.144,i-d5b7cf7e 10.0.5.111,i-9faed833 10.0.5.134,i-c56fb86e 10.0.5.169,i-d708d07e 10.0.5.196,i-09a680a2
あとは、こんな感じでコマンド打ってくれれば
ec2-create-tags i-5a1cb4fc --tag "Name=hostname111"
awsコンソールでも識別できるようになったとさ・・
最後に
今回コマンド(shell)で説明しましたが、
ec2-run-instances ami-9fc81df4 -g sg-79385d1d -k My_Private_Key -s subnet-6a61ca44 -t t2.micro -z us-east-1c --private-ip-address 10.0.5.100 --instance-initiated-shutdown-behavior stop
とか
10.0.5.181,i-5a1cb4fc
とか生成したのは、ぜーんぶスプレッドシートで作成しました。結果的には、ドキュメントで管理することになるので流れとしては、こうなるかな?と思って https://docs.google.com/spreadsheets/d/14P6VJTsMLg157oTn0m69fKRY-rMxYm7jySaKmOJkSzY/edit?usp=sharing
補足
perlとか駆使しなくてもこんな感じでやればいいんだと今更知る
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | .InstanceType + "\t" + .InstanceId + "\t" + .Tags[].Value + "\t" + .State.Name'