AWS CloudFormation 最佳實務 - AWS CloudFormation

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

AWS CloudFormation 最佳實務

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

縮短回饋迴圈以提高交付速度

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

協助您實現快速失敗實務的工具選項包括 AWS CloudFormation Lintercfn-lint) 和TaskCat命令列工具。此cfn-lint工具可讓您根據AWS CloudFormation 資源規格 來驗證 CloudFormation 範本。這包括檢查資源屬性的有效值,以及最佳實務。的外掛程式cfn-lint適用於許多程式碼編輯器;這可讓您視覺化編輯器內的問題,並取得直接的內容回饋。您也可以選擇cfn-lint整合原始程式碼儲存庫的組態,以便在提交貢獻時執行範本驗證。如需詳細資訊,請參閱使用 對 AWS CloudFormation 範本進行 Git 預先承諾驗證cfn-lint。執行初始固定並修正cfn-lint可能引發的任何問題後,您可以使用 ,透過程式設計方式在 AWS 區域 您選擇的堆疊中建立堆疊 TaskCat 來測試範本。 TaskCat 也會針對您選擇的每個區域產生具有通過/失敗評等的報告。

對於 step-by-step,實作演練如何使用這兩個工具來縮短意見回饋循環,請遵循研討會的翻譯和測試實驗室AWS CloudFormation

依生命週期和所有權組織您的堆疊

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

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

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

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

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

使用跨堆疊參考匯出共享資源

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

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

驗證所有資源類型的配額

啟動堆疊之前,請確定您可以建立所需的所有資源,而不會達到 AWS 帳戶限制。如果您達到限制,在您增加配額或刪除額外資源之前 CloudFormation ,不會成功建立堆疊。每項服務可能會有各種限制,需要您在啟動堆疊前注意。例如,根據預設,您每個 區域只能啟動 2000 個 CloudFormation 堆疊 AWS 帳戶。如需有關限制及如何提高預設限制的詳細資訊,請參閱 AWS 一般參考 中的 AWS 服務配額

重複使用範本在多個環境中複製堆疊

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

使用模組以重複使用資源組態

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

這些建置區塊可以用於單一資源,例如定義 Amazon Elastic Compute Cloud (AmazonEC2) 執行個體的最佳實務,也可以用於多個資源,以定義應用程式架構的常見模式。這些建置區塊可以巢狀到其他模組中,因此您可以將最佳實務堆疊到更高層級的建置區塊。 CloudFormation CloudFormation 登錄檔 中提供了模組,因此您可以像原生資源一樣使用它們。使用 CloudFormation 模組時,模組範本會擴展為耗用範本,可讓您使用 RefFn::GetAtt 存取模組內的資源。如需詳細資訊,請參閱建立可重複使用的資源組態,這些組態可以包含在具有 CloudFormation 模組的範本之間

使用 AWS特定的參數類型

如果您的範本需要輸入現有的 AWS特定值,例如現有的 Amazon Virtual Private Cloud IDs或 Amazon EC2金鑰對名稱,請使用 AWS特定參數類型。例如,您可以將 參數指定為類型 AWS::EC2::KeyPair::KeyName,該參數會取得您 和您建立堆疊 AWS 帳戶 之區域中現有的金鑰對名稱。 AWS CloudFormation 可以在建立堆疊之前快速驗證 AWS特定參數類型的值。此外,如果您使用 CloudFormation 主控台, CloudFormation 會顯示有效值的下拉式清單,因此您不需要查詢或記住正確的 VPC IDs 或金鑰對名稱。如需詳細資訊,請參閱使用 CloudFormation提供的參數類型參考現有的資源和 Systems Manager 參數

使用參數限制條件

透過限制,您可以描述允許的輸入值,以便在建立堆疊之前 CloudFormation 擷取任何無效的值。您可以設定限制條件,例如長度下限、長度上限和允許的模式。例如,您可以對資料庫使用者名稱值設定限制條件,讓其長度至少為八個字元並只包含英數字元。如需詳細資訊,請參閱Parameters CloudFormation 範本的 區段語法參考

