本篇程式碼
服務整體架構
那麼首先來看看這次要佈署的服務架構:
這個架構各位可能很熟悉,畢竟這次基本上就是把之前用過的東西都拉回來,包含 VPC/subnet/db_subnet_group/rds/EC2/lambda 等等的各種東西。
雖然過去透過手動佈署問題也不大,但每次用 Terraform 佈署爬蟲後還得手動複製 rds 的連線資訊到閱讀器那邊才能完成佈署實在很麻煩。所以這次我們將要整合 Terraform 與 Serverless framwork 的佈署流程,以達到「一鍵」佈署(雖然也就只是個 script),順便做個段落總結。
佈署程式碼解說
這次我們把專案直接分割為 crawler
與 reader
兩個資料夾。 crawler/env
裡面放 terraform 的佈署程式碼, reader/
內則是直接放 serverless.yml。因此要完成「一鍵佈署」,主要會需要做以下幾件事:
- 進入 crawler/env 執行
terraform plan -out dev.tfplan
與terraform apply dev.tfplan
- 將上一步佈署的 rds 的相關資料輸出為 serverless 能吃的環境變數設定檔
- 進入 reader/,確認 rds 的相關連線資訊能在 .env 中找到
- 執行
sls deploy
其中 .env
格式如下:
db_host=ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
db_port=3306
db_name=comicdb
db_user=DB_USERNAME
db_pass=DB_PASSWORD
這次針對爬蟲與閱讀器都沒什麼特別的變更,就是把上面的步驟寫成一個 script,下面就介紹這份 script:
內容很短,比較特別的可能是這裡使用 terraform output -json
與 jq 來生成 .env
檔案(內容如前述)。terraform output
實際上只是輸出最近一次 deploy 中所定義的 output 以及其內容,因為其不會真的佈署的特性其實還算好用,尤其像這次用 Terraform 與 Severless Framework 來一起佈署的狀況,與第三方的佈署工具結合時總會方法來做工具之間的互動。
結語
其實在目前的應用上,單用 Terraform 便足以完成所有的佈署工作,但這裡本藻希望用最單純的方式展現兩套不同的佈署工具的結合方法。畢竟現實中的軟體系統之間總是存在邊界的,這包括但不限於:不同的開發團隊,不同的服務對象、不同的業務職責甚至是不同的物理環境。
對於這些明顯涇渭分明的服務,我們要確保它們獨立性以避免干擾,卻也同時要讓它們越過邊界互動,這著實增加了我們的工作難度。在這樣的背景下,各個佈署工具之間必然需要溝通。以上雖然粗糙但希望能給你一點靈感。
另外,雖然感覺好像開始越寫越短了,不過各位請放心,下一篇估計又會是篇長文。總之,有興趣就請持續關注吧。
下篇預告
ecr +lambda = 地獄