全部產品
Search
文件中心

Resource Orchestration Service:資源(Resources)

更新時間:Jun 19, 2024

資源(Resources)用於描述資源棧中每個資源的屬性和資源之間的依賴關係。一個資源可以被其他資源引用,也可以在輸出(Outputs)中被引用。

資源實體類型

資源實體類型分為普通資源和資料來源資源,普通資源可進一步分為阿里雲資源和自訂資源,具體如下表所示。

資源實體類型

說明

普通資源(Resource)

  • 阿里雲資源:用於建立阿里雲資源,以及對資源進行更新和刪除。阿里雲資源類型以ALIYUN::開頭。

  • 自訂資源:用於建立自訂邏輯的資源,並可自訂資源如何更新和刪除。自訂資源類型以Custom::開頭,或者為ALIYUN::ROS::CustomResource

    更多資訊,請參見概覽

資料來源資源(DataSource)

用於查詢雲端服務資源資料。

更多資訊,請參見資料來源資源

文法

Resources由資源ID和資源描述組成。資源描述用大括弧({ })括起。如果聲明多個資源,用半形逗號(,)分隔開。Resources的文法結構範例程式碼段如下:

Resources:
  資源1 Name:
    Type: 資源類型
    Condition: 是否建立此資源的條件
    Properties: 資源屬性描述
  資源2 Name:
    Type: 資源類型
    Condition: 是否建立此資源的條件
    Properties: 資源屬性描述

參數說明如下:

  • 資源Name在模板中具有唯一性。在建立模板其他部分時,可以通過資源Name引用該資源。

  • 資源類型(Type)表示正在聲明的資源的類型。例如:ALIYUN::ECS::Instance表示阿里雲ECS執行個體。關於ROS支援的所有資源類型列表和詳細資料,請參見資源類型索引

  • 資源屬性(Properties)是為資源指定的附加選項。例如:必須為每個阿里雲ECS執行個體指定一個Image ID。

樣本

Resources:
  ECSInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      ImageId: m-25l0r****

如果資源不需要聲明任何屬性,可以忽略該資源的屬性部分。

屬性值可以是文本字串、字串列表、布爾值、引用參數或者函數傳回值。 當您編寫JSON模板時,請參見以下規則。

  • 如果屬性值為文本字串,該值會被雙引號(" ")括起來。

  • 如果屬性值為任一類型的字串列表,則會被方括弧([ ])括起來。

  • 如果屬性值為內建函式或引用的參數,則會被大括弧({ })括起來。

當您將文字、列表、引用參數和函數傳回值合并起來取值時,上述規則也適用。聲明不同的屬性值類型樣本如下:

{
  "Properties": {
    "String": "string",
    "LiteralList": [
      "value1",
      "value2"
    ],
    "Boolean": true,
    "ReferenceForOneValue": {
      "Ref": "ResourceID"
    },
    "FunctionResultWithFunctionParams": {
      "Fn::Join": [
        "%",
        [
          "Key=",
          {
            "Ref": "SomeParameter"
          }
        ]
      ]
    }
  }
}

DeletionPolicy

當您需要你移除資源時,會面臨兩種情況:

  • 當DeletionPolicy取值為Delete時,在從資源棧移除資源的同時,刪除資源本身。

  • 當DeletionPolicy取值為Retain時,在從資源棧移除資源的同時,保留資源本身。

例如:設定在資源棧刪除時保留ECS執行個體,可按照以下程式碼片段進行聲明:

Resources:
  ECSInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      ImageId: m-25l0r****
    DeletionPolicy: Retain

在本樣本中,如果該模板對應的資源棧被刪除,則會保留ECSInstance資源。

DependsOn

在模板中,設定DependsOn屬性,可以指定特定資源緊跟著另一個資源後建立。為某個資源添加DependsOn屬性後,該資源僅在DependsOn屬性中指定的資源之後建立。

重要

允許DependsOn依賴的資源ConditionFalse,為False時不影響該資源的建立。

用法樣本包括以下兩種:

  • 依賴單個資源:

    DependsOn: ResourceName
  • 依賴多個資源:

    DependsOn:
      - ResourceName1
      - ResourceName2

如以下程式碼片段所示,WebServer將在DatabaseServer建立成功後才開始建立:

ROSTemplateFormatVersion: '2015-09-01'
Resources:
  WebServer:
    Type: ALIYUN::ECS::Instance
    DependsOn: DatabseServer
  DatabseServer:
    Type: ALIYUN::ECS::Instance
    Properties:
      ImageId: m-25l0r****
      InstanceType: ecs.t1.small

Condition

在模板中,使用Condition屬性可以指定是否需要建立此資源。只有Condition所指定的條件值為True時,才會建立此資源。

如以下程式碼片段所示,根據MaxAmount的值判斷否建立WebServer:

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  MaxAmount:
    Type: Number
    Default: 1
