有時候需要開 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