您可以在其他模組或模板中使用模組。本文為您介紹如何使用模組及其相關注意事項。
前提條件
如果是Resource Orchestration Service支援的公用模組,您可以直接使用。更多資訊,請參見查看公用模組。
使用模組
您需要將模組當作單個資源進行處理。
將其納入到模板(或模組)的
Resources
部分中。為模組指定版本。
為模組指定任何必要的屬性。
為模組指定版本
通過Version
欄位為模組指定版本,Version
取值如下:
指定版本:格式為
v
+數字,例如v1
、v10
。使用公用模組時,建議使用此方式。
default
:預設版本。只要模組未刪除,模組始終存在一個可用的預設版本。
您可以通過API或控制台自行設定自訂模組的預設版本。
使用自訂模組時,建議使用此方式。
latest
:最新版本。只要模組未刪除,模組始終存在一個可用的最新版本。
當模組建立新版本或刪除最新版本時,最新版本會發生變化。
開發調試模組時,建議使用此方式。
為模組指定屬性
模組參數可以協助您將自訂值從模板(或模組)輸入到模組中,模組可以使用自訂值來設定資源(或子模組)的屬性。如果模組參數未指定,且該參數有預設值(Default
),則會使用預設值。
使用模板參數指定模組屬性
您可以定義模板參數,用模板參數來設定模組屬性,以便可以將輸入的值傳遞給模組。定義模板參數的更多資訊,請參見參數。
您可以將模板中的自訂值傳遞給模組參數。包含MODULE::My::VPC::SampleVpc
的模板定義了模板參數VpcName
,您可以通過模板參數指定模組中的VPC名稱。
ROSTemplateFormatVersion: '2015-09-01'
Parameters:
VpcName:
Description: Name for your sample vpc
Type: String
Resources:
MyVpc:
Type: MODULE::My::VPC::SampleVpc
Version: default
Properties:
VpcName:
Ref: VpcName
在父模組中指定子模組的屬性
如果模組和嵌套模組中包含相同的參數,以下樣本為您展示如何為嵌套的子模組指定參數值。
您可以在父模組中為嵌套模組的參數指定值。MODULE::My::VPC::SampleVpcPrivate
模組為子模組,該模組定義了兩個參數:VpcName
和CidrBlock
。這些參數用於設定ALIYUN::ECS::VPC
資源的VpcName
和CidrBlock
屬性。子模組的程式碼範例如下所示。
ROSTemplateFormatVersion: '2015-09-01'
Description: A sample vpc.
Parameters:
VpcName:
Description: Name for the vpc
Type: String
CidrBlock:
Description: Cidr block for the vpc
Type: String
Resources:
Vpc:
Type: ALIYUN::ECS::VPC
Properties:
VpcName:
Ref: VpcName
CidrBlock:
Ref: CidrBlock
將子模組MODULE::My::VPC::SampleVpcPrivate
嵌套在父模組MODULE::My::VPC::SampleVpc
中,父模組MODULE::My::VPC::SampleVpc
通過以下方式設定子模組參數。父模組的程式碼範例如下所示。
它將
MODULE::My::VPC::SampleVpcPrivate
的CidrBlock
參數設定為192.168.0.0/16
。對於
VpcName
參數,則定義了一個模組參數,該參數使得包含MODULE::My::VPC::SampleVpc
的模板(或模組)能夠指定VPC名稱。
ROSTemplateFormatVersion: '2015-09-01'
Description: A sample vpc.
Parameters:
VpcName:
Description: Name for the vpc
Type: String
Resources:
MyVpc:
Type: MODULE::My::VPC::SampleVpcPrivate
Version: default
Properties:
VpcName:
Ref: VpcName
CidrBlock: 192.168.0.0/16
為模組參數指定約束
模組參數不支援約束強制執行。要對模組參數執行約束檢查,請建立具有所需約束的模板參數,然後在模組參數中引用該模板參數。
為模組指定條件
與資源指定條件的方式相同。模組的條件會傳遞給所有資源和子模組。定義條件的更多資訊,請參見條件(Conditions)。
為模組指定依賴
與資源指定依賴的方式相同。模組的依賴會傳遞給所有資源和子模組。定義依賴的更多資訊,請參見DependsOn。
為模組指定刪除策略
與資源指定刪除策略的方式相同。模組的刪除策略會傳遞給所有未指定刪除策略的資源和子模組。定義刪除策略的更多資訊,請參見DeletionPolicy。
引用模組
引用模組中的資源
模組中的資源可以通過完全限定邏輯名稱進行引用,模組中的資源完全限定邏輯名稱可以通過將以下名稱相結合來構成。
在模板(或模組)中為模組指定的邏輯名稱。
模組中指定的資源的邏輯名稱。
您可以使用半形句號(.)作為分隔字元來指定資源的完全限定邏輯名稱。例如:ModuleLogicalName.ResourceLogicalName
和ParentModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
。
通過這種方式,您可以使用Fn::GetAtt
、Ref
、Fn::Sub
內建函式來訪問模組資源(Resources)或其屬性值。更多資訊,請參見資源(Resources)。
// Fn::GetAtt樣本
GetAtt Example1:
Fn::GetAtt:
- ModuleLogicalName.ResourceLogicalName
- AttributeName
GetAtt Example2:
Fn::GetAtt:
- ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
- AttributeName
// Ref樣本
Ref Example1:
Ref: ModuleLogicalName.ResourceLogicalName
Ref Example2:
Ref: ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
// Fn::Sub樣本
Sub Example1:
Fn::Sub: "${ModuleLogicalName.ResourceLogicalName}"
Sub Example2:
Fn::Sub: "${ModuleLogicalName.ResourceLogicalName.AttributeName}"
Sub Example3:
Fn::Sub: "${ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName}"
Sub Example4:
Fn::Sub: "${ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName.AttributeName}"
在以下樣本中:
模板引用模組中的資源為模板本身的資源設定相應屬性。
模板引用模組中資源的輸出作為模板本身的輸出。
假設MODULE::My::VPC::SampleVpc
模組包含邏輯名稱為Vpc
的資源ALIYUN::ECS::VPC
。要使用Ref
內建函式引用此資源的ID或Fn::GetAtt
內建函式引用此資源的輸出屬性,需要將模板中模組的邏輯名稱MyVpc
與模組中資源的邏輯名稱Vpc
相結合,從而獲得資源的完全限定邏輯名稱:MyVpc.Vpc
。
Parameters:
VpcName:
Description: Name for your sample vpc
Type: String
Resources:
MyVpc:
Type: MODULE::My::VPC::SampleVpc
Version: default
Properties:
VpcName:
Ref: VpcName
MyVsw:
Type: ALIYUN::ECS::VSwitch
Properties:
VpcId:
Ref: MyVpc.Vpc
CidrBlock: 192.168.1.0/24
ZoneId:
Fn::Select:
- '0'
- Fn::GetAZs:
Ref: ALIYUN::Region
VSwitchName: sample_vsw
Outputs:
VpcId:
Value:
Fn::GetAtt:
- MyVpc.Vpc
- VpcId
引用模組中的輸出
您可以把模組當作資源,其輸出當作資源屬性,使用Fn::GetAtt
、Fn::Sub
內建函式訪問模組輸出。更多資訊,請參見輸出(Outputs)。
// Fn::GetAtt樣本
GetAtt Example1:
Fn::GetAtt:
- ModuleLogicalName
- OutputName
GetAtt Example2:
Fn::GetAtt:
- ModuleLogicalName.ChildModuleLogicalName
- OutputName
// Fn::Sub樣本
Sub Example1:
Fn::Sub: "${ModuleLogicalName.OutputName}"
Sub Example2:
Fn::Sub: "${ModuleLogicalName.ChildModuleLogicalName.OutputName}"
引用模組中的條件
您可以把模組當作命名空間,從而得到完全限定名稱,使用Fn::If
、Fn::Or
、Fn::And
、Fn::Not
內建函式來訪問模組中的條件。更多資訊,請參見條件(Conditions)。
// Fn::If樣本
If Example1:
Fn::If:
- ModuleLogicalName.ConditionName
- Value for true
- Value for false
If Example2:
Fn::If:
- ModuleLogicalName.ChildModuleLogicalName.ConditionName
- Value for true
- Value for false
// Fn::Or樣本
Or Example:
Fn::Or:
- ModuleLogicalName.ConditionName
- ModuleLogicalName.ChildModuleLogicalName.ConditionName
// Fn::And樣本
And Example:
Fn::And:
- ModuleLogicalName.ConditionName
- ModuleLogicalName.ChildModuleLogicalName.ConditionName
// Fn::Not樣本
Not Example1:
Fn::Not: ModuleLogicalName.ConditionName
Not Example2:
Fn::Not: ModuleLogicalName.ChildModuleLogicalName.ConditionName
引用模組中的映射
您可以把模組當作命名空間,從而得到完全限定名稱,使用Fn::FindInMap
內建函式來訪問模組中的映射。更多資訊,請參見映射(Mappings)。
// Fn::FindInMap樣本
FindInMap Example1:
Fn::FindInMap:
- ModuleLogicalName.MappingName
- Key
- SubKey
FindInMap Example2:
Fn::FindInMap:
- ModuleLogicalName.ChildModuleLogicalName.MappingName
- Key
- SubKey
相依模組中的資源
您需要使用資源的完全限定邏輯名稱實現相依模組中的資源。
Resource1:
DependsOn: ModuleLogicalName.ResourceLogicalName
Resource2:
DependsOn: ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
相依模組
資源(或模組)如果依賴於模組,則依賴於模組及其子模組中的所有資源。您需要使用模組的完全限定邏輯名稱實現相依模組。
Resource1:
DependsOn: ModuleLogicalName
Resource2:
DependsOn: ModuleLogicalName.ChildModuleLogicalName
注意事項
下列是使用模組的相關注意事項。
使用模組不收取任何額外費用,您只需為模組解析到資源棧中的資源付費。
如果模板使用了模組,模板會增加如下限制:
參數名稱中不能包含字元:
.:
。資源邏輯名稱中不能包含字元:
.
。輸出名稱中不能包含字元:
.
。條件名稱中不能包含字元:
&
。不能為模板指定
Transform
和Workspace
。不能為模組指定
Metadata
和Count
。資源或模組的完全限定邏輯名稱、條件完全限定名稱和映射完全限定名稱都不能重複。
ROS配額(例如資源棧中允許的最大資源數或模板本文的最多內容)適用於處理過的模板,無論該模板中包含的資源是否來自模組。更多資訊,請參見使用限制。
您在資源棧層級指定的標籤、資源群組將分配給來自模組的各個資源。
處理模板時,模組中的
Metadata
、Rules
會被忽略。處理模組時,不會解析動態引用,而是在資源棧操作期間建立或更新單個資源時解析動態引用。關於動態引用的更多資訊,請參見動態引用。
模組的輸出不會傳播變成模板的輸出。您可以建立模板輸出並引用模組輸出。更多資訊,請參見引用模組中的輸出。
模組的參數不會傳播變成模板的參數。您可以建立模板參數,然後在模組參數中引用該模板參數。更多資訊,請參見使用模板參數指定模組屬性。
如果使用模組時指定版本為預設版本(
default
),更改模組的預設版本不會啟動任何資源棧更新操作。但是,在您下次使用包含該模組的任何模板執行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的預設版本。
如果使用模組時指定版本為最新版本(
latest
),建立新的模組版本或刪除最新模組版本不會啟動任何資源棧更新操作。但是,在您下次使用包含該模組的任何模板執行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的最新版本。
在資源棧操作期間,ROS會使用當前賬戶中註冊的模組,包括嵌套在其他模組中的模組。
如果您在不同帳號的同一個模組的版本不一致,則使用同一個模板可能會導致不同的結果。
為了保證結果統一,如果要在資源棧模板中納入模組以用於資源棧組,則應確保在計劃部署資源棧執行個體的所有賬戶中模組的一致性,其中包括嵌套在其他模組中的模組。更多資訊,請參見資源棧組。
說明如果您想要在資源棧組所在帳號中展開模組,需要在建立或更新資源棧組時勾選是否在當前帳號展開模組。