2017-06-21 129 views
3

Terraform 0.9.5。Terraform共享狀態

我在組建一個小組,我們的基礎架構團隊和自動化團隊將使用以標準方式,進而創建資源模塊的過程中創建堆棧來提供不同的ENVS。一切運作良好。

喜歡用terraform共享狀態的所有球隊成爲一個問題。我已經配置terraform來使用s3後端,它是版本化和加密的,通過一個Dynamo數據庫表添加了一個鎖。完善。所有具有本地戶口的工作...好問題...

我們有多個AWS賬戶,1 IAM,1計費,1進行生產,1用於非生產,1共享服務等...你會得到我要去的地方。我的問題如下。

我作爲用戶在我們的IAM帳戶進行身份驗證,並承擔所需的角色。直到我引入terraform後端配置才能將s3用於共享狀態之前,這一直像夢一樣工作。它看起來像terraform內的後端配置需要在〜/ .aws/credentials中設置默認憑證。它看起來像這些必須是s3存儲桶創建帳戶的本地用戶。

有沒有辦法讓後臺的配置設置這樣一種方式,它會使用供應商中配置vim的信任狀和作用?有沒有更好的方式來配置共享狀態和鎖定?任何建議表示歡迎:)

更新:得到這個工作。我在創建s3存儲桶的帳戶中創建了一個新用戶。創建了一個策略,在特定的s3存儲桶和dynamodb表上允許新用戶s3:DeleteObject,GetObject,PutObject,ListBucket和dynamodb:*。創建一個自定義憑證文件並添加分配給該新用戶的訪問密鑰和密鑰的默認配置文件。使用後端配置類似於

terraform { 
required_version = ">= 0.9.5" 

backend "s3" { 
bucket     = "remote_state" 
key      = "/NAME_OF_STACK/terraform.tfstate" 
region     = "us-east-1" 
encrypt     = "true" 
shared_credentials_file = "PATH_TO_CUSTOM_CREDENTAILS_FILE" 
lock_table    = "MY_LOCK_TABLE" 
} 
} 

它的工作原理,但有一個初始配置需要發生在您的配置文件,以使其工作。如果有人知道更好的設置或可以識別我的後端配置問題,請讓我知道。

+0

從你的描述來看,很多主要的觀點都是基於這個觀點的。 Terraform從不要求您共享狀態文件。 – BMW

+0

它似乎按預期工作。我爲每個堆棧使用不同的密鑰,並使用一個dynamodb表。 – DMcKenna

回答

3

Terraform預計後端配置是靜態的,並且不允許它包含插值變量,因爲在配置中的其他地方可能會出現這種情況,因爲在完成其他工作之前需要對後端進行初始化。

由於這個原因,使用不同的AWS賬戶多次應用相同的配置可能會非常棘手,但有兩種方法是可能的。


最低摩擦的方式是建立一個單一的S3桶和DynamoDB表專用於狀態存儲在所有的環境中,並使用S3許可和/或IAM政策施加粒狀訪問控制。

採用此策略的組織有時會在單獨的「管理」AWS賬戶中創建S3存儲桶,然後將存儲區中的各個狀態對象的限制訪問授予將在其他每個賬戶中運行Terraform的特定角色。

該解決方案的優點是,一旦在S3中正確設置了Terraform,就可以常規地使用Terraform,而無需任何不尋常的工作流程:在後端配置單個S3存儲桶,並通過環境變量提供適當的憑據, 。一旦後端初始化,使用state environments(即將在Terraform 0.10中將其重命名爲工作空間)爲單個配置的每個目標環境創建單獨的狀態。

當然,缺點是需要管理圍繞S3的更復雜的訪問配置,而不是簡單地依靠整個AWS賬戶的粗略訪問控制。由於DynamoDB上的訪問控制功能不夠靈活,因此DynamoDB也更具挑戰性。


如果一個複雜的結構S3是不希望的,複雜度可以被替代地使用partial configuration移入Terraform工作流程。在此模式下,配置中僅提供了一部分後端設置,運行terraform init時在命令行上提供了其他設置。

這使得選項運行之間有所不同,但因爲它需要額外的參數,以提供採用這種方法將使用包裝腳本適當地根據當地慣例配置Terraform大多數組織。這可以只是一個簡單的shell腳本,它運行帶有合適參數的terraform init

然後這允許通過在命令行上提供自定義憑證文件來改變自定義憑證文件。在這種情況下,不使用狀態環境,相反,在環境之間切換需要根據新的後端配置重新初始化工作目錄。

該解決方案的優勢在於,只要差異可以表示爲CLI選項,它就不會對S3和DynamoDB的使用施加任何特定的限制。

缺點是需要異常的工作流程或包裝腳本來配置Terraform。