
我一直在尋找一種 Terraform 方法,能夠在 Terraform 中同時部署到多個 AWS 帳戶,但最終還是失敗了。 AWS有使用Stacks執行此操作的概念,但我不確定是否有辦法在TF中執行此操作?如果是這樣,有哪些解決方案?
您可以在此處閱讀有關 AWS 解決方案的更多信息,https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/
答案1
要在多個 AWS 帳戶中使用相同的 terraform 配置,需要克服兩個問題。首先,您需要為每個帳戶使用不同的狀態文件。第二,確保 AWS 提供者為所需帳戶使用正確的設定檔/憑證。
為每個帳戶使用不同的狀態文件
在較高層面上,Terraform 只需從給定的 terraform 設定檔 (*.tf) 建立依賴資源圖即可運作;並將它們與狀態文件進行比較。狀態檔案可以是本機 ( terraform.tfstate
) 或遠端後端;常見的AWS遠端後端是s3。
即使您透過變數指定 AWS 提供者使用單獨的帳戶(下文將詳細介紹),如果兩個帳戶使用相同的後端,terraform 也會不斷崩潰。之所以會發生這種情況,是因為當它從一個帳戶切換到另一個帳戶時,資源 AWS ID 將不匹配,並且/或狀態檔案中將聲明 terraform 目前正在查看的帳戶中不存在的資源。
解決這個問題的一個簡單方法是使用工作空間。工作區允許您使用不同的狀態文件,而無需指定不同的後端金鑰。使用工作區非常簡單。如果您有一個簡單的地形塊,例如:
terraform {
backend "s3" {
bucket = "aws_bucket"
key = "terraform.tfstate"
region = "us-east-1"
}
}
您可以使用建立新的工作區terraform workspace new <workspace-name>
。因此,您可以使用以下順序為兩個帳戶建立一個工作區:
terraform workspace new account-1
terraform workspace new account-2
您可以使用以下命令切換目前工作區terraform workspace select
:
terraform workspace select account-1
將 AWS 供應商配置為工作區感知型
除了使用單獨的狀態文件之外。您還需要為每個所需帳戶指定不同的 AWS 憑證(即存取金鑰)。 AWS 憑證使用提供者。 在這種情況下,我們顯然使用的是AWS 提供者。。你本質上想使用插值法在 AWS 提供者資源區塊內,因此當您切換工作區時,terraform 將使用正確的憑證。假設您的 aws 憑證檔案設定為每個帳戶都有一個單獨的設定檔:
[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
然後你可以簡單地將你的 aws 提供者區塊寫成:
provider "aws" {
region = "us-east-1"
profile = "${terraform.workspace}"
}
因此,只要您將工作區命名為 aws 設定檔名稱,那麼當您切換工作區時,terraform 將在刷新狀態和建立依賴關係圖時使用不同的 aws 憑證設定檔。
替代方法
到目前為止,這並不是實現這一目標的唯一方法。你可以建構模組;然後使用不同的目錄來呼叫具有不同 AWS 提供者和指定狀態檔案的模組。每種方法都有優點和缺點。
工作空間方法是使用單一目錄執行此操作的方法,並且您將使用與編寫的完全相同的 terraform 設定檔。
模組需要單獨的配置文件,至少調用模組並指定提供者和後端。如果您打算進行多帳戶、多區域和多環境,那麼模組將非常有意義。例如,如果您要在每個帳戶的兩個區域和兩個不同的環境(暫存和生產)中運作。模組在這裡很有意義,因為它使用計數等參數提供了靈活性(也許登台將運行更少數量的實例等)。
答案2
基本上,技巧是取得一個共用儲存桶中的狀態,並為切換帳戶時提供的憑證指定不同的憑證。工作空間非常適合我
provider "aws" {
version = "~> 2.18"
profile = "second_account"
}
terraform {
backend "s3" {
encrypt = true
bucket = "shared_bucket"
region = "us-east-1"
key = "state"
profile = "first_shared_account"
}
required_version = "~> 0.12.7"
}
請注意為提供者和後端配置指定的不同設定檔。您可以擁有一堆不同的配置文件,只要每個配置文件都通過自己的工作區隔離即可
aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account