Conditions:
  CreateWebServer:
    Fn::Not:
      Fn::Equals:
        - 0
        - Ref: MaxAmount
Resources:
  WebServer:
    Type: ALIYUN::ECS::InstanceGroup
    Condition: CreateWebServer
    Properties:
      ImageId: m-25l0rc****
      InstanceType: ecs.t1.small
      MaxAmount:
        Ref: MaxAmount
  DatabseServer:
    Type: ALIYUN::ECS::Instance
    Properties:
      ImageId: m-25l0r****
      InstanceType: ecs.t1.small

Count

在模板中,為資源指定Count後,ROS會對模板進行預先處理,把該資源展開成多個資源。 操作資源棧時使用處理後的模板。

  • 例如:資源名為A,其Count值為3。在處理後的模板中,沒有A資源,取而代之的是A[0]A[1]A[2]這3個資源。

    Resources:
      A:
        Count: 3
        ...

    處理後:

    Resources:
      A[0]:
        ...
      A[1]:
        ...
      A[2]:
        ...
    重要

    如果展開後的資源的名稱在原模板中已存在,比如A[1]在原模板中已經定義,則預先處理失敗,校正不通過。

    請避免向已有資源添加Count屬性,因為這會導致資源名發生變化,引發刪除操作。

  • Count最終結果必須為自然數,僅支援如下函數:

  • 處理後的模板資源總數需要符合限制,目前最多支援300個。

  • 指定了Count的資源的屬性(Properties)中可以使用偽參數ALIYUN::Index,在預先處理的時候會被替換為相應的數值。例如,A[0]使用的ALIYUN::Index會被替換為0,A[1]使用的ALIYUN::Index會被替換為1。模板其他地方不能使用ALIYUN::Index

  • 如果指定了Count的資源出現在DependsOn中,會被展開。

    DependsOn: A

    處理後:

    DependsOn:
      - A[0]
      - A[1]
      - A[2]
  • 如果指定了Count的資源出現在函數RefFn::GetAtt中,會被展開。

    Ref: A
    Fn::GetAtt:
      - A
      - PropertyName

    處理後:

    - Ref: A[0]
    - Ref: A[1]
    - Ref: A[2]
    - Fn::GetAtt:
        - A[0]
        - PropertyName
    - Fn::GetAtt:
        - A[1]
        - PropertyName
    - Fn::GetAtt:
        - A[2]
        - PropertyName

    如果多個資源使用Count,並且存在參考關聯性。建議與Fn::Select以及ALIYUN::Index聯合使用。

    Fn::Select:
      - Ref: ALIYUN::Index
      - Ref: A

    A為例,B引用了A,且BCount為2,轉換後B[0]B[1]中部分運算式分別如下:

    - Ref: A[0]
    - Ref: A[1]
  • 如果資源指定了Count屬性,則DependsOn屬性也支援運算式。DependsOn屬性的運算式可以使用的函數與Count屬性一致,可以使用ALIYUN::Index偽參數。運算式的格式與允許的計算結果如下表所示。

    格式

    樣本

    允許的計算結果

    字典。

    Fn::Split:
      - ','
      - Server1,Server2

    null。

    如果為null值,則會移除DependsOn屬性。

    字串。

    • 如果是Null 字元串,則會移除DependsOn屬性。

    • 如果是非Null 字元串,則必須是有效資源名稱。

    列表。

    • 如果清單項目為null或Null 字元串,則丟棄該清單項目。

    • 如果列表為空白,則會移除DependsOn屬性。

    • 如果列表不為空白,則每一項必須是字串,且為有效資源名稱。

    列表。

    - Server0
    - Fn::Split:
        - ','
        - Server1,Server2

    清單項目可以是字典或字串,不同清單項目允許的計算結果不同,具體如下:

    • 如果清單項目為字典,則會進行運算式計算,允許的計算結果如下:

      • 如果為null值或Null 字元串,則丟棄該項。

      • 否則,必須是字串,且為有效資源名稱。

    • 如果清單項目為字串,則必須是有效資源名稱。

    說明

    如果列表為空白,則會移除DependsOn屬性。

    字串。

    Server0

    字串。

    不會進行額外的處理。

    如下樣本模板用於控制Count資源單並發數。參數Count表示要建立的資源的數量,參數ParallelCount代表最大並發建立數。

    ROSTemplateFormatVersion: '2015-09-01'
    Parameters:
      Count:
        Type: Number
      ParallelCount:
        Type: Number
    Resources:
      WaitConditionHandle:
        Type: ALIYUN::ROS::WaitConditionHandle
        Count:
          Ref: Count
        DependsOn:
          Fn::Select:
            - Fn::Calculate:
                - 1-{0}//{1}
                - 0
                - - Fn::Min:
                      - Ref: ALIYUN::Index
                      - Ref: ParallelCount
                  - Ref: ParallelCount
            - - Fn::Replace:
                  - index:
                      Fn::Calculate:
                        - '{0}-{1}'
                        - 0
                        - - Ref: ALIYUN::Index
                          - Ref: ParallelCount
                  - WaitConditionHandle[index]

    當Count和ParallelCount取值不同時,處理後的模板也有差異,具體如下:

    • 若設定Count為3,ParallelCount為1,則處理後的模板為:

      ROSTemplateFormatVersion: '2015-09-01'
      Resources:
        WaitConditionHandle[0]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[1]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[0]
        WaitConditionHandle[2]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[1]
      Parameters:
        Count:
          Type: Number
        ParallelCount:
          Type: Number
    • 若設定Count為5,ParallelCount為2,則處理後的模板為:

      ROSTemplateFormatVersion: '2015-09-01'
      Resources:
        WaitConditionHandle[0]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[1]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[2]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[0]
        WaitConditionHandle[3]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[1]
        WaitConditionHandle[4]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[2]
      Parameters:
        Count:
          Type: Number
        ParallelCount:
          Type: Number
    • 若設定Count為5,ParallelCount為3,則處理後的模板為:

      ROSTemplateFormatVersion: '2015-09-01'
      Resources:
        WaitConditionHandle[0]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[1]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[2]:
          Type: ALIYUN::ROS::WaitConditionHandle
        WaitConditionHandle[3]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[0]
        WaitConditionHandle[4]:
          Type: ALIYUN::ROS::WaitConditionHandle
          DependsOn: WaitConditionHandle[1]
      Parameters:
        Count:
          Type: Number
        ParallelCount:
          Type: Number

