了解地形狀態和後端 - AWS 規定指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

了解地形狀態和後端

其中一個在基礎設施作為代碼(IaC)的最重要的概念是狀的概念。IaC 服務維護狀態,可讓您在 IaC 檔案中宣告資源,而不需要在每次部署時重新建立資源。IaC 檔案會記錄部署結束時所有資源的狀態,以便它可以比較該狀態與目標狀態,如下次部署中所宣告的狀態。因此,如果目前狀態包含名為的 Amazon Simple Storage Service (Amazon S3) 儲存貯體,my-s3-bucket而傳入的變更也包含該相同儲存貯體,則新程序會將找到的任何變更套用至現有儲存貯體,而不是嘗試建立全新儲存貯體。

下表提供了一般 IaC 狀態處理程序的範例。

目前狀態 目標狀態 動作
未命名 S3 儲存貯體 my-s3-bucket S3 儲存貯體命名 my-s3-bucket 建立名為的 S3 儲存貯體 my-s3-bucket
my-s3-bucket未設定值區版本控制 my-s3-bucket未設定值區版本控制 無動作
my-s3-bucket未設定值區版本控制 my-s3-bucket已設定值區版本控制 設定my-s3-bucket為使用值區版本控制
my-s3-bucket已設定值區版本控制 未命名 S3 儲存貯體 my-s3-bucket 嘗試刪除 my-s3-bucket

要了解 AWS CloudFormation 和 Terraform 跟踪狀態的不同方式,請務必記住兩種工具之間的第一個基本差異:託管在內部 AWS 雲端,而 Terraform 本質上 CloudFormation 是遠程的。這個事實允許 CloudFormation 在內部維持狀態。您可以轉到 CloudFormation 控制台並查看給定堆棧的事件歷史記錄,但 CloudFormation 服務本身會為您強制執行狀態規則。

在給定資源下 CloudFormation 運作的三種模式為CreateUpdate、和Delete。目前模式是根據上次部署中發生的情況來決定,否則無法受到影響。您也許可以手動更新 CloudFormation 資源以影響確定哪種模式,但是您不能將命令傳遞給「 CloudFormation 對於此資源,請在Create模式下操作」。

由於 Terraform 未託管於中 AWS 雲端,維護狀態的程序必須更具設定性。因此,Terraform 狀態會維持在自動產生的狀態檔案中。Terraform 開發人員必須比他們更直接地處理狀態。 CloudFormation要記住的重要一點是,跟踪狀態對於這兩種工具同樣重要。

默認情況下,Terraform 狀態文件存儲在運行 Terraform 堆棧的主目錄的頂級本地。如果您從本地開發環境運行terraform apply命令,則可以看到 Terraform 生成它用於實時維護狀態的 terraform.tfstate 文件。無論好壞,這使您對 Terraform 中的狀態擁有比您更多的控制權。 CloudFormation雖然您不應該直接更新狀態檔案,但您可以執行數個 Terraform CLI 命令,這些命令會在部署之間更新狀態。例如,地形匯入可讓您將在 Terraform 之外建立的資源新增到部署堆疊中。相反,您可以通過運行地狀態 rm 從狀態中刪除資源。

Terraform 需要將其狀態存儲在某個地方的事實導致另一個不適用於的概念 CloudFormation:後端。形後端是 Terraform 堆棧部署後存儲其狀態文件的地方。這也是它預期在新部署開始時尋找狀態檔案的位置。當您在本機執行堆疊時,如上所述,您可以在頂層本機目錄中保留 Terraform 狀態的副本。這就是所謂的本地後端

針對持續整合和持續部署 (CI/CD) 環境進行開發時,本機狀態檔案通常會包含在 .gitignore 檔案中,以避免其不受版本控制。然後管道中沒有本地狀態文件。為了正常工作,該管道階段需要在某處找到正確的狀態文件這就是為什麼 Terraform 配置文件通常包含後端塊的原因。後端塊向 Terraform 堆棧指示它需要查找自己的頂級目錄以外的某個地方才能找到狀態文件。

Terraform 後端幾乎可以位於任何地方:Amazon S3 儲存貯體API 端點,甚至是遠端 Ter raform 工作區。以下是存放在 Amazon S3 儲存貯體中的 Terraform 後端範例。

terraform { backend "s3" { bucket = "my-s3-bucket" key = "state-file-folder" region = "us-east-1" } }

為了避免在 Terraform 配置文件中存儲敏感信息,後端還支持部分配置。在前面的範例中,存取值區所需的認證不存在於組態中。您可以從環境變數或使用其他方式取得認證,例如 AWS Secrets Manager。如需詳細資訊,請參閱使用 AWS Secrets Manager 和 HashiCorp Terraform 保護敏感資料的安全。

常見的後端案例是在本機環境中用於測試目的的的本機後端。.gitignore 檔案包含在 .gitignore 檔案中,因此不會將其推送至遠端儲存庫。然後,CI/CD 管線中的每個環境都會維持其自己的後端。在這個案例中,多個開發人員可能會存取這個遠端狀態,因此您想要保護狀態檔案的完整性。如果多個部署正在執行並同時更新狀態,則狀態檔案可能會損毀。因此,在非本機後端的情況下,狀態檔案通常會在部署期間鎖定