有時候需要開 Ubuntu 測試東西,會在 AWS 上開 EC2 起來測試,但開 console 太麻煩了,寫幾個 function 丟進 shell script 裡面比較乾脆。其中查詢 Ubuntu AMI 的程式出自「How do I know what Ubuntu AMI to launch on EC2?」這邊。
在 ec2.ls()
裡,我的 jq 版本比較舊,不過不影響我的 copy & paste,所以就沒有 hack 他了。新版的應該可以多加上 | @tsv
變成 tab 隔開 (沒測過,查資料時查到而已)。
在 ec2.run()
裡,我這邊是先到 console 上查出 security group 與 subnet 的 id,然後這邊 hard code 進去。我的預設是開 t2.medium
,臨時要指定的話就 ec2.run t2.nano
就可以改開 t2.nano 了,不過要注意的是,這邊程式在查詢時的條件是 hvm:ebs
,換的時候要注意 image 相容性...
# AWS-related function ec2.ls() { aws ec2 describe-instances | \ jq -c -M '.Reservations[] | .Instances[] | [.InstanceId, .InstanceType, .PublicIpAddress]' } function ec2.rm() { local INSTANCE_ID=${1:i-xxxxxxxxxxxxxxxxx} aws ec2 terminate-instances --instance-id ${INSTANCE_ID} } function ec2.run() { local INSTANCE_TYPE=${1:-t2.medium} aws ec2 run-instances --image-id $(ec2.ubuntu_ami()) --key-name gslin --security-group-ids sg-xxxxxxxx --instance-type ${INSTANCE_TYPE} --subnet-id subnet-xxxxxxxx } function ec2.ubuntu_ami() { curl -s "https://cloud-images.ubuntu.com/locator/ec2/releasesTable" | \ sed '$x;$G;/\(.*\),/!H;//!{$!d};$!x;$s//\1/;s/^\n//' | \ jq -c '.aaData[] | select(contains(["16.04", "us-east-1", "hvm:ebs"]))' | \ grep -o 'ami-[a-z0-9]\+' | \ head -1 }
這種工具自己用的順手比較重要,要什麼功能自己改自己加...
話說 Ubuntu 網站上的 JSON 居然吐出 malformed data (trailing comma),這是自己 printf()
之類硬幹出來的嗎... XD
希望我沒有會錯意, 在 Ubuntu 內有個好用的工具
apt-get install cloud-utils
# ubuntu-cloudimg-query xenial us-east-1 hvm ebs-ssd
ami-aa2ea6d0
可能可以取代 ec2.ubuntu_ami 這個 function