読者です 読者をやめる 読者になる 読者になる

Database JUNKY

MySQL,MariaDBを中心としたブログです

AWS - ec2のインスタンスを大量生産しよう

f:id:hit10231023:20161114191553p:plain

awsの10台、20台のEC2インスタンスであれば、力技で作れる、でわ、100台,200台の場合はどうする?の場合の、大量生産の方法をざっとまとめました。

設定の肝はEXCELスプレッドシートですw

やんわりとしか書いておりませんが、それでもわかる人は(きっと)わかる!そんな内容です。

WWW HR Giger Com (Taschen 25th Anniversary Series)

WWW HR Giger Com (Taschen 25th Anniversary Series)

前提条件

まず、これをやる前提条件です

です。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'