ある日のこと。
現在稼動しているEC2インスタンスと同じものを作ってね。という依頼がきました。
「GUIは中学生まで・・」※
という言葉を胸にとりあえず、CLIでチャレンジしてみました。
※正しくは・・・「本番環境で変更を伴う作業をマネジメントコンソールでやって良いのは中学生かAWS経験半年まで」です!
EC2のコマンドライン操作
こちらのリファレンスを片手にやるとよいです。最新の使えるコマンドが列挙されています。
http://docs.aws.amazon.com/cli/latest/reference/ec2/index.html#cli-aws-ec2
コマンドは、いきなりやるとコワイので、ドライランをつけてやりましょう。
--dry-run
おなじものをつくるよSTEP
やり方は複数あると思いますが、今回はコピー元のEC2インスタンスのAMIを取得して、それを元にインスタンスを作成します。
AMIイメージを作成する
まず、コピーしたいEC2インスタンスのAMIイメージを作成します。
このときに、マシンはとめておきましょう。メモリ上にデータが残っていたりします。
aws ec2 create-image --instance-id i-XXXXXX --no-reboot --name test_20160106100726
この時、うーん自分のコピーしたいAMIインスタンスのインスタンスIDはなんだろうっていうのを調べる時は、以下のコマンドを使います。
- リージョン内で稼働している全インスタンスの情報を取得する場合
$ aws ec2 describe-instances
- また、インスタンスIDがわかって、そのインスタンスの情報を知りたい場合は、以下のコマンドで情報を取得していきます。
$ aws ec2 describe-instances --instance-ids ${instance-id}
参考URL: http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html
さて実行
dry-runをつけていると、いろんなエラーにあたりつつ、前進していけます。
- エラーその1:セキュリティグループとサブネットがあっていないようです。
% aws ec2 run-instances --dry-run --image-id test_20160106100726 --key-name demo --count 1 --security-group-ids sg-XXXX --instance-type t1.micro
A client error (InvalidParameter) occurred when calling the RunInstances operation: Security group sg-XXXX and subnet subnet-XXXX belong to different networks.
- エラーその2:指定するAMIの名前がちがうようです
% aws ec2 run-instances --dry-run --image-id test_20160106100726 --key-name demo --count 1 --security-group-ids sg-XXXX --subnet-id subnet-XXXX --instance-type t1.micro
A client error (InvalidAMIID.Malformed) occurred when calling the RunInstances operation: Invalid id: "test_20160106100726" (expecting "ami-...")
- エラーその3:どうやら、このインスタンスタイプ( --instance-type t1.micro)の実行はGUIからのみのようです。
% aws ec2 run-instances --dry-run --image-id ami-XXXX --key-name demo --count 1 --security-group-ids sg-XXXX --subnet-id subnet-XXXX --instance-type t1.micro
A client error (InvalidParameterCombination) occurred when calling the RunInstances operation: Non-Windows instances with a virtualization type of 'hvm' are currently not supported for this instance type.
- お、うまく通ったようです。
% aws ec2 run-instances --dry-run --image-id ami-XXXX --key-name demo --count 1 --security-group-ids sg-XXXX --subnet-id subnet-XXXX --instance-type t2.micro
A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
- では、dry-runを外して実行してみましょう。
% aws ec2 run-instances --image-id ami-XXXX --key-name demo --count 1 --security-group-ids sg-XXXX --subnet-id subnet-XXXX --instance-type t2.micro
813931856455 r-cf4d9167
INSTANCES 0 x86_64 False xen ami-XXXX i-df1e7d5e t2.micro demo 2016-01-06T01:34:05.000Z ip-10-0-0-57.ec2.internal 10.0.0.57 /dev/xvda ebs True subnet-XXXX hvm vpc-XXXX
MONITORING disabled
NETWORKINTERFACES 12:1d:84:4d:fe:83 eni-XXXX 813931856455 ip-10-0-0-57.ec2.internal 10.0.0.XX True in-use subnet-XXXX vpc-XXXX
ATTACHMENT 2016-01-06T01:34:05.000Z eni-attach-XXXX True 0 attaching
GROUPS sg-XXXX berio-api-security-group
PRIVATEIPADDRESSES True ip-10-0-0-XX.ec2.internal 10.0.0.XX
PLACEMENT us-east-1b default
SECURITYGROUPS sg-XXXX XXXX-security-group
STATE 0 pending
STATEREASON pending pending
OK ~/.aws
インスタンスの情報設定
- できあがったインスタンスの情報を取得してみましょう
aws ec2 describe-instances --instance-id i-XXXX --output json
- タグの名前をつけてみましょう
aws ec2 create-tags --resources i-XXXX --tags '[{"Key": "Name", "Value": "Test"}]'
- 固定IPを付与してみましょう
aws ec2 associate-address --allocation-id eipalloc-XXX --network-interface-id eni-XXXXX
最後に
dry-runをつけながら、すこしずつコマンドを実行してデバッグしながら、前進しましょう。
最初はうまくいかないけど、やっていくうちにアタリをつける能力がすこしづつあがります。
Let's enjoy your AWS-CLI Life!