使用模塊
您可以在其他模塊或模板中使用模塊。本文為您介紹如何使用模塊及其相關(guān)注意事項。
前提條件
如果您想使用自定義模塊,請先確保該模塊已經(jīng)在相關(guān)賬號中注冊。具體操作,請參見創(chuàng)建自定義模塊和查看自定義模塊。
如果是資源編排支持的公共模塊,您可以直接使用。更多信息,請參見查看公共模塊。
使用模塊
您需要將模塊當(dāng)作單個資源進行處理。
將其納入到模板(或模塊)的
Resources
部分中。為模塊指定版本。
為模塊指定任何必要的屬性。
為模塊指定版本
通過Version
字段為模塊指定版本,Version
取值如下:
指定版本:格式為
v
+數(shù)字,例如v1
、v10
。使用公共模塊時,建議使用此方式。
default
:默認(rèn)版本。只要模塊未刪除,模塊始終存在一個可用的默認(rèn)版本。
您可以通過API或控制臺自行設(shè)置自定義模塊的默認(rèn)版本。更多信息,請參見SetResourceType - 修改資源類型和修改模塊默認(rèn)版本。
使用自定義模塊時,建議使用此方式。
latest
:最新版本。只要模塊未刪除,模塊始終存在一個可用的最新版本。
當(dāng)模塊創(chuàng)建新版本或刪除最新版本時,最新版本會發(fā)生變化。
開發(fā)調(diào)試模塊時,建議使用此方式。
為模塊指定屬性
模塊參數(shù)可以幫助您將自定義值從模板(或模塊)輸入到模塊中,模塊可以使用自定義值來設(shè)置資源(或子模塊)的屬性。如果模塊參數(shù)未指定,且該參數(shù)有默認(rèn)值(Default
),則會使用默認(rèn)值。
使用模板參數(shù)指定模塊屬性
您可以定義模板參數(shù),用模板參數(shù)來設(shè)置模塊屬性,以便可以將輸入的值傳遞給模塊。定義模板參數(shù)的更多信息,請參見參數(shù)。
您可以將模板中的自定義值傳遞給模塊參數(shù)。包含MODULE::My::VPC::SampleVpc
的模板定義了模板參數(shù)VpcName
,您可以通過模板參數(shù)指定模塊中的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
在父模塊中指定子模塊的屬性
如果模塊和嵌套模塊中包含相同的參數(shù),以下示例為您展示如何為嵌套的子模塊指定參數(shù)值。
您可以在父模塊中為嵌套模塊的參數(shù)指定值。MODULE::My::VPC::SampleVpcPrivate
模塊為子模塊,該模塊定義了兩個參數(shù):VpcName
和CidrBlock
。這些參數(shù)用于設(shè)置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
通過以下方式設(shè)置子模塊參數(shù)。父模塊的代碼示例如下所示。
它將
MODULE::My::VPC::SampleVpcPrivate
的CidrBlock
參數(shù)設(shè)置為192.168.0.0/16
。對于
VpcName
參數(shù),則定義了一個模塊參數(shù),該參數(shù)使得包含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
為模塊參數(shù)指定約束
模塊參數(shù)不支持約束強制執(zhí)行。要對模塊參數(shù)執(zhí)行約束檢查,請創(chuàng)建具有所需約束的模板參數(shù),然后在模塊參數(shù)中引用該模板參數(shù)。
為模塊指定條件
與資源指定條件的方式相同。模塊的條件會傳遞給所有資源和子模塊。定義條件的更多信息,請參見條件(Conditions)。
為模塊指定依賴
與資源指定依賴的方式相同。模塊的依賴會傳遞給所有資源和子模塊。定義依賴的更多信息,請參見DependsOn。
為模塊指定刪除策略
與資源指定刪除策略的方式相同。模塊的刪除策略會傳遞給所有未指定刪除策略的資源和子模塊。定義刪除策略的更多信息,請參見DeletionPolicy。
引用模塊
引用模塊中的資源
模塊中的資源可以通過完全限定邏輯名稱進行引用,模塊中的資源完全限定邏輯名稱可以通過將以下名稱相結(jié)合來構(gòu)成。
在模板(或模塊)中為模塊指定的邏輯名稱。
模塊中指定的資源的邏輯名稱。
您可以使用半角句號(.)作為分隔符來指定資源的完全限定邏輯名稱。例如:ModuleLogicalName.ResourceLogicalName
和ParentModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
。
通過這種方式,您可以使用Fn::GetAtt
、Ref
、Fn::Sub
內(nèi)部函數(shù)來訪問模塊資源(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}"
在以下示例中:
模板引用模塊中的資源為模板本身的資源設(shè)置相應(yīng)屬性。
模板引用模塊中資源的輸出作為模板本身的輸出。
假設(shè)MODULE::My::VPC::SampleVpc
模塊包含邏輯名稱為Vpc
的資源ALIYUN::ECS::VPC
。要使用Ref
內(nèi)部函數(shù)引用此資源的ID或Fn::GetAtt
內(nèi)部函數(shù)引用此資源的輸出屬性,需要將模板中模塊的邏輯名稱MyVpc
與模塊中資源的邏輯名稱Vpc
相結(jié)合,從而獲得資源的完全限定邏輯名稱: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
引用模塊中的輸出
您可以把模塊當(dāng)作資源,其輸出當(dāng)作資源屬性,使用Fn::GetAtt
、Fn::Sub
內(nèi)部函數(shù)訪問模塊輸出。更多信息,請參見輸出(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}"
引用模塊中的條件
您可以把模塊當(dāng)作命名空間,從而得到完全限定名稱,使用Fn::If
、Fn::Or
、Fn::And
、Fn::Not
內(nèi)部函數(shù)來訪問模塊中的條件。更多信息,請參見條件(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
引用模塊中的映射
您可以把模塊當(dāng)作命名空間,從而得到完全限定名稱,使用Fn::FindInMap
內(nèi)部函數(shù)來訪問模塊中的映射。更多信息,請參見映射(Mappings)。
// Fn::FindInMap示例
FindInMap Example1:
Fn::FindInMap:
- ModuleLogicalName.MappingName
- Key
- SubKey
FindInMap Example2:
Fn::FindInMap:
- ModuleLogicalName.ChildModuleLogicalName.MappingName
- Key
- SubKey
依賴模塊中的資源
您需要使用資源的完全限定邏輯名稱實現(xiàn)依賴模塊中的資源。
Resource1:
DependsOn: ModuleLogicalName.ResourceLogicalName
Resource2:
DependsOn: ModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName
依賴模塊
資源(或模塊)如果依賴于模塊,則依賴于模塊及其子模塊中的所有資源。您需要使用模塊的完全限定邏輯名稱實現(xiàn)依賴模塊。
Resource1:
DependsOn: ModuleLogicalName
Resource2:
DependsOn: ModuleLogicalName.ChildModuleLogicalName
注意事項
下列是使用模塊的相關(guān)注意事項。
使用模塊不收取任何額外費用,您只需為模塊解析到資源棧中的資源付費。
如果模板使用了模塊,模板會增加如下限制:
參數(shù)名稱中不能包含字符:
.:
。資源邏輯名稱中不能包含字符:
.
。輸出名稱中不能包含字符:
.
。條件名稱中不能包含字符:
&
。不能為模板指定
Transform
和Workspace
。不能為模塊指定
Metadata
和Count
。資源或模塊的完全限定邏輯名稱、條件完全限定名稱和映射完全限定名稱都不能重復(fù)。
ROS配額(例如資源棧中允許的最大資源數(shù)或模板正文的最多內(nèi)容)適用于處理過的模板,無論該模板中包含的資源是否來自模塊。更多信息,請參見使用限制。
您在資源棧級別指定的標(biāo)簽、資源組將分配給來自模塊的各個資源。
處理模板時,模塊中的
Metadata
、Rules
會被忽略。處理模塊時,不會解析動態(tài)引用,而是在資源棧操作期間創(chuàng)建或更新單個資源時解析動態(tài)引用。關(guān)于動態(tài)引用的更多信息,請參見動態(tài)引用。
模塊的輸出不會傳播變成模板的輸出。您可以創(chuàng)建模板輸出并引用模塊輸出。更多信息,請參見引用模塊中的輸出。
模塊的參數(shù)不會傳播變成模板的參數(shù)。您可以創(chuàng)建模板參數(shù),然后在模塊參數(shù)中引用該模板參數(shù)。更多信息,請參見使用模板參數(shù)指定模塊屬性。
如果使用模塊時指定版本為默認(rèn)版本(
default
),更改模塊的默認(rèn)版本不會啟動任何資源棧更新操作。但是,在您下次使用包含該模塊的任何模板執(zhí)行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的默認(rèn)版本。
如果使用模塊時指定版本為最新版本(
latest
),創(chuàng)建新的模塊版本或刪除最新模塊版本不會啟動任何資源棧更新操作。但是,在您下次使用包含該模塊的任何模板執(zhí)行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的最新版本。
在資源棧操作期間,ROS會使用當(dāng)前賬戶中注冊的模塊,包括嵌套在其他模塊中的模塊。
如果您在不同賬號的同一個模塊的版本不一致,則使用同一個模板可能會導(dǎo)致不同的結(jié)果。
為了保證結(jié)果統(tǒng)一,如果要在資源棧模板中納入模塊以用于資源棧組,則應(yīng)確保在計劃部署資源棧實例的所有賬戶中模塊的一致性,其中包括嵌套在其他模塊中的模塊。更多信息,請參見資源棧組。
說明如果您想要在資源棧組所在賬號中展開模塊,需要在創(chuàng)建或更新資源棧組時勾選是否在當(dāng)前賬號展開模塊。