使用模組封裝和重複使用資源組態 - AWS CloudFormation

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

使用模組封裝和重複使用資源組態

模組可讓您以透明、易於管理且可重複的方式,來封裝可包含在堆疊範本之間的資源組態。模組可透過可自訂的模組化建置區塊形式,來封裝通用服務組態和最佳實務,以便您將其納入堆疊範本中。模組可讓您納入資源組態,這些資源組態會將最佳實務、專業領域知識和公認指導方針 (適用於安全性、合規性、控管和產業法規等領域) 納入範本,無須深入了解資源實作的複雜細節。

例如,聯網的領域專家可以建立模組,其中包含內建安全性群組和遵守安全性指導方針的輸入/輸出規則。然後,您可以將該模組納入範本中,以便在堆疊中佈建安全的聯網基礎設施,而不需花時間了解 VPC、子網路、安全性群組和閘道的運作方式。由於模組是由版本控制的,如果安全性指導方針會隨著時間而改變,則模組作者可以建立新版的模組,以納入那些變更。

在範本中使用模組的特性包括:

  • 可預測性:模組必須遵守它在 CloudFormation 登錄中註冊的結構描述,以便讓您了解在將模組包含在範本時,該模組可以解析哪些資源。

  • 可重複使用性:您可以跨多個範本和帳戶使用相同的模組。

  • 可追溯性: CloudFormation 保留從模組佈建堆疊中哪些資源的知識,讓您輕鬆瞭解資源變更的來源。

  • 可管理性:在您註冊模組後,就可以透過 CloudFormation 登錄管理模組,包括版本控制、帳戶和區域可用性。

模組可以包含:

  • 要透過模組佈建的一或多個資源,以及輸出或條件等任何相關資料。

  • 任何模組參數,可讓您在使用模組時指定自訂值。

如需有關開發模組類型的資訊,請參閱《指CloudFormation 令行介面使用指南》中的〈開發模組類型

在範本中使用模組

若要使用某個模組,請確保已在您想要使用的帳戶和區域中註冊該模組。如需詳細資訊,請參閱 公有和私有擴充功能。您可以將登錄中的模組註 CloudFormation 冊為私有擴充功能。然後,像您對個別資源一樣對待該模組:

  • 將其包含在範本的 資源 區段中。

  • 指定模組的任何必要屬性。

當您啟動堆疊作業時, CloudFormation 會產生已處理的範本,將任何包含的模組解析為適當的資源。使用變更集,以預覽要新增或更新的資源,然後再實際執行堆疊操作。如需詳細資訊,請參閱 透過變更集更新堆疊

請考量下面的範例:你擁有同時內含資源和模組的範本。該模板包含一個單獨的資源,ResourceA,以及一個模塊,。ModuleParent該模塊包含兩個資源,資源 BResourceC,以及一個嵌套模塊,. ModuleChild ModuleChild包含單一資源「資源」。如果您從此範本建立堆疊,則會 CloudFormation 處理範本並將模組解析為適當的資源。產生的堆疊有四個資源:ResourceAResourceBResourceCResourceD


    在堆疊作業期間,將堆疊範本中包含的兩個模組 CloudFormation 解析為適當的四個資源。

CloudFormation 跟踪堆棧中的哪些資源是從模塊創建的。您可以在指定堆疊的 Events (事件)、Resources (資源) 和 Drifts (漂移) 索引標籤上檢視此資訊,變更集預覽中也會包含此資訊。

模組與範本中的資源有所不同,因為它們遵循的是以下四段命名慣例,而不是資源使用的典型三段慣例:

organization::service::use-case::MODULE

使用參數來指定模組值

模組可以包含模組參數。就像範本參數一樣,模組參數使您可以從包含模組的範本 (或模組) 將自訂值輸入到模組。然後,此模組可以使用這些值,來設定其包含的資源屬性。

您還可以定義範本參數,進而設定模組屬性,以便使用者可以輸入在堆疊操作時傳遞給模組的值。如需定義範本參數的詳細資訊,請參閱參數

同樣地,如果模組包含的巢狀模組內含模組參數,則可以:

  • 直接在父模組中指定巢狀模組參數的值。

  • 在父模組中定義對應的模組參數,使包含父模組的範本 (或模組) 可設定巢狀模組的參數。