Count的樣本模板如下。樣本模板中建立了一組EIP和同等數量的ECS,並把EIP與ECS逐一綁定。

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  Count:
    Type: Number
Resources:
  Eip:
    Type: ALIYUN::VPC::EIP
    Count:
      Ref: Count
    Properties:
      Bandwidth: 5
  Servers:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      MinAmount:
        Ref: Count
      MaxAmount:
        Ref: Count
      AllocatePublicIP: false
      ...: Null
  EipBind:
    Type: ALIYUN::VPC::EIPAssociation
    Count:
      Ref: Count
    Properties:
      InstanceId:
        Fn::Select:
          - Ref: ALIYUN::Index
          - Fn::GetAtt:
              - Servers
              - InstanceIds
      AllocationId:
        Fn::Select:
          - Ref: ALIYUN::Index
          - Ref: Eip
Outputs:
  InstanceIds:
    Value:
      Fn::GetAtt:
        - Servers
        - InstanceIds
  AllocationIds:
    Value:
      Ref: Eip
  EipAddresses:
    Value:
      Fn::GetAtt:
        - Eip
        - EipAddress

處理後:

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  Count:
    Type: Number
Resources:
  Eip[0]:
    Type: ALIYUN::VPC::EIP
    Properties:
      Bandwidth: 5
  Eip[1]:
    Type: ALIYUN::VPC::EIP
    Properties:
      Bandwidth: 5
  Servers:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      MinAmount:
        Ref: Count
      MaxAmount:
        Ref: Count
      AllocatePublicIP: false
      ...: Null
  EipBind[0]:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Fn::Select:
          - 0
          - Fn::GetAtt:
              - Servers
              - InstanceIds
      AllocationId:
        Ref: Eip[0]
  EipBind[1]:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Fn::Select:
          - 1
          - Fn::GetAtt:
              - Servers
              - InstanceIds
      AllocationId:
        Ref: Eip[1]
Outputs:
  InstanceIds:
    Value:
      Fn::GetAtt:
        - Servers
        - InstanceIds
  AllocationIds:
    Value:
      - Ref: Eip[0]
      - Ref: Eip[1]
  EipAddresses:
    Value:
      - Fn::GetAtt:
          - Eip[0]
          - EipAddress
      - Fn::GetAtt:
          - Eip[1]
          - EipAddress

資源聲明樣本

典型的資源聲明樣本如下:

Resources:
  WebServer:
    Type: ALIYUN::ECS::Instance
    Properties:
      ImageId: m-25l0r****
      InstanceType: ecs.t1.small
      SecurityGroupId: sg-25zwc****
      ZoneId: cn-beijing-b
      Tags:
        - Key: Department1
          Value: HumanResource
        - Key: Department2
          Value: Finance
  ScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      ImageId: ubuntu_14_04_64_20G_aliaegis_2015****.vhd
      InstanceType: ecs.t1.small
      InstanceId: i-25xhh****
      InternetChargeType: PayByTraffic
      InternetMaxBandwidthIn: 1
      InternetMaxBandwidthOut: 20
      SystemDisk_Category: cloud
      ScalingGroupId: bwhtvpcBcKYac9fe3vd0****
      SecurityGroupId: sg-25zwc****
      DiskMappings:
        - Size: 10
        - Category: cloud
          Size: 10