

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

# 後端最佳實務
<a name="backend"></a>

使用適當的遠端後端來存放您的狀態檔案對於啟用協同合作、透過鎖定確保狀態檔案完整性、提供可靠的備份和復原、整合 CI/CD 工作流程，以及利用受管服務所提供的進階安全性、控管和管理功能，例如 HCP Terraform。

Terraform 支援各種後端類型，例如 Kubernetes、HashiCorp Consul 和 HTTP。不過，本指南著重於 Amazon S3，這是大多數 AWS 使用者的最佳後端解決方案。

作為提供高耐用性和可用性的全受管物件儲存服務，Amazon S3 提供安全、可擴展且低成本的後端，用於管理 Terraform 狀態 AWS。Amazon S3 的全球足跡和彈性超過大多數團隊透過自我管理狀態儲存可以實現的目標。此外，原生整合 AWS 存取控制、加密選項、版本控制功能和其他服務，讓 Amazon S3 成為方便的後端選擇。

本指南不提供其他解決方案的後端指引，例如 Kubernetes 或 Consul，因為主要目標對象是 AWS 客戶。對於完全在 中的團隊 AWS 雲端，Amazon S3 通常是 Kubernetes 或 HashiCorp Consul 叢集的理想選擇。Amazon S3 狀態儲存的簡單性、彈性和緊密 AWS 整合為遵循 AWS 最佳實務的大多數使用者提供了最佳基礎。團隊可以利用 AWS 服務的耐用性、備份保護和可用性，保持遠端 Terraform 狀態的高度彈性。

遵循本節中的後端建議將產生更多協作的 Terraform 程式碼庫，同時限制錯誤或未經授權的修改的影響。透過實作架構良好的遠端後端，團隊可以最佳化 Terraform 工作流程。