使用範本參數指定模組參數值

下列範例顯示如何定義將值傳遞給模組的範本參數。

在這裡,包含 My::S3::SampleBucket::MODULE 的範本會定義範本參數 BucketName,該參數可讓使用者在堆疊操作過程中指定 S3 儲存貯體名稱。

// Template containing My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } } } }

透過父模組在子模組中指定資源的屬性

下列範例說明如何在另一個模組中巢狀堆疊的模組中指定參數值。

第一個模組 My::S3::SampleBucketPrivate::MODULE 將是子模組。其定義了兩個參數:BucketNameAccessControl。為這些參數指定的值會用來指定此模組包含之 AWS::S3::Bucket 資源的 BucketNameAccessControl 屬性。以下是 My::S3::SampleBucketPrivate::MODULE 的範本片段。

// My::S3::SampleBucketPrivate::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket with Versioning and DeletionPolicy.", "Parameters": { "BucketName": { "Description": "Name for the bucket", "Type": "String" }, "AccessControl": { "Description": "AccessControl for the bucket", "Type": "String" } }, "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl": { "Ref": "AccessControl" }, "DeletionPolicy": "Retain", "VersioningConfiguration": { "Status": "Enabled" } } } } }

接下來,前一個模組會在父模組 My::S3::SampleBucket::MODULE 中巢狀堆疊。此父模組 My::S3::SampleBucket::MODULE 會以下列方式設定子模組參數:

  • 它會My::S3::SampleBucketPrivate::MODULE將的AccessControl參數設定為Private

  • 若是 BucketName,則會定義模組參數,此參數將允許在包含 My::S3::SampleBucket::MODULE 的範本 (或模組) 中指定儲存貯體名稱。

// My::S3::SampleBucket::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket. With Private AccessControl.", "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucketPrivate::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl" : "Private" } } } }

指定模組參數的限制條件

模塊參數不支持約束強制執行。如需詳細資訊,請參閱 屬性。若要對模組參數執行限制條件檢查,請建立具有所需限制條件的範本參數,然後在模組參數中參考該範本參數。

參考模組中的資源

您可以透過邏輯名稱來參考模組中的資源。您可以透過組合以下項目來建構在模組中包含之資源的完整邏輯名稱:

  • 在包含範本 (或包含模組) 中為模組指定的邏輯名稱。

  • 在模組中指定的資源邏輯名稱。

可以使用句號作為分隔符號來指定資源的完整邏輯名稱。例如,以下兩個邏輯名稱皆有效且功能等效:

  • ModuleLogicalName.ResourceLogicalName

  • ModuleLogicalNameResourceLogicalName

透過這種方式,您就可以使用 GetAttRef 內部函數,來存取模組資源的屬性值。

在下列範例中,此範本會參考模組中的屬性,以在範本本身的資源上設定對應的屬性。

假設該 My::S3::SampleBucket::MODULE 模組包含具有 S3Bucket 邏輯名稱的 AWS::S3::Bucket 資源。若要使用 Ref 內部函數參考此資源的儲存貯體名稱,請將範本中指定模組的邏輯名稱 MyBucket 與模組中資源的邏輯名稱 S3Bucket 結合起來,以取得此資源的完整邏輯名稱:MyBucket.S3BucketMyBucketS3Bucket

系統會在模組結構描述中指定模組中包含的資源邏輯名稱。您可以透過以下方法存取該結構描述:

  • 在 CloudFormation 註冊表中查找模塊。Schema (結構描述) 索引標籤會顯示模組結構描述。

  • 使用該DescribeType操作返回模塊詳細信息,其中包括模式。

// Template that uses My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "exampleQueue": { "Type": "AWS::SQS::Queue", "Properties": { "QueueName": { "Ref": "MyBucket.S3Bucket" } } } }, "Outputs": { "BucketArn": { "Value": { "Fn::GetAtt": [ "MyBucket", "S3Bucket.Arn" ] } } } }
Parameters: BucketName: Description: Name for your sample bucket Type: String Resources: MyBucket: Type: My::S3::SampleBucket::MODULE Properties: BucketName: !Ref BucketName exampleQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref MyBucket.S3Bucket Outputs: BucketArn: Value: !GetAtt MyBucket.S3Bucket.Arn

