2015年6月10日 星期三

AWS NAT script 實作

最近公司在 AWS 上面需要做 HA-NAT,參考了一下 gslin 大的這篇文章寫了一段 script 來做這件事情

概念上一樣是不做 cross-zone NAT,反正 AWS 宣稱他們頂多是一次掛一個 AZ (?)

script 放在這邊
https://github.com/adaam/AWS-NAT/blob/master/NAT.sh

 基本概念就是,一個 AZ 自己起一個 EC2 來管理自己 AZ 的對外需求,這樣差不多就有達到 HA-NAT 的要求,反正從外面看來你沒有把 AZ 全掛光看起來就還是正常在服務XD

要用這支script有幾個要求
  1. 要指定夠的權限 (IAM Role) 給 NAT 的機器,因為他要可以控制路由表還有改動子網路的路由對應關係。
  2. 要安裝好 jq ,因為需要解析很多 json 文件,這是我目前找到覺得最方便在命令列底下做事情的小程式,就不用在自己寫 python 之類的,簡單來說,就是懶XD
  3. 要先把 subnet 開好,指定好 Tag 的名字是 NeedNAT,值裡面就放 1,考慮到不是每個子網路都需要經過 NAT,就設計了這個 Tag 用來區別需要 NAT 跟不需要 NAT 的子網路
以上條件都滿足之後,應該就可以開開心心地執行這隻程式來架 NAT ,不過畢竟是第一次的概念,或許還有一些地方不完全,裡面也完全沒寫到錯誤處理,有任何問題還麻煩大家在這裡或是 github 那邊跟我說一下。

預計之後應該還是會找方法來實做 cross-zone 的 NAT,不過還需要一點時間來想要怎麼做溝通,heartbeat 感覺太肥,他的需求也不是我要的,我這邊只要簡單的偵測對方掛了沒,然後把路由表切到自己身上,等對方活過來再切回去這樣,不過還要考慮 3AZ 以上的情形,感覺有點棘手。

2015年6月8日 星期一

如何使用加密磁區當作 EC2 的根磁區

最近剛好在處理公司的機器上 AWS 的事情,當然其中一間就會是對資料的安全有疑慮,查呀查的發現 AWS 有佛心的提供了 KMS (Key Management Service) 這個服務,裡頭是宣稱你的資料很安全,他們不會偷偷幫你解密之類的,不過有沒有其他人會就不知道了 XD

總之,如果你拿來當資料區使用是完全不會有任何問題的,你可以很方便的再加入磁碟或是創建磁碟的時候勾選加密,在擺到你機器上去,他的效能也完全不會有任何影響,但是文件裡面(http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)寫到了"
Encrypted boot volumes are not supported at this time."

什麼!!這是晴天霹靂啊,居然都提供了加密的功能,卻又不給根磁區加密,這這這.....不合邏輯啊。

幸好後來有發現,你如果真得想要從根磁區就加密,也不是沒有方法可以做,就是麻煩了一點。我把要做的步驟列在下面:

  1. 先準備好一檯可以用加密磁區的機器,要在 m3.medium 以上
  2. 起一個自己想要用的 AMI 
  3. 在選擇磁區的時候加掛一個加密的磁區
  4. 開心的啟動吧
  5. 假設根磁區掛在 /dev/sda ; 加密磁區掛在 /dev/sdb
  6. 這時候就開始把根磁區複製過去加密磁區,工具看你要用 dd 還是 partclone 都可以,dd比較慢,可是系統內建,partclone會幫忙壓縮還有略過沒資料的地方,應該會比較快。
  7. 結束之後關機,從 AWS 控制台把根磁區跟加密詞曲都卸掉
  8. 這步驟就是重點了,把加密磁區掛載回機器上,路徑記得寫 /dev/xvda
  9. 掛載上去之後就可以開機了,噹噹~~整個系統都加密了
看起來步驟真的是超級麻煩的,不過如果真的有需求要這樣做,我是在想有幾種做法可以因應會需要 auto-scale 之類的需求,如果不靠 AMI 的話,因為現在 AWS 還不支援利用加密的 AMI 起來當作根磁曲,看來要做就都要硬幹。
  1. 起一檯機器當作母機,復製磁區的部分就由它執行。
  2. 有起機器的需求的時候就送訊息給母機,母雞就掛一個加密磁區起來,把自己的資料複製一份
  3. 母機呼叫 API 去起一檯新的子機
  4. 子機起來之後馬上關機,把本來的磁區幹掉,換上母雞做好的加密磁區
  5. 把子機叫起來,噹噹~~,又是一尾活龍
看起來目前要硬幹的話應該只能這樣做了,不過做法真的爆炸麻煩的,還是期待 AWS 什麼時候可以自己偷改我們資料,不是,是自己宣布可以利用加密磁區來當根磁碟。