

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

# CloudFormation 最佳實務
<a name="best-practices"></a>

最佳實務是一些建議，可協助您在整個工作流程中更有效地使用 CloudFormation 並採用安全的實務。了解如何規劃和組織您的堆疊、建立範本來描述您的資源和對其執行的軟體應用程式，以及管理您的堆疊及其資源。以下最佳實務是根據目前 CloudFormation 客戶的實際體驗。

**規劃與組織**  
+ [縮短回饋迴圈以提高開發速度](#shortenfeedbackloop)
+ [依生命週期和所有權組織您的堆疊](#organizingstacks)
+ [使用跨堆疊參考來傳回另一個堆疊匯出的輸出值](#cross-stack)
+ [針對多帳戶和多區域部署使用 CloudFormation StackSets](#stack-sets)
+ [重複使用範本在多個環境中複製堆疊](#reuse)
+ [驗證所有資源類型的配額](#limits)
+ [使用模組以重複使用資源組態](#modules-reuse)
+ [採用基礎設施作為程式碼實務](#infrastructure-as-code)

**建立範本**  
+ [請勿在您的範本中內嵌憑證](#credentials)
+ [使用 AWS特定的參數類型](#parmtypes)
+ [使用參數限制條件](#parmconstraints)
+ [使用虛擬參數提升可攜性](#pseudoparameters)
+ [使用 `AWS::CloudFormation::Init` 在 Amazon EC2 執行個體上部署軟體應用程式](#cfninit)
+ [使用最新的協助程式指令碼](#helper-scripts)
+ [驗證後再使用範本](#validate)
+ [使用 YAML 或 JSON 來撰寫範本](#use-yaml-json)
+ [實作全面的標記策略](#resource-tags)
+ [利用範本巨集進行進階轉換](#template-macros-advanced-transformations)

**管理堆疊**  
+ [透過 CloudFormation 管理所有堆疊資源](#donttouch)
+ [更新您的堆疊之前建立變更集](#cfn-best-practices-changesets)
+ [使用堆疊政策來保護資源](#stackpolicy)
+ [使用 AWS CloudTrail 記錄 CloudFormation 呼叫](#cloudtrail-logging)
+ [使用程式碼檢閱和修訂控制管理您的範本](#code)
+ [定期更新 Amazon EC2 執行個體](#update-ec2-linux)
+ [定期使用偏離偵測](#drift-detection)
+ [設定自動復原的復原觸發條件](#rollback-triggers)
+ [實作有效的堆疊重構策略](#stack-refactoring-bp)
+ [使用 CloudFormation Hooks 進行生命週期管理](#cloudformation-hooks)

**編寫工具**  
+ [使用 IaC 產生器從現有資源中建立範本](#iac-generator)
+ [AWS Infrastructure Composer 用於視覺化範本設計](#infrastructure-composer)
+ [考慮將 AWS Cloud Development Kit (AWS CDK) 用於複雜的基礎設施](#cdk-integration)

**安全和合規**  
+ [使用 IAM 控制存取](#use-iam-permissions-to-control-access)
+ [套用最低權限準則](#least-privilege)
+ [保護敏感參數](#secure-parameters)
+ [使用 將政策實作為程式碼 AWS CloudFormation Guard](#cfn-guard)

## 縮短回饋迴圈以提高開發速度
<a name="shortenfeedbackloop"></a>

採用適當的實務和工具，協祝您針對使用 CloudFormation 範本描述的基礎設施縮短回饋迴圈。這包括在工作站中對範本執行早期檢查和測試；這樣一來，在將成品提交至原始碼儲存庫之前，您還有機會發現潛在的語法和組態問題。早期發現這類問題有助於防止它們進入正式的生命週期環境，例如開發、品質保證和生產。這種早期測試、快速檢錯方法可讓您減少重工等待時間、減少潛在的影響區域，以及增加成功佈建作業的信心程度。

有助於實現快速檢錯實務的工具選擇包括 [CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) (`cfn-lint`) 和 [TaskCat](https://github.com/aws-ia/taskcat) 命令列工具。`cfn-lint` 工具可讓您根據 [CloudFormation 資源規格](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-resource-specification.html)來驗證您的 CloudFormation 範本。這包括檢查資源屬性的有效值，以及最佳實務。`cfn-lint` 的外掛程式[適用於許多程式碼編輯器](https://github.com/aws-cloudformation/cfn-lint#editor-plugins)；這可讓問題在編輯器中一目了然，為您提供直接的 linter 回饋。您也可以選擇將 `cfn-lint` 整合到原始碼儲存庫的組態中，以便在提交成品時執行範本驗證。如需詳細資訊，請參閱[使用 對 CloudFormation 範本進行 Git 預先遞交驗證`cfn-lint`](https://aws.amazon.com/blogs/mt/git-pre-commit-validation-of-aws-cloudformation-templates-with-cfn-lint/)。執行初始檢查並修正了 `cfn-lint` 可能找出的任何問題之後，您可以使用 TaskCat 在您選擇的 AWS 區域 中以程式設計方式建立堆疊來測試範本。TaskCat 也會針對您選擇的每個區域產生包含合格/失敗等級的報告。

如需有關如何使用這兩種工具縮短回饋迴圈的逐步實作演練，請按照 [CloudFormation Workshop](https://catalog.workshops.aws/cfn101/en-US) 的 [Linting and Testing 實驗室](https://catalog.workshops.aws/cfn101/en-US/basics/templates/linting-and-testing)進行操作。

## 依生命週期和所有權組織您的堆疊
<a name="organizingstacks"></a>

使用 AWS 資源的生命週期和擁有權，協助您決定每個堆疊中應包含的資源。一開始，您可能會將所有資源放在一個堆疊中，但隨著您的堆疊逐漸成比例成長且範圍越來越廣泛，管理單一堆疊可能既繁瑣又耗時。透過根據通用生命週期和所有權來分組資源，擁有者就可以使用自己的程序和排程來變更一組資源，無需影響其他資源。

例如，假設開發人員和工程師團隊擁有一個網站，它託管在負載平衡器後方的 Amazon EC2 Auto Scaling 執行個體上。由於網站有自己的生命週期並由網站團隊維護，因此您可以建立網站及其資源的堆疊。現在，假設網站也會使用後端資料庫，這些資料庫位於資料庫管理員擁有及維護的個別堆疊中。每當網站團隊或資料庫團隊需要更新其資源時，都可以在不影響彼此的堆疊下執行這項操作。如果所有資源都在同一個堆疊中，協調及傳達更新可能很困難。

如需組織您堆疊的其他指引，您可以使用兩個常見架構：多層架構和服務導向架構 (SOA)。

分層架構可將堆疊組織成彼此重疊的多個水平層，每個 layer 會相依於其正下方的 layer。您可以在每個 layer 中有一或多個堆疊，但在每個 layer 內，您的堆疊應該有生命週期和所有權類似的 AWS 資源。

使用服務導向架構，您可以將龐大的商務問題組織成多個易於管理的部分。每個部分都是一項服務，其具有明確定義的用途，並代表獨立的功能單位。您可以將這些服務映射至堆疊，每個堆疊都有自己的生命週期和擁有者。所有服務 (堆疊) 都可連接在一起，以便彼此互動。

## 使用跨堆疊參考來傳回另一個堆疊匯出的輸出值
<a name="cross-stack"></a>

當您根據生命週期和擁有權組織 AWS 資源時，建議您建置使用另一個堆疊中資源的堆疊。您可以硬式編碼值，或使用輸入參數來傳遞資源名稱和 ID。不過，這些方法可能會讓範本難以重複使用，或可能增加讓堆疊執行的成本。反之，請使用跨堆疊參考來傳回由另一個堆疊匯出的輸出值，以便其他堆疊可以對其進行使用。堆疊可以透過使用 `Fn::ImportValue` 函數呼叫匯出的資源，來使用這些資源。

例如，您可能有一個網路堆疊，其中包含 VPC、安全群組和子網路。您想要讓所有公有 Web 應用程式使用這些資源。透過匯出資源，即允許具有公有 Web 應用程式的所有堆疊使用這些資源。如需詳細資訊，請參閱[從部署的 CloudFormation 堆疊取得匯出的輸出](using-cfn-stack-exports.md)。

## 針對多帳戶和多區域部署使用 CloudFormation StackSets
<a name="stack-sets"></a>

CloudFormation StackSets 可讓您透過單一操作跨多個帳戶和區域建立、更新或刪除堆疊，藉此擴充堆疊的功能。使用 StackSets 在整個組織中部署常見的基礎設施元件、合規控制或共用服務。

使用 StackSets 時，使用 實作服務受管許可 AWS Organizations ，以簡化許可管理。此方法可讓您將 StackSets 部署到組織內的帳戶，而不需要在每個帳戶中手動設定 IAM 角色。

如需有關 StackSets 的詳細資訊，請參閱 [StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html)。

## 驗證所有資源類型的配額
<a name="limits"></a>

啟動堆疊之前，請確定您可以建立所需的所有資源，而不會達到 AWS 您的帳戶限制。如果您達到限制，在您提高配額或刪除額外資源之前，CloudFormation 都無法成功建立您的堆疊。每項服務可能會有各種限制，需要您在啟動堆疊前注意。例如，根據預設，您只能在 AWS 帳戶的每個區域啟動 2000 個 CloudFormation 堆疊。如需有關限制及如何提高預設限制的詳細資訊，請參閱 *AWS 一般參考* 中的 [AWS 服務配額](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

## 重複使用範本在多個環境中複製堆疊
<a name="reuse"></a>

設定您的堆疊和資源之後，您可以重複使用範本在多個環境中複製您的基礎設施。例如，您可以建立適用於開發、測試和生產的環境，讓您可以測試變更，再將其實作到生產環境中。為了讓範本可重複使用，請使用參數、映射和條件區段，以便在建立堆疊時能夠自訂這些堆疊。例如，對於您的開發環境，您可以指定相較於生產環境成本較低的執行個體類型，但所有其他組態和設定則保持不變。如需參數、映射和條件的詳細資訊，請參閱[CloudFormation 範本區段](template-anatomy.md)。

## 使用模組以重複使用資源組態
<a name="modules-reuse"></a>

隨著您的基礎設施逐漸成長，可能出現的常見模式即是您會在每個範本中宣告相同的元件。*模組*可讓您以透明、易於管理且可重複的方式，來封裝可包含在堆疊範本之間的資源組態。模組可透過可自訂的模組化建置區塊形式，來封裝通用服務組態和最佳實務，以便您將其納入堆疊範本中。

這些建置區塊可用於單一資源，例如定義 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的最佳實務；也可以用於多個資源，以定義應用程式架構的常見模式。這些建置區塊可以嵌套到其他模組中，因此您可以將最佳實務堆疊到較高層級的建置區塊中。CloudFormation 模組在 [CloudFormation 登錄檔](registry.md)中可用，因此您可以像使用原生資源一樣使用这些模组。當您使用 CloudFormation 模組時，會將模組範本被擴展到消費範本，這樣一來，您可以存取使用 [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html) 或 [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html) 模組內的資源。如需詳細資訊，請參閱[透過 CloudFormation 模組建立可跨範本納入的可重複使用資源組態](modules.md)。

## 採用基礎設施作為程式碼實務
<a name="infrastructure-as-code"></a>

透過實作基礎結構即程式碼 (IaC) 實務，將 CloudFormation 範本視為程式碼。將您的範本存放在版本控制系統中，實作程式碼檢閱，並使用自動化測試來驗證變更。此方法可確保一致性，改善協同合作，並提供基礎設施變更的稽核軌跡。

請考慮為您的基礎設施程式碼實作 CI/CD 管道，以自動化 CloudFormation 範本的測試和部署。 AWS CodePipeline AWS CodeBuild和 等工具 AWS CodeDeploy 可用於為您的基礎設施部署建立自動化工作流程。

如需實作 IaC 最佳實務的詳細資訊，請參閱[使用 AWS CloudFormation 做為 IaC 工具](https://docs.aws.amazon.com/prescriptive-guidance/latest/choose-iac-tool/cloudformation.html)。

如需有關搭配使用持續交付與 CloudFormation 的詳細資訊，請參閱[使用 CodePipeline 進行持續交付](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline.html)。

## 請勿在您的範本中內嵌憑證
<a name="credentials"></a>

建議您在堆疊範本中使用*動態參考*，而不要在 CloudFormation 範本中嵌入敏感資訊。

動態參考提供精簡且強大的方式，讓您參考儲存在其他服務中的外部值，例如 AWS Systems Manager 參數存放區或 AWS Secrets Manager。當您使用動態參考時，在堆疊和變更集操作期間，CloudFormation 會在必要時擷取指定參考的值，並將值傳遞至適當的資源。不過，CloudFormation 絕不會存放實際參考值。如需詳細資訊，請參閱[使用動態參考來指定範本值](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)。

[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可協助您安全地加密、存放和擷取資料庫和其他服務的登入資料。[AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)提供安全的階層式儲存，以管理組態資料。

如需定義範本參數的詳細資訊，請參閱[CloudFormation 範本 Parameters 語法](parameters-section-structure.md)。

## 使用 AWS特定的參數類型
<a name="parmtypes"></a>

如果您的範本需要輸入現有 AWS特定值，例如現有 Amazon Virtual Private Cloud IDs或 Amazon EC2 AWS金鑰對名稱，請使用特定參數類型。例如，您可以將參數指定為類型 `AWS::EC2::KeyPair::KeyName`，這會使用您 和您建立堆疊 AWS 帳戶 之區域中的現有金鑰對名稱。CloudFormation 可以在建立堆疊之前快速驗證 AWS特定參數類型的值。此外，如果您使用 CloudFormation 主控台，CloudFormation 會顯示有效值的下拉式清單，因此您不需要查詢或記住正確的 VPC ID 或金鑰對名稱。如需詳細資訊，請參閱[使用 CloudFormation 提供的參數類型，在執行時期指定現有資源](cloudformation-supplied-parameter-types.md)。

## 使用參數限制條件
<a name="parmconstraints"></a>

使用限制條件，您可以描述允許的輸入值，讓 CloudFormation 在建立堆疊之前攔截任何無效的值。您可以設定限制條件，例如長度下限、長度上限和允許的模式。例如，您可以對資料庫使用者名稱值設定限制條件，讓其長度至少為八個字元並只包含英數字元。如需詳細資訊，請參閱[CloudFormation 範本 Parameters 語法](parameters-section-structure.md)。

## 使用虛擬參數提升可攜性
<a name="pseudoparameters"></a>

您可以在範本中使用[虛擬參數](pseudo-parameter-reference.md)作為[內部函數](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)的引數，例如 `Ref` 和 `Fn::Sub`。虛擬參數為 CloudFormation 預先定義的參數。請勿在範本中宣告這些參數。在內建函數中使用虛擬參數可增加堆疊範本跨區域和帳戶的可攜性。

例如，假設您想要建立範本，其中需要針對特定資源屬性指定另一個現有資源的 [Amazon Resource Name](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html) (ARN)。在此情況下，現有資源是具有以下 ARN 的 [AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)資源：`arn:aws:ssm:us-east-1:123456789012:parameter/MySampleParameter`。您需要針對目標 AWS 分割區、區域和帳戶 ID 調整 [ARN 格式](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html#arns-syntax)。您可以使用 `AWS::Partition`、`AWS::Region` 和 `AWS::AccountId` 虛擬參數提升範本可攜性，而非對此類值進行硬式編碼。在此情況下，下列範例會示範如何將 ARN 中的元素與 CloudFormation 串連：`!Sub 'arn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter/MySampleParameter`。

針對另一個範例，假設您想要跨多個堆疊共用資源或組態。在此範例中，假設您已建立 VPC 的[子網路](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html)，然後匯出其 ID 以用於相同 AWS 帳戶 和 區域中的其他堆疊。在另一個堆疊中，您可以在描述 Amazon EC2 執行個體時，參考子網路 ID 的匯出值。如需使用 `Export` 輸出欄位和 `Fn::ImportValue` 內部函數的詳細範例，請參閱 [參考在另一個 CloudFormation 堆疊中的資源輸出](walkthrough-crossstackref.md)。

堆疊匯出在每個帳戶和區域中必須是唯一。因此，在此情況下，您可以使用 `AWS::StackName` 虛擬參數為匯出建立字首。由於每個帳戶和區域的堆疊名稱也必須是唯一，因此使用此虛擬參數作為字首會增加具有唯一匯出名稱的可能性，同時也促使在匯出值的堆疊間採行可重複使用的方法。或者，您可以自行選擇使用的字首。

## 使用 `AWS::CloudFormation::Init` 在 Amazon EC2 執行個體上部署軟體應用程式
<a name="cfninit"></a>

當您啟動堆疊時，您可以使用 `cfn-init` 協助程式指令碼和 `AWS::CloudFormation::Init` 資源，在 Amazon EC2 執行個體上安裝及設定軟體應用程式。透過使用 `AWS::CloudFormation::Init`，您可以描述想要的組態，而不用編寫程序性步驟的指令碼。您也可以更新組態，無需重新建立執行個體。此外，如果您的組態發生任何錯誤，CloudFormation 會產生日誌，以供您用來調查問題。

在您的範本中，透過 `AWS::CloudFormation::Init` 資源指定安裝和組態狀態。如需有關說明如何使用 `cfn-init` 和 `AWS::CloudFormation::Init` 的演練，請參閱 [在 Amazon EC2 上部署應用程式](deploying.applications.md)。

## 使用最新的協助程式指令碼
<a name="helper-scripts"></a>

CloudFormation 協助程式指令碼會定期更新。請務必在您範本的 `UserData` 屬性中包含下列命令，再呼叫協助程式指令碼，以確保您已啟動的執行個體取得最新的協助程式指令碼：

```
yum install -y aws-cfn-bootstrap
```

如需有關取得最新協助程式指令碼的詳細資訊，請參閱《CloudFormation 範本參考指南》中的 [CloudFormation 協助程式指令碼參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html)。**

## 驗證後再使用範本
<a name="validate"></a>

您可以使用 CloudFormation 驗證範本，再使用範本建立或更新堆疊。驗證範本可在 CloudFormation 建立任何資源之前，協助您攔截語法和一些語意錯誤，例如循環相依性。如果您使用 CloudFormation 主控台，則主控台會在您指定輸入參數之後自動驗證範本。針對 AWS CLI 或 CloudFormation API，使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/validate-template.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/validate-template.html) 命令或 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ValidateTemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ValidateTemplate.html) 操作。

在驗證期間，CloudFormation 會先檢查範本是否為有效的 JSON。如果不是，CloudFormation 會檢查範本是否為有效的 YAML。如果兩種檢查都失敗，則 CloudFormation 會傳回範本驗證錯誤。

### 驗證範本是否符合組織政策規範
<a name="validate-compliance"></a>

您還可驗證範本與組織政策指導方針的符合性。 AWS CloudFormation Guard (`cfn-guard`) 是一種開放原始碼命令行介面 (CLI) 工具，提供政策即程式碼語言，以定義可檢查必要和禁止之資源組態的規則。然後，它可讓您根據這些規則驗證您的範本。例如，管理員可建立規則以確保使用者一律建立加密的 Amazon S3 儲存貯體。

您可在本機使用 `cfn-guard`，或自動作為 CI/CD 管道的一部分，以停止不合規資源的部署。

此外，`cfn-guard` 也包含功能 `rulegen`，該功能可讓您從現有的合規 CloudFormation 範本擷取規則。

如需詳細資訊，請參閱 GitHub 上的 [cfn-guard](https://github.com/aws-cloudformation/cloudformation-guard) 儲存庫。

## 使用 YAML 或 JSON 來撰寫範本
<a name="use-yaml-json"></a>

CloudFormation 支援 YAML 和 JSON 格式的範本。每個都有其優點，選擇取決於您的特定需求：

在以下情況使用 YAML
+ 優先考慮人類可讀性和可維護性
+ 您想要包含註解以記錄範本
+ 您正在使用具有巢狀結構的複雜範本
+ 您想要使用 YAML 特定功能，例如錨點和別名，以減少重複

在下列情況下使用 JSON：
+ 您需要與偏好 JSON 的工具或系統整合
+ 您正在使用程式設計式範本產生或操作
+ 您需要嚴格的資料驗證

由於 YAML 的可讀性並支援註解，因此通常建議用於手動範本撰寫。對於複雜範本，它特別有用，因為其行首縮進式結構有助於視覺化資源階層。在自動化工作流程中或使用預期 JSON 輸入的 API 時，JSON 可能很有優勢。當您需要確保嚴格遵守特定結構時，它也很有幫助。無論選擇哪種格式，都專注於建立結構良好、有文件記錄且可維護的範本。如果使用 YAML，請利用其錨點和別名等功能來減少重複並改善可維護性。

## 實作全面的標記策略
<a name="resource-tags"></a>

為 CloudFormation 範本建立的所有資源實作一致的標記策略。標籤有助於資源組織、成本分配、存取控制和自動化。考慮包含環境、擁有者、成本中心、應用程式和用途的標籤。

使用 `AWS::CloudFormation::Stack` 資源的 `Tags` 屬性，將標籤套用至堆疊中所有支援的資源。也可以使用許多資源類型上可用的 `TagSpecifications` 屬性，在資源建立期間套用標籤。

如需詳細資訊，請參閱[資源標籤](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-resource-tags.html)。

## 利用範本巨集進行進階轉換
<a name="template-macros-advanced-transformations"></a>

CloudFormation 巨集可讓您在範本上執行自訂處理，從查找並取代操作等簡單動作，到產生其他資源的複雜轉換。使用巨集來擴展 CloudFormation 範本的功能，並在整個組織中實作可重複使用的模式。

 AWS Serverless Application Model 是巨集的範例，可簡化無伺服器應用程式的開發。請考慮為組織特定模式和需求建立自訂巨集。

如需有關在範本中使用巨集的詳細資訊，請參閱 [CloudFormation 巨集概觀](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros-overview.html)。

## 透過 CloudFormation 管理所有堆疊資源
<a name="donttouch"></a>

啟動堆疊之後，使用 CloudFormation [主控台](https://console.aws.amazon.com/cloudformation/home)、[API](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/) 或 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html) 來更新堆疊中的資源。請勿在 CloudFormation 外變更堆疊資源。這樣做可能會在您堆疊的範本與您堆疊資源的目前狀態之間產生不相符的情況，如果您更新或刪除堆疊，這可能會造成錯誤。這稱為偏離。如果對 CloudFormation 範本外部的資源進行變更，並且更新堆疊，則將捨棄直接對資源所做的變更，且資源組態將還原為範本中的組態。

如需有關偏離的詳細資訊，請參閱[什麼是偏離？](using-cfn-stack-drift.md#what-is-drift)。

如需有關更新堆疊的詳細資訊，請參閱[更新 CloudFormation 堆疊](updating.stacks.walkthrough.md)。

## 更新您的堆疊之前建立變更集
<a name="cfn-best-practices-changesets"></a>

變更集可讓您先查看提議的堆疊變更對執行中資源可能造成的影響，再實作這些變更。在您執行變更集之前，CloudFormation 不會對您的堆疊進行任何變更，這讓您可以決定是繼續進行提議的變更，還是建立其他變更集。

使用變更集可查看您的變更對執行中資源 (特別是重要資源) 造成的影響。例如，如果您變更 Amazon RDS 資料庫執行個體的名稱，CloudFormation 會建立新的資料庫並刪除舊的資料庫；除非您已進行備份，否則您將會遺失舊資料庫中的資料。如果您產生變更集，您會看到變更取代您的資料庫。這可協助您先規劃，再更新您的堆疊。如需詳細資訊，請參閱[透過變更集更新 CloudFormation 堆疊](using-cfn-updating-stacks-changesets.md)。

## 使用堆疊政策來保護資源
<a name="stackpolicy"></a>

堆疊政策可協助防止意外更新重要的堆疊資源，這可能會導致資源被中斷或甚至被取代。堆疊政策是一種 JSON 文件，描述可在指定資源上執行的更新動作。每當您建立具有重要資源的堆疊時，請指定堆疊政策。

在堆疊更新期間，您必須明確地指定要更新的受保護資源，否則不會對受保護的資源進行任何變更。如需詳細資訊，請參閱[避免更新堆疊資源](protect-stack-resources.md)。

## 使用 AWS CloudTrail 記錄 CloudFormation 呼叫
<a name="cloudtrail-logging"></a>

AWS CloudTrail 會追蹤在您的 中進行 CloudFormation API 呼叫的任何人 AWS 帳戶。每當有人使用 CloudFormation API、CloudFormation 主控台、後端主控台或 CloudFormation AWS CLI 命令時，都會記錄 API 呼叫。啟用記錄，然後指定 Amazon S3 儲存貯體來存放日誌。如此一來，如果您需要，即可稽核誰在您的帳戶中發出哪些 CloudFormation 呼叫。

如需詳細資訊，請參閱[使用 記錄 CloudFormation API 呼叫 AWS CloudTrail](cfn-api-logging-cloudtrail.md)。

## 使用程式碼檢閱和修訂控制管理您的範本
<a name="code"></a>

您的堆疊範本描述 AWS 資源的組態，例如其屬性值。若要檢閱變更並保留確切的資源歷史記錄，請使用程式碼檢閱和修訂控制。這些方法可協助您追蹤不同版本的範本之間的變更，如此有助於追蹤您堆疊資源的變更。此外，透過維護歷史記錄，您就可以隨時將堆疊還原至範本的特定版本。

## 定期更新 Amazon EC2 執行個體
<a name="update-ec2-linux"></a>

在所有 Amazon EC2 Windows 執行個體及使用 CloudFormation 建立的 Amazon EC2 Linux 執行個體上，定期執行 `yum update` 命令以更新 RPM 套件。這可確保您取得最新的修正程式和安全性更新。

## 定期使用偏離偵測
<a name="drift-detection"></a>

定期使用 CloudFormation 偏離偵測功能來識別已在 CloudFormation 管理之外修改的資源。偵測和解決偏離有助於維持基礎設施即程式碼方法的完整性，並確保您的範本可準確反映已部署資源的狀態。

請考慮將自動偏離偵測實作作為操作程序的一部分。您可以使用 Amazon EventBridge 規則觸發的 AWS Lambda 函數定期檢查偏離，並在偵測到差異時通知您的團隊。

如需有關偏離的詳細資訊，請參閱[使用偏離偵測來偵測堆疊和資源的未受管組態變更](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)。

## 設定自動復原的復原觸發條件
<a name="rollback-triggers"></a>

使用復原觸發來指定 CloudFormation 在堆疊建立和更新操作期間應監控的 Amazon CloudWatch 警示。如果任何指定的警示進入 `ALARM` 狀態，CloudFormation 會自動復原整個堆疊操作，協助確保基礎設施保持穩定狀態。

設定關鍵指標的復原觸發條件，例如應用程式錯誤率、系統資源使用率或指出應用程式和基礎設施運作狀態的自訂業務指標。

如需有關復原觸發條件的詳細資訊，請參閱[在警示違規時復原堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-rollback-triggers.html)。

## 實作有效的堆疊重構策略
<a name="stack-refactoring-bp"></a>

隨著基礎設施的發展，您可能需要重構 CloudFormation 堆疊，以提高可維護性、降低複雜性或適應不斷變化的需求。堆疊重構涉及重組您的範本和資源，同時保留其外部行為和功能。堆疊重構有助於透過下列方式與 CloudFormation 搭配使用：
+ *分割單體堆疊*：將大型、複雜的堆疊分解為更小、更易於管理的堆疊，依生命週期或擁有權組織
+ *合併相關資源*：將來自多個堆疊的相關資源合併為單一、有凝聚力的堆疊以簡化管理
+ *擷取可重複使用的元件*：將常見模式移入模組或巢狀堆疊，以提升重複使用和一致性
+ *改善資源組織*：重組堆疊中的資源，以更好地反映其關係和相依性

如需有關重構 CloudFormation 堆疊的詳細資訊，請參閱[堆疊重構](stack-refactoring.md)。

## 使用 CloudFormation Hooks 進行生命週期管理
<a name="cloudformation-hooks"></a>

CloudFormation Hooks 提供的程式碼，可在佈建之前主動檢查 AWS 資源的組態，並執行複雜的驗證檢查。Hooks 可檢查您的資源、堆疊和變更集是否符合組織的安全性、營運和成本最佳化需求。其會在資源佈建之前提供警告，或使操作失敗並完全停止，這視其設定方式而定。違規和警告會記錄在 Amazon CloudWatch 中，以提供不合規部署的可見性。

如需這些 Hooks 最佳實務的詳細資訊，請參閱 [AWS CloudFormation Hooks 概念](https://docs.aws.amazon.com/cloudformation-cli/latest/hooks-userguide/hooks-concepts.html)。

如需 Hooks 可以為您的 CloudFormation 資源做什麼的詳細資訊，請參閱[什麼是 AWS CloudFormation Hooks？](https://docs.aws.amazon.com/cloudformation-cli/latest/hooks-userguide/what-is-cloudformation-hooks.html)

## 使用 IaC 產生器從現有資源中建立範本
<a name="iac-generator"></a>

CloudFormation IaC （基礎設施即程式碼） 產生器可協助您從現有 AWS 資源建立 CloudFormation 範本。當您需要複寫現有基礎設施、記錄手動建立的資源或在 CloudFormation 管理下使用先前未受管的資源時，此功能特別有用。IaC 產生器適用於以下列方式建立 CloudFormation 範本：
+ *加速的範本建立*：從現有資源中產生範本，而不是從頭開始寫入範本
+ *一致的基礎設施*：使用產生的範本作為起點，確保新環境符合現有環境
+ *移轉至基礎設施即程式碼*：在 CloudFormation 管理下逐漸引入手動建立的資源
+ *文件*：以範本形式建立現有基礎設施的記錄

如需 IaC 產生器的詳細資訊，請參閱[使用 IaC 產生器從現有資源中產生範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC.html)。

## AWS Infrastructure Composer 用於視覺化範本設計
<a name="infrastructure-composer"></a>

AWS Infrastructure Composer 是一種視覺化設計工具，可協助您使用drag-and-drop界面建立、視覺化和修改 CloudFormation 範本。以下列方式使用 CloudFormation 時，它特別有用：
+ *架構規劃*：在實作之前設計和驗證基礎設施架構
+ *範本現代化*：視覺化現有範本以了解其結構，並發現改善機會
+ *訓練和加入*：協助新團隊成員透過視覺化學習了解 CloudFormation 概念 AWS 和服務關係
+ *利益相關者溝通*：使用清晰的視覺化呈現方式，向非技術利益相關者展示基礎設施設計
+ *合規審查*：使用視覺化圖表來提升基礎設施設計的安全性和合規審查
+ *合規審查*：使用視覺化圖表來提升基礎設施設計的安全性和合規審查

如需 Infrastructure Composer 的詳細資訊，請參閱[什麼是 AWS Infrastructure Composer？](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html)。

## 考慮將 AWS Cloud Development Kit (AWS CDK) 用於複雜的基礎設施
<a name="cdk-integration"></a>

如需複雜的基礎設施需求，請考慮使用 CDK，使用 TypeScript、Python、Java 和 .NET. AWS CDK generates CloudFormation 範本等熟悉的程式設計語言來定義您的雲端資源，讓您利用 CloudFormation 的完整功能，同時使用您慣用語言的抽象和程式設計建構。

 AWS CDK 提供高階建構，可封裝最佳實務並簡化常見基礎設施模式的定義。這可以大幅減少定義基礎設施所需的程式碼數量，同時確保遵守最佳實務。

如需 CDK 的詳細資訊，請參閱 [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/api/v2/)。

## 使用 IAM 控制存取
<a name="use-iam-permissions-to-control-access"></a>

IAM 是一項 AWS 服務，可用來管理 中的使用者及其許可 AWS。您可以使用 IAM 搭配 CloudFormation 來指定使用者可執行的 CloudFormation 動作，例如檢視堆疊範本、建立堆疊或刪除堆疊。此外，管理 CloudFormation 堆疊的任何人都需要這些堆疊中的資源許可。例如，如果使用者想要使用 CloudFormation 來啟動、更新或終止 Amazon EC2 執行個體，則必須具備呼叫相關 Amazon EC2 動作的許可。

在大多數情況下，使用者需要完整存取權，才能管理範本中的所有資源。CloudFormation 會呼叫來代替使用者建立、修改及刪除這些資源。若要區隔使用者與 CloudFormation 服務的許可，請使用服務角色。CloudFormation 使用服務角色的政策來呼叫，而不是使用者的政策。如需詳細資訊，請參閱[CloudFormation 服務角色](using-iam-servicerole.md)。

## 套用最低權限準則
<a name="least-privilege"></a>

為 CloudFormation 服務角色或範本建立的資源設定 IAM 角色時，請務必套用最低權限原則。僅授予預期功能所需的許可，並盡可能避免使用萬用字元許可。

使用 IAM Access Analyzer 來檢閱授予給 CloudFormation 服務角色的許可，並識別可以移除的未使用許可。定期檢閱和更新 IAM 政策，以確保其符合安全需求。

## 保護敏感參數
<a name="secure-parameters"></a>

如需密碼、API 金鑰和其他秘密等敏感資訊，請使用 AWS Systems Manager 參數存放區或 AWS Secrets Manager ，而不是直接內嵌在您的範本中。在範本中使用動態參考，以便在堆疊操作期間安全地擷取這些值。

在範本中使用參數時，請將敏感參數的 `NoEcho` 屬性設為 `true`，以防止其值顯示在主控台、API 回應或 CLI 輸出中。請注意，如果傳遞給可能記錄該值的其他服務或資源，則 `NoEcho` 不會阻止記錄該值。

如需搭配 CloudFormation 使用 AWS Systems Manager 參數存放區的詳細資訊[，請參閱從 AWS Systems Manager 參數存放區取得純文字值](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references-ssm.html)。

如需有關使用 `NoEcho` 屬性的詳細資訊，請參閱 [CloudFormation 範本參數語法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties)。

如需 AWS Secrets Manager 搭配 CloudFormation 使用 的詳細資訊，請參閱在 [中建立 AWS Secrets Manager 秘密 AWS CloudFormation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/cloudformation.html)。

## 使用 將政策實作為程式碼 AWS CloudFormation Guard
<a name="cfn-guard"></a>

AWS CloudFormation Guard (`cfn-guard`) 是一種開放原始碼policy-as-code工具，可讓您定義和強制執行 CloudFormation 範本的規則。使用 `cfn-guard` 來確保範本符合組織政策、安全最佳實務和控管要求。

將 `cfn-guard` 整合到您的 CI/CD 管道，以在部署之前根據您的政策規則來自動驗證範本。這有助於防止不合規資源部署到您的環境，並向開發人員提供有關政策違規的早期意見回饋。

如需 Guard 的詳細資訊，請參閱[什麼是 AWS CloudFormation Guard？](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html)