使用模組時的考量

  • 使用模組無需額外收費。您只需為那些模組在堆疊中解析的資源付費。

  • CloudFormation 配額 (例如堆疊中允許的資源數目上限或範本主體的大小上限) 會套用至已處理的範本,無論該範本中包含的資源是否來自模組。如需詳細資訊,請參閱 AWS CloudFormation 配額

  • 您在堆疊層級指定的標籤會指派給自模組衍生的個別資源。

  • 處理範本時,在模組層級指定的協助 CloudFormation 程式指令碼不會傳播到模組中包含的個別資源。

  • 模組中指定的輸出會傳播到範本層級的輸出。

    每個輸出將分配到一個邏輯 ID,此 ID 是模組邏輯名稱和在模組中定義之輸出名稱的串連。如需輸出的詳細資訊,請參閱輸出

  • 模組中指定的參數不會傳播到範本層級的參數。

    不過,您可以建立參考模組層級參數的範本層級參數。如需詳細資訊,請參閱 使用參數來指定模組值

模組註冊與版本控制

您可以使用註冊 CloudFormation 表註冊和管理您的帳戶和區域中的模塊。如需詳細資訊,請參閱 使用 AWS CloudFormation 登錄

您可以在指定的帳戶和區域註冊相同模組的多個版本。請謹記以下幾點考量:

  • 您必須在想要使用模組的帳戶和區域中註冊模組。

  • 在堆疊作業期間, CloudFormation 會使用目前在執行堆疊作業的帳戶和區域中註冊為預設版本的模組的任何版本。這包括在其他模組中巢狀堆疊的模組。

    因此,請注意,如果您在不同帳戶或區域中將相同模組的不同版本註冊為預設版本,則使用相同的範本可能會產生不同的結果。

    如需詳細資訊,請參閱 使用 AWS CLI 指定要使用的私有擴充功能版本

  • 在堆疊作業期間, CloudFormation 會在執行堆疊作業的帳戶和區域中,使用目前註冊為預設版本的資源的任何版本。其中包括內含模組所產生的資源。

  • 變更模組的預設版本不會起始任何堆疊更新操作。不過,下次您使用任何包含該模組的範本 (例如堆疊更新) 執行堆疊作業時, CloudFormation 將會在作業中使用新的預設版本。

    如下所述,唯一的例外是,使用指定的 use previous template (使用先前範本) 選項執行堆疊更新時。

  • 對於堆疊更新操作,如果您指定 use previous template (使用先前範本) 選項, CloudFormation 會使用先前處理的範本進行堆疊更新,而且不會針對您可能對其所做的任何變更重新處理模組。

  • 為了保證結果一致,如果您將模組包含在堆疊範本中以供堆疊集使用,則應確保在您計劃部署堆疊執行個體的所有帳戶和區域中,將相同的模組版本設定為預設版本。這包括在其他模組巢狀堆疊中的模組。如需堆疊集的詳細資訊,請參閱使用 AWS CloudFormation StackSets

如需註冊模組的新版本或變更模組預設版本的詳細資訊,請參閱使用 AWS CloudFormation 登錄

啟用公有模組以在帳戶中使用

若要成功啟用帳戶和區域中的公有模組,模組中包含的每個第三方公有擴充功能 (資源或模組) 必須符合下列條件:

  • 必須已在您的帳戶和區域中啟用擴充功能。

    如果模組中的擴充功能使用類型名稱別名,則必須使用相同類型名稱別名在帳戶和區域中註冊擴充功能。如需詳細資訊,請參閱 指定要用來稱呼擴充功能的別名

  • 目前已啟用擴充功能版本必須是模組中指定之該擴充功能的主要支援版本之一。如需詳細資訊,請參閱 CloudFormation CLI 使用者指南中的發行公用模組的模組需求

如果您沒有啟用正確的協力廠商公用擴充功能和擴充功能版本,作業 CloudFormation將會失敗,並顯示錯誤,列出需要啟動模組才能成功啟動的擴充功能和/或版本。