全部產品
Search
文件中心

Resource Orchestration Service:使用模組

更新時間:Aug 24, 2023

您可以在其他模組或模板中使用模組。本文為您介紹如何使用模組及其相關注意事項。

前提條件

  • 如果您想使用自訂模組,請先確保該模組已經在相關帳號中註冊。具體操作,請參見建立自訂模組查看自訂模組

  • 如果是Resource Orchestration Service支援的公用模組,您可以直接使用。更多資訊,請參見查看公用模組

使用模組

您需要將模組當作單個資源進行處理。

  • 將其納入到模板(或模組)的Resources部分中。

  • 為模組指定版本。

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

為模組指定版本

通過Version欄位為模組指定版本,Version取值如下:

  • 指定版本:格式為v+數字,例如v1v10

    使用公用模組時,建議使用此方式。

  • 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模組為子模組,該模組定義了兩個參數:VpcNameCidrBlock。這些參數用於設定ALIYUN::ECS::VPC資源的VpcNameCidrBlock屬性。子模組的程式碼範例如下所示。

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::SampleVpcPrivateCidrBlock參數設定為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.ResourceLogicalNameParentModuleLogicalName.ChildModuleLogicalName.ResourceLogicalName

通過這種方式,您可以使用Fn::GetAttRefFn::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

說明

您可以在ROS中查看模組,並擷取到資源的邏輯名稱。更多資訊,請參見查看自訂模組查看公用模組

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::GetAttFn::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::IfFn::OrFn::AndFn::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

注意事項

下列是使用模組的相關注意事項。

  • 使用模組不收取任何額外費用,您只需為模組解析到資源棧中的資源付費。

  • 如果模板使用了模組,模板會增加如下限制:

    • 參數名稱中不能包含字元:.:

    • 資源邏輯名稱中不能包含字元:.

    • 輸出名稱中不能包含字元:.

    • 條件名稱中不能包含字元:&

    • 不能為模板指定TransformWorkspace

    • 不能為模組指定MetadataCount

    • 資源或模組的完全限定邏輯名稱、條件完全限定名稱和映射完全限定名稱都不能重複。

  • ROS配額(例如資源棧中允許的最大資源數或模板本文的最多內容)適用於處理過的模板,無論該模板中包含的資源是否來自模組。更多資訊,請參見使用限制

  • 您在資源棧層級指定的標籤、資源群組將分配給來自模組的各個資源。

  • 處理模板時,模組中的MetadataRules會被忽略。

  • 處理模組時,不會解析動態引用,而是在資源棧操作期間建立或更新單個資源時解析動態引用。關於動態引用的更多資訊,請參見動態引用

  • 模組的輸出不會傳播變成模板的輸出。您可以建立模板輸出並引用模組輸出。更多資訊,請參見引用模組中的輸出

  • 模組的參數不會傳播變成模板的參數。您可以建立模板參數,然後在模組參數中引用該模板參數。更多資訊,請參見使用模板參數指定模組屬性

  • 如果使用模組時指定版本為預設版本(default),更改模組的預設版本不會啟動任何資源棧更新操作。

    但是,在您下次使用包含該模組的任何模板執行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的預設版本。

  • 如果使用模組時指定版本為最新版本(latest),建立新的模組版本或刪除最新模組版本不會啟動任何資源棧更新操作。

    但是,在您下次使用包含該模組的任何模板執行資源棧操作(例如資源棧更新)時, ROS將在操作中使用新的最新版本。

  • 在資源棧操作期間,ROS會使用當前賬戶中註冊的模組,包括嵌套在其他模組中的模組。

    如果您在不同帳號的同一個模組的版本不一致,則使用同一個模板可能會導致不同的結果。

  • 為了保證結果統一,如果要在資源棧模板中納入模組以用於資源棧組,則應確保在計劃部署資源棧執行個體的所有賬戶中模組的一致性,其中包括嵌套在其他模組中的模組。更多資訊,請參見資源棧組

    說明

    如果您想要在資源棧組所在帳號中展開模組,需要在建立或更新資源棧組時勾選是否在當前帳號展開模組