2012年6月20日 星期三

[ec2] 取得 EC2 Tags

工作的關係,開始大量使用 ec2 服務,其中一部分是撰寫『爬蟲』類。這些爬蟲大多數的內容是一樣的,但可能依爬的對向會使用不同的 rule 執行。並且有監控爬蟲的程式通知現在『生態系』不平衡了,需要多放一點特定類型的爬蟲。



在概念上,大家的程式幾乎都一樣的,那我就不用為每一種類型建一個 AMI 作為爬蟲的樣版。若將 ec2 instance 想成物件,大概是這種感覺:

Crawler c = new Crawler('type')c.run()

我們只需在『建構子』指定不同的參數,當 ec2 instance 建立起來後,讓它『找尋生命的意義』(找到自己的參數)然後開始工作。有幾個方式能做到 cloud-init,這是蠻流行的方式,我曾試著使用它加速 instance 的初始安裝。在 ec2 instance 上能塞資料的地方很多,而我們的參數也不佔什麼空間,今天靈機一動,決定將它放到 tag 內,若將它表現成 java code 是這種感覺:

Crawler c = new Crawler(EC2Instance.current().tag('type'))
c.run()


所以,我們需要做的事有:


  • 撰寫啟動 script 並讓它接受參數指定我們要啟動的程式
  • 實作取得特定 tag 的方法


本來以為 ec2 instance metadata 就會有 tag 資訊,查了一些資料發現在幾年前有人提議要將 tag 資訊加入,但目前仍沒看到。好在 aws api 蠻容易使用的,我們可以配合 ec2-metadata query tool 先取得 instance id,再查出此 instance id 擁有的 tag:

..

..


所以,實際上我們實作時,決定用 tag 內 handleClass 的值當作 Crawler 啟動參數:

Crawler c = new Crawler(EC2Instance.current().tag('handleClass'))
c.run()

將它設置好,建成 AMI。而建立 ec2 instance 時,記得指定需要的 handleClass 就能依需要動態建出不同功用的 instance。