**Topics**
+ [使用 Amazon S3 進行遠端儲存](#amazon-s3)
+ [促進團隊協作](#team-collaboration)
+ [分隔每個環境的後端](#separate-backends)
+ [主動監控遠端狀態活動](#monitor-remote-state-activity)

## 使用 Amazon S3 進行遠端儲存
<a name="amazon-s3"></a>

在 Amazon S3 中遠端存放 Terraform 狀態，並使用 Amazon DynamoDB 實作[狀態鎖定](https://developer.hashicorp.com/terraform/language/settings/backends/s3#dynamodb-state-locking)和一致性檢查，可提供優於本機檔案儲存的主要優勢。遠端狀態可讓團隊協作、變更追蹤、備份保護和遠端鎖定，以提高安全性。

將 Amazon S3 與 S3 標準儲存類別 （預設） 搭配使用，而非暫時性本機儲存或自我管理解決方案，可提供 99.999999999% 的耐用性和 99.99% 的可用性保護，以防止意外狀態資料遺失。Amazon S3 和 DynamoDB 等 AWS 受管服務提供的服務層級協議 (SLAs)，超過大多數組織在自我管理儲存時可達成的目標。依賴這些保護來保持遠端後端可存取。

### 啟用遠端狀態鎖定
<a name="remote-state-locking"></a>

狀態鎖定會限制存取以防止並行寫入操作，並減少多個使用者同時修改的錯誤。Terraform 支援兩個 Amazon S3 後端的鎖定機制：
+ Amazon S3 原生狀態鎖定 （建議）：自 Terraform 1.10.0 起提供； 使用 Amazon S3 中的原生鎖定功能
+ DynamoDB 狀態鎖定 （已棄用）：未來 Terraform 版本中將移除的舊版方法

```
terraform {
  backend "s3" {
    bucket       = "myorg-terraform-states"
    key          = "myapp/production/tfstate"
    region       = "us-east-1"
    use_lockfile = true
  }
}
```

為了在遷移期間回溯相容性，您可以同時設定 Amazon S3 和 DynamoDB 鎖定。不過，我們建議您遷移至 Amazon S3 原生鎖定，因為 DynamoDB 型鎖定已棄用。

### 啟用版本控制和自動備份
<a name="automatic-backups"></a>

如需其他保護，請在 Amazon S3 後端 AWS Backup 上使用 啟用[自動版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)和[備份](https://docs.aws.amazon.com/AmazonS3/latest/userguide/backup-for-s3.html)。版本控制會在進行變更時保留狀態的所有先前版本。如有需要，它也可讓您還原先前的工作狀態快照，以復原不必要的變更或從意外中復原。

### 視需要還原先前的版本
<a name="remote-storage"></a>

版本控制的 Amazon S3 狀態儲存貯體可透過還原先前的已知良好狀態快照，輕鬆還原變更。這有助於防止意外變更，並提供其他備份功能。

### 使用 HCP Terraform
<a name="hcp-terraform"></a>

[HCP Terraform](https://developer.hashicorp.com/terraform/cloud-docs) 提供全受管後端替代方案，以設定您自己的狀態儲存。HCP Terraform 會自動處理狀態和加密的安全儲存，同時解鎖其他功能。

當您使用 HCP Terraform 時，狀態預設為遠端儲存，這可在整個組織中啟用狀態共用和鎖定。詳細的政策控制可協助您限制狀態存取和變更。

其他功能包括版本控制整合、政策防護機制、工作流程自動化、變數管理，以及與 SAML 的單一登入整合。您也可以使用 Sentinel 政策做為程式碼來實作控管控制。

雖然 HCP Terraform 需要使用軟體即服務 (SaaS) 平台，但對於許多團隊而言，安全性、存取控制、自動化政策檢查和協同合作功能的優點，使其成為使用 Amazon S3 或 DynamoDB 自我管理狀態儲存的最佳選擇。

輕鬆整合 GitHub 和 GitLab 等服務，搭配次要組態也吸引完全接受雲端和 SaaS 工具的使用者，以獲得更好的團隊工作流程。

## 促進團隊協作
<a name="team-collaboration"></a>

使用遠端後端，在 Terraform 團隊的所有成員之間共用狀態資料。這有助於協作，因為它可讓整個團隊了解基礎設施變更。共用後端通訊協定結合狀態歷史記錄透明度，可簡化內部變更管理。所有基礎設施變更都會經過已建立的管道，以提高整個企業的業務敏捷性。

### 使用 改善責任 AWS CloudTrail
<a name="accountability"></a>

 AWS CloudTrail 與 Amazon S3 儲存貯體整合，以擷取對狀態儲存貯體發出的 API 呼叫。篩選 [CloudTrail 事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-concepts.html#cloudtrail-concepts-events)以追蹤 `PutObject`、 `DeleteObject,` 和其他相關呼叫。

CloudTrail 日誌會顯示針對狀態變更進行每個 API 呼叫的主體 AWS 身分。使用者的身分可以比對至機器帳戶或與後端儲存互動的團隊成員。

結合 CloudTrail 日誌與 Amazon S3 狀態版本控制，將基礎設施變更繫結至套用它們的主體。透過分析多個修訂，您可以將任何更新歸因於機器帳戶或負責的團隊成員。

如果發生意外或破壞性變更，狀態版本控制會提供轉返功能。CloudTrail 會追蹤使用者的變更，讓您可以討論預防性改善。

我們也建議您強制執行 IAM 許可來限制狀態儲存貯體存取。整體而言，S3 版本控制和 CloudTrail 監控支援跨基礎設施變更進行稽核。團隊在 Terraform 狀態歷史記錄中可提高責任、透明度和稽核功能。

## 分隔每個環境的後端
<a name="separate-backends"></a>

為每個應用程式環境使用不同的 Terraform 後端。在開發、測試和生產之間分隔後端隔離狀態。

### 減少影響範圍
<a name="scope-of-impact"></a>

隔離狀態有助於確保較低環境中的變更不會影響生產基礎設施。開發和測試環境中的意外或實驗影響有限。

### 限制生產存取權
<a name="production-access"></a>

將生產狀態後端的許可鎖定為大多數使用者的唯讀存取。限制誰可以修改生產基礎設施至 CI/CD 管道並[中斷玻璃](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/break-glass-access.html)角色。

### 簡化存取控制
<a name="access-controls"></a>

在後端層級管理許可可簡化環境之間的存取控制。為每個應用程式和環境使用不同的 S3 儲存貯體，表示可以在整個後端儲存貯體上授予廣泛的讀取或寫入許可。

### 避免共用工作區
<a name="shared-workspaces"></a>

雖然您可以使用 [Terraform 工作區](https://developer.hashicorp.com/terraform/language/state/workspaces)來分隔環境之間的狀態，但不同的後端可提供更強大的隔離。如果您有共用的工作區，意外仍然會影響多個環境。

保持環境後端完全隔離可將任何單一故障或違規的影響降至最低。個別後端也會將存取控制與環境的敏感度等級保持一致。例如，您可以為生產環境提供寫入保護，並為開發和測試環境提供更廣泛的存取。

## 主動監控遠端狀態活動
<a name="monitor-remote-state-activity"></a>

持續監控遠端狀態活動對於及早偵測潛在問題至關重要。尋找異常解除鎖定、變更或存取嘗試。

### 取得可疑解除鎖定的提醒
<a name="unlocks"></a>

大多數狀態變更都應透過 CI/CD 管道執行。如果狀態解鎖直接透過開發人員工作站發生，則會產生警示，這可能表示未經授權的或未測試的變更。

### 監控存取嘗試
<a name="access-attempts"></a>

狀態儲存貯體上的身分驗證失敗可能表示偵察活動。請注意，如果多個帳戶嘗試存取狀態，或出現不尋常的 IP 地址，這會發出憑證洩露的訊號。