CloudFormation 巨集概觀 - AWS CloudFormation

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

CloudFormation 巨集概觀

使用巨集處理範本有兩個主要步驟:建立巨集本身,然後使用巨集在您的範本上執行處理。

若要建立巨集定義,您必須建立下列項目:

  • 執行範本處理的 Lambda 函數。此 Lambda 函數接受程式碼片段或整個範本,以及您定義的任何其他參數。它會傳回已處理的範本程式碼片段或整個範本作為回應。

  • 類型的資源 AWS::CloudFormation::Macro,這可讓使用者從 CloudFormation 範本中呼叫 Lambda 函數。此資源會指定要叫用此巨集ARN的 Lambda 函數的 ,以及協助偵錯的其他選用屬性。若要在帳戶中建立此資源,請撰寫包含AWS::CloudFormation::Macro資源的範本,然後建立具有自管許可的堆疊或堆疊集。 AWS CloudFormation StackSets 目前不支援使用參考巨集的範本建立或更新具有服務受管許可的堆疊集。

若要使用巨集,請在範本中參考巨集:

  • 若要處理範本的區段或部分,請參照 Fn::Transform函數中的巨集,該函數位於您要轉換的範本內容。當您使用 Fn::Transform 時,您也可以傳遞它需要的任何指定參數。

  • 若要處理整個範本,請在範本的 Transform 區段中參考巨集。

接著,您通常會建立變更集,然後加以執行。(處理巨集可能會新增您不了解的多項資源。為了確保您知道巨集所產生的所有變更,我們強烈建議您使用變更集。) CloudFormation 會將指定的範本內容以及任何額外的指定參數,傳遞到巨集資源中指定的 Lambda 函數。Lambda 函數會傳回已處理的範本內容,不論是程式碼片段或整個範本。

在呼叫範本中的所有巨集之後, CloudFormation 會產生包含已處理範本內容的變更集。檢閱變更集之後,請執行它來套用變更。

使用Fn::Transform內部函數或範本的 Transform區段,將範本內容和相關聯的參數傳遞至巨集的基礎 Lambda 函數,這會傳回已處理的範本內容。

如何直接建立堆疊

若要使用參考巨集的範本來建立或更新堆疊,您通常會建立變更集,然後執行它。變更集說明 CloudFormation 將根據處理過的範本所採取的動作。處理巨集可能會新增您不了解的多個資源。為了確保您知道巨集所產生的所有變更,我們強烈建議您使用變更集。檢閱變更集之後,您可以執行它來確實套用變更。

巨集可以將 IAM 資源新增至您的範本。針對這些資源, CloudFormation 會要求您確認其功能。由於 CloudFormation 無法在處理範本之前知道要新增哪些資源,因此您可能需要在建立變更集時確認IAM功能,取決於參考的巨集是否包含IAM資源。如此一來,當您執行變更集時, CloudFormation 具有建立IAM資源的必要功能。

若要直接從已處理的範本建立或更新堆疊,而不先檢閱變更集中提議的變更,請在 CreateStackUpdateStack請求期間指定 CAPABILITY_AUTO_EXPAND功能。如果您知道巨集執行哪些處理,您應只直接透過包含巨集的堆疊範本來建立堆疊。您不能將變更集與堆疊集巨集一起使用;您必須直接更新堆疊集。

如需詳細資訊,請參閱 CreateStackUpdateStack AWS CloudFormation API參考中的 。

重要

如果您的堆疊集範本參考了一或多個巨集,您必須直接從處理的範本建立堆疊集,而不必先檢視變更集中產生的變更。處理巨集可能會新增您不了解的多個資源。從直接參考巨集的範本建立或更新堆疊集之前,請確定您知道巨集會執行哪些處理操作。

若要減少從參考巨集的範本啟動堆疊的步驟數目,您可以使用 packagedeploy AWS CLI 命令。如需詳細資訊,請參閱 使用 將本機成品上傳至 S3 儲存貯體 AWS CLI建立包含轉換的堆疊

考量事項

使用巨集時,請記住下列備註和限制:

  • 只有在 Lambda 可用 AWS 區域 的情況下,才支援巨集。如需可使用 Lambda 的區域清單,請參閱 AWS Lambda 端點與配額

  • 任何處理的範本程式碼片段都必須是有效的 JSON。

  • 任何處理的範本程式碼片段都必須通過建立堆疊、更新堆疊、建立堆疊集或更新堆疊集操作的驗證檢查。

  • CloudFormation 會先解析巨集,然後處理範本。產生的範本必須是有效的JSON,且不得超過範本大小限制。

  • 由於 CloudFormation 處理範本中元素的順序,巨集無法在傳回的已處理範本內容中包含模組 CloudFormation。如需詳細資訊,請參閱巨集評估順序

  • 使用更新復原功能時, CloudFormation 會使用原始範本的副本。即使加入的程式碼片段有所變更,它也會復原至原始範本。

  • 將巨集包含在巨集中無法運作,因為我們不以遞迴方式處理巨集。

  • 巨集內目前不支援 Fn::ImportValue 內部函數。

  • 範本包含的內部函數是在任何巨集之後評估。因此,巨集傳回的已處理範本內容可能包含內部函數的呼叫,一樣照常評估。

  • StackSets 目前不支援使用參考 CloudFormation巨集之範本的服務受管許可來建立或更新堆疊集。

巨集帳戶範圍和許可

巨集只能在它們已建立為資源的帳戶中使用。巨集的名稱在給定帳戶內必須是唯一的。不過,您可以在基礎 Lambda 函數上啟用跨帳戶存取,然後建立巨集定義在多個帳戶中參考該函數,就能讓多個帳戶使用相同的功能。在下列範例中,三個帳戶包含巨集定義,各指向相同的 Lambda 函數。

允許 Lambda 函數上的跨帳戶存取, AWS 可讓您在參考該函數的多個帳戶中建立巨集。

為了建立巨集定義,使用者必須有許可,才能在指定的帳戶內建立堆疊或堆疊集。

若要 CloudFormation 讓 成功執行範本中包含的巨集,使用者必須具有基礎 Lambda 函數的Invoke許可。為了防止權限可能升級, 會在執行巨集時 CloudFormation 模擬使用者。

如需詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的在 中管理許可 AWS Lambda,以及《 服務授權參考》中的 的動作、資源和條件索引鍵 AWS Lambda