2017-10-06 75 views
1

我們以下面的模塊爲例。我應該爲整個應用程序堆棧創建簡單模塊還是模塊?

https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/1.0.1

如果我的應用程序棧需要幾個web服務器,一個ELB和MySQL服務器,我打算利用模塊,這樣我不會重複我的代碼。我的問題是,我是否應該有上面列出的簡單模塊(其中一個用於ELB,另一個用於MySQL),然後在env-dev/app/apollo/main.tf內合併所有這些模塊?

實施例結構:

├── env-dev 
│   └── app 
│    └── apollo 
│     └── main.tf 
├── env-test 
├── global 
├── mgmt 
└── modules 
    ├── ec2-elb 
    └── ec2-instance 
     ├── LICENSE 
     ├── main.tf 

如果我env-dev/app/apollo/main.tf源兩個模塊來構建應用程序或我應該創建模塊與ELB沿着構建出實例?

回答

2

一般來說,只有在對使用施加某些限制時(例如應用特定於組織的約定),或者如果它代表大量的資源行爲(從系統的角度來看) )作爲可能被多次實例化的原子單元。

您鏈接到的註冊表模塊不是一個可重用模塊的好例子,因爲它僅僅是一個現有資源的包裝,完全通過輸入參數並且沒有增加可以直接用resource塊表示的值。這個模塊更像是一個「入門」的例子,可以複製到你的根模塊中,而不是直接調用的東西,因爲它不會提高抽象級別,比它包裝的資源高。

有幾種不同的方式來處理Terraform配置的結構,但是當建模簡單的東西時,我建議先從一個根模塊開始,它內部有直接的resource塊。隨着時間的推移,您可能會注意到某些資源在相同配置或多個配置下被有效地複製粘貼(通過微小的調整);那時我會考慮將這些資源分解成可以多次實例化的模塊。

有多少東西應該組合到一個模塊中沒有確定的答案。就像使用編程語言的函數一樣,通常可以在可以組合在一起的小型構建塊的一側出錯,而不是大型且不靈活的單元。但是,確切地畫線的地方取決於情況。做出決定,考慮你期望需要支持的不同排列,以及哪些東西似乎「自然地」屬於一個整體。

如果你第一次沒有把它做對,那麼它不是世界的盡頭,因爲當你重構你的配置時,你可以使用terraform state mv命令在模塊之間移動資源狀態。

相關問題