JSONのテンプレからEC2のインスタンス起動する

EC2のインスタンスCLIから起動するのに、aws ec2 run-instances コマンドがあるのだけど、指定しないといけないオプションがやたら多くて、毎回指定するのダルいなーと思ったら、--cli-input-jsonオプションでJSONテンプレート渡せるようなので、やってみた。

ちなみに--cli-input-jsonオプションは古いawscliだとないっぽいので、なさそうだったらawscliアップデートしてください。

$ sudo pip install -U awscli
$ aws --version
aws-cli/1.7.12 Python/2.7.6 Darwin/14.1.0
$ complete -C aws_completer aws

まずJSONファイルのひな形を生成する。

$ aws ec2 run-instances --generate-cli-skeleton > ec2-commitm-ap.json

指定できる内容は基本的にrun-instancesの引数に渡せるものなので、run-instancesのhelp見つつ、

$ aws ec2 run-instances help

あとはdescribeなんたらで既存のインスタンスとかから必要そうな情報を集める。
作ったJSONテンプレこんなかんじ。

$ cat ec2-commitm-ap.json
{
    "ImageId": "ami-18869819",
    "KeyName": "aws-login",
    "SecurityGroupIds": [
        "sg-48b7002d"
    ],
    "InstanceType": "t2.micro",
    "Placement": {
        "AvailabilityZone": "ap-northeast-1a"
    },
    "BlockDeviceMappings": [
        {
            "DeviceName": "/dev/xvda",
            "Ebs": {
                "VolumeSize": 8,
                "DeleteOnTermination": true,
                "VolumeType": "gp2"
            }
        }
    ],
    "Monitoring": {
        "Enabled": false
    },
    "DisableApiTermination": false,
    "NetworkInterfaces": [
        {
            "DeviceIndex": 0,
            "SubnetId": "subnet-6b55851c",
            "DeleteOnTermination": true,
            "AssociatePublicIpAddress": true
        }
    ],
    "EbsOptimized": false
}

これを--cli-input-jsonに食わせると指定したオプションでインスタンスできる。

$ aws ec2 run-instances --cli-input-json file://ec2-commitm-ap.json

標準出力にいろいろ情報が出るけど、インスタンスIDだけ分かれば十分。
できたインスタンスのIP確認。ちゃんと取るならjqだけどIP見たいだけなのでgrepで手抜き。

$ aws ec2 describe-instances --instance-ids i-a2d024ba | grep PublicIpAddress

あと、run-instancesでタグを設定するオプションが見当たらなかったので、タグつけたい場合は、自分で後から付ければよいんじゃないかと。

$ aws ec2 create-tags --resources i-a2d024ba --tags Key=Name,Value=commitm-ap02

あとインスタンス廃棄したい場合はterminationプロテクトかかってる場合は一旦解除して、

$ aws ec2 modify-instance-attribute --instance-id xxxxxxx --no-disable-api-termination --region ap-northeast-1

terminate-instancesで廃棄する。

$ aws ec2 terminate-instances --instance-ids xxxxxxxx --region ap-northeast-1

参考