使用虛擬參數提升可攜性

您可以在範本中使用虛擬參數作為內部函數的引數,例如 RefFn::Sub。虛擬參數是由 預先定義的參數 CloudFormation。請勿在範本中宣告這些參數。在內部函數中使用虛擬參數可增加堆疊範本在區域和帳戶之間的可攜性。

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

對於另一個範例,假設您想要在多個堆疊之間共用資源或組態。在此範例中,假設您已為 建立子網路VPC,然後匯出其 ID 以搭配相同 AWS 帳戶 和 區域中的其他堆疊使用。在另一個堆疊中,您會在描述 Amazon EC2執行個體時參考子網路 ID 的匯出值。如需使用 Export 輸出欄位和 Fn::ImportValue 內部函數的詳細範例,請參閱 參考另一個 CloudFormation堆棧中的資源輸出

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

AWS::CloudFormation::Init 使用 在 Amazon EC2執行個體上部署軟體應用程式

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

在您的範本中,透過 AWS::CloudFormation::Init 資源指定安裝和組態狀態。如需示範如何使用 cfn-init和 的逐步解說AWS::CloudFormation::Init,請參閱 在 Amazon 上部署應用程式 EC2

使用最新的協助程式指令碼

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

yum install -y aws-cfn-bootstrap

如需取得最新協助程式指令碼的詳細資訊,請參閱CloudFormation 協助程式指令碼參考

驗證後再使用範本

使用範本建立或更新堆疊之前,您可以使用 CloudFormation 來驗證堆疊。驗證範本可協助您在 CloudFormation 建立任何資源之前擷取語法和一些語意錯誤,例如循環相依性。如果您使用 CloudFormation 主控台,主控台會在您指定輸入參數後自動驗證範本。對於 AWS CLI 或 CloudFormation API,請使用 validate-template CLI 命令或 ValidateTemplate API 操作。

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

驗證範本是否符合組織政策規範

您也可以驗證範本是否符合組織政策準則。 AWS CloudFormation Guard (cfn-guard) 是開放原始碼命令列介面 (CLI) 工具,提供語言 policy-as-code來定義規則,可檢查必要和禁止的資源組態。然後,它可讓您根據這些規則驗證您的範本。例如,管理員可建立規則以確保使用者一律建立加密的 Amazon S3 儲存貯體。

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

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

如需詳細資訊,請參閱 上的 cfn-guard 儲存庫 GitHub。

透過 管理所有堆疊資源 AWS CloudFormation

啟動堆疊後,請使用 CloudFormation 主控台 APIAWS CLI來更新堆疊中的資源。請勿變更 以外的堆疊資源 CloudFormation。這樣做可能會在您堆疊的範本與您堆疊資源的目前狀態之間產生不相符的情況,如果您更新或刪除堆疊,這可能會造成錯誤。這稱為偏離。如果對 CloudFormation 範本外部的資源進行變更,且您更新堆疊,則將捨棄對資源直接所做的變更,且資源組態將還原為範本中的組態。

如需漂移的詳細資訊,請參閱 什麼是偏離?

如需更新堆疊的詳細資訊,請參閱 演練:更新堆疊

更新您的堆疊之前建立變更集

變更集可讓您在實作堆疊之前,查看建議的堆疊變更如何影響正在執行的資源。在執行變更集之前, CloudFormation 請勿對堆疊進行任何變更,讓您決定是否繼續進行建議的變更,或建立另一個變更集。

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

使用堆疊政策

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

在堆疊更新期間,您必須明確地指定要更新的受保護資源,否則不會對受保護的資源進行任何變更。如需詳細資訊,請參閱避免更新堆疊資源

使用程式碼檢閱和修訂控制管理您的範本

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

定期更新您的 Amazon EC2執行個體

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