AWS CloudFormation 最佳做法 - AWS CloudFormation

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

AWS CloudFormation 最佳做法

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

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

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

幫助您實現快速失敗實踐的工具選擇包括 AWS CloudFormation Linter(cfn-lin t)和命令行工具。TaskCatcfn-lint 工具使您能夠根據資源規範驗證 CloudFormation 模板。AWS CloudFormation這包括檢查資源屬性的有效值,以及最佳實務。cfn-lint 的外掛程式適用於許多程式碼編輯器;這可讓問題在編輯器中一目了然,為您提供直接的 linter 回饋。您也可以選擇將 cfn-lint 整合到原始碼儲存庫的組態中,以便在提交成品時執行範本驗證。有關更多信息,請參閱使用 cfn-lint AWS CloudFormation 模板的 Git 預提交驗證。一旦您執行了初始連結並修正了 cfn-lint 可能發生的任何問題,就可以使用以程式設計方式在您選擇的區域中建立堆疊 TaskCat 來測試範本。 AWS TaskCat還會為您選擇的每個區域產生一個包含合格/失敗等級的報告。

如需如何使用這兩種工具縮短回饋迴圈的實作逐步解說,請參閱工AWS CloudFormation 作坊Linting and Test 實驗室。 step-by-step

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

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

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

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

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

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

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

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

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

驗證所有資源類型的配額

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

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

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

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

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

這些建置區塊可用於單一資源,例如定義 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的最佳實務;也可以用於多個資源,以定義應用程式架構的常見模式。這些構建塊可以嵌套到其他模塊中,因此您可以將最佳實踐堆疊到更高級別的構建塊中。 CloudFormation 模塊在CloudFormation 註冊表中可用,因此您可以像本地資源一樣使用它們。當您使用 CloudFormation 模塊時,模塊模板將擴展到消費模板中,這使您可以使用 RefFn:: 訪問模塊內的資源GetAtt。如需詳細資訊,請參閱模組

使用 AWS特定參數類型

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

使用參數限制條件

使用約束,您可以描述允許的輸入值,以便在創建堆棧之前 CloudFormation 捕獲任何無效的值。您可以設定限制條件,例如長度下限、長度上限和允許的模式。例如,您可以對資料庫使用者名稱值設定限制條件,讓其長度至少為八個字元並只包含英數字元。如需詳細資訊,請參閱 參數

使用虛擬參數提升可攜性

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

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

對於另一個例子,假設您想演練:參考在另一個 AWS CloudFormation 堆疊中的資源輸出要使用引用另一個 CloudFormation 堆棧中的資源輸出。在此範例中,假設您已為 VPC 建立子網路,然後匯出其 ID,以便與相同帳戶和區域中的其他堆疊搭配使用。在另一個堆疊中,您可以在描述 Amazon EC2 執行個體時,參考子網路 ID 的匯出值。

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

如需使用 Export 輸出欄位和 Fn::ImportValue 內部函數的詳細範例,請參閱 演練:參考在另一個 AWS CloudFormation 堆疊中的資源輸出

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

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

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

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

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

yum install -y aws-cfn-bootstrap

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

驗證後再使用範本

使用範本建立或更新堆疊之前,您可以使用 CloudFormation 來驗證它。驗證樣板可以幫助您在 CloudFormation 創建任何資源之前 catch 語法和一些語義錯誤,例如循環依賴關係。如果您使用 CloudFormation 主控台,主控台會在您指定輸入參數之後自動驗證範本。對於 AWS CLI 或 CloudFormation API,請使用命aws cloudformation validate-template令或 ValidateTemplateAPI 作業。

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

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

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

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

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

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

通過管理所有堆棧資源 AWS CloudFormation

啟動堆疊後,請使用 CloudFormation 主控台APIAWS CLI 更新堆疊中的資源。不要對堆疊資源進行變更 CloudFormation。這樣做可能會在您堆疊的範本與您堆疊資源的目前狀態之間產生不相符的情況,如果您更新或刪除堆疊,這可能會造成錯誤。如需詳細資訊,請參閱 演練:更新堆疊

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

變更集可讓您在實作之前,查看對堆疊提議的變更可能會對執行中的資源造成什麼影響。 CloudFormation 在您執行變更集之前,不會對堆疊進行任何變更,讓您決定要繼續進行提議的變更或建立另一個變更集。

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

使用堆疊政策

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

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

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

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

定期更新 Amazon EC2 執行個體

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