OpsWorks + Docker 管理架構

今(昨?)天在公司跟同仁分享的經驗,簡單筆記一下:

  • Elastic Beanstalk 自訂的彈性與便利性,都比不上 OpsWorks。
  • 公司在 Web 的主要使用語言是 Ruby:
    • OpsWorks = AWS + Chef
    • Chef 是用 Ruby 來管理 infrastructure
    • 所以相對來說,入門門檻相對較低
    • 理想上,應該可以跟 Vagrant 用同一套 Chef Cookbook(s),達成跨方案快速部署開發與營運環境
  • OpsWorks 每個 Stack 內只允許有一個 Rails App layer
    • 如果覺得在 custom layer 照抄 AWS 的 Rails App layer 套用的 recipes,就可以解決這個限制,你就會踩雷踩到想哭。
    • 如果為了要使用內建的 Rails App layer 而拆分到不同 stacks,又顯得太蠢,且無法佔到「放在同一個 stack 時可共用很多管理資料」的便宜。
  • 目前(我)已知最好的方法,就是架 Docker
    • 利用 Docker 的隔間特性,以 KTV 包廂為例,理想上 (container) A 房間開趴,不會影響到 (container) B 房間,更不會影響到大廳 (host)。
    • 所以我們甚至可以一台 EC2 instance 裡部署 A 應用,如果資源有餘裕,就可以堆 B 應用、C 應用、D 應用…而不互相打架,且不會被 OpsWorks 一堆未知的地雷炸到。
    • 實務上我會這樣堆疊:debian:stable → rvm-ruby-base → rails-base → app-base → app。
    • rvm-ruby-base 就是先在裡頭裝好 RVM 以及 Ruby。
    • rails-base 是預先裝 Rails 會用到的 Debian packages 如 NodeJS (XD)
    • app-base 預先 git clone 把 application 的 code 拉下來,先跑 bundle install,這樣預先裝好一堆落落長的 gems 後,往後疊 app 上去就不用把時間耗在重新安裝。
    • app 則是做 git pull,把異動拉下來後認 branch/tag 部署。這個放在 deploy 類的 recipes 底下,上面那些則是擺在 setup 類底下。
  • 好處:
    • 我們基於 Rails 的產品很多,用 AWS 也用很大,所以每個產品理想上都可以用同一套 cookbook(s) 做部署基礎,只需在 deploy 這邊自訂個別需求就好。
    • 就算不用 Rails,還是可以在 rvm-ruby-base 上疊其他的 Ruby 應用。
    • 好,就算不用 Ruby,你還是可以在 debian:stable 上堆其他應用。
    • 因為用了 OpsWorks & Chef,我們可以用 template 動態產生 Dockerfile 以及設定檔,可以當成「超彈性隨你玩加強版 ECS (EC2 Container Service)」來用。
  • 先決條件:
    • 規劃良好的 VPC subnets, security groups
    • 看 AWS 官方的 cookbooks 怎麼寫,模仿,並瞭解 node 物件有哪些東西可以方便我們部署
    • 考量日後發展,彈性劃分 Docker 堆疊

CC BY-SA 4.0 This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Leave a Reply

Your email address will not be published. Required fields are marked *