Stories

Detail Return Return

資源編排ROS之模塊:實現模板代碼複用(進階篇) - Stories Detail

背景

資源編排服務(Resource Orchestration Service, 簡稱ROS)是阿里雲提供的一項簡化雲計算資源管理的服務。您可以遵循ROS定義的模板規範編寫資源棧模板,在模板中定義所需的雲計算資源(例如ECS實例、RDS數據庫實例)、資源間的依賴關係等。ROS的編排引擎將根據模板自動完成所有資源的創建和配置,實現自動化部署及運維。

在基礎篇中,我們熟悉了模塊的相關知識,並以複用網絡設置(安全組)為例,創建和使用了模塊。

模塊可以實現模板代碼複用,以達到模塊化和簡化基礎設施配置的效果。除此之外,模塊還具有哪些能力,能解決什麼問題?

模塊能力

輸入輸出

  • 模塊支持自定義輸入:

    • 模塊參數可以幫助您將自定義值從模板(或模塊)輸入到模塊中,模塊可以使用自定義值來設置資源(或子模塊)的屬性。
    • 如果模塊參數未指定,且該參數有默認值(Default),則會使用默認值。
  • 模塊支持自定義輸出:可以把模塊當作資源,其輸出當作資源屬性,使用Fn::GetAtt、Fn::Sub內部函數訪問模塊輸出。

公共模塊

公共模塊是資源編排為您提供的可直接使用的模塊,可以在控制枱查看。

公共模塊是對功能的封裝,當前提供的公共模塊如下:

模塊名稱 説明
MODULE::ACS::CS::Provision 該模塊用於開通容器服務並進行雲資源訪問授權。
MODULE::ACS::ComputeNest::ClusterHelmApplication 該模塊用於在ack集羣上進行helm chart部署。
MODULE::ACS::ComputeNest::FluxOciHelmDeploy 該模塊用於在ack集羣上使用fluxcd進行helm部署。
MODULE::ACS::FC::RunPythonScript 該模塊用於運行Python代碼並獲取結果。
MODULE::ACS::OOS::ExecuteAPI 該模塊用於執行一次阿里雲OpenAPI,並獲取其輸出。
MODULE::ACS::OOS::ExecuteTemplate 該模塊用於執行OOS模板。
MODULE::ACS::RAM::TemporaryRole 該模塊用於創建一個臨時角色,該角色在資源棧執行期間可以被使用。
MODULE::ACS::ROS::PythonCustomResource 該模塊用於自定義一個使用Python代碼實現的資源。當您創建、更新(如果您更改了自定義資源)或刪除資源棧時,ROS會運行該邏輯。
MODULE::ACS::ROS::PythonCustomResourceCreator 該模塊用於從GitHub代碼倉庫(Python)構建和使用ROS自定義資源。
MODULE::ACS::VPC::EIPs 該模塊用於創建並綁定多個彈性公網IP。
MODULE::ACS::VPC::OptionalVpcAndVSwitch 該模塊用於新建或返回已有的 VPC 和 VSwitch。

版本管理

  • 模塊支持多版本:版本從v1開始遞增,可刪除。
  • 使用模塊時,通過Version字段為模塊指定版本,Version取值如下:

    • 指定版本:格式為v+數字,例如v1、v10。
    • default:默認版本。

      • 只要模塊未刪除,模塊始終存在一個可用的默認版本。
      • 您可以通過API或控制枱自行設置自定義模塊的默認版本。
      • 使用自定義模塊時,建議使用此方式。使用公共模塊時,建議使用此方式。
    • latest:最新版本。

      • 只要模塊未刪除,模塊始終存在一個可用的最新版本。
      • 當模塊創建新版本或刪除最新版本時,最新版本會發生變化。
      • 開發調試模塊時,建議使用此方式。

共享模塊

模塊使用四段式命名約定:MODULE::Organization::Service::Usecase。

  • MODULE:固定值。
  • Organization:組織名稱。
  • Service:產品名稱。
  • Usecase:資源名稱。

創建模塊時,如果Organization為SHARE,則Service必須為當前賬號的主賬號ID,例如MODULE::SHARE::123456789::Usecase。

這種特殊的自定義模塊也稱為共享模塊。其他用户可以查看和使用您的共享模塊,但無法修改和刪除它。

共享模塊用於跨賬號訪問和使用。

例如,網絡團隊把網絡配置封裝為模塊,並在他們的賬號中向其他團隊提供,其他團隊可以在他們的賬號中直接使用。

使用場景示例

除了對基礎設施模塊化外,下面展示了模塊的一些其他使用場景。

把模塊當作配置

創建一個模塊MODULE::MyOrg::MyApp::InfrastructureSetting,其內容如下:

ROSTemplateFormatVersion: '2015-09-01'
Outputs:
  NamePrefix:
    Value: MyOrg-MyApp-
    Description: 名稱前綴

使用下面的模板創建一部分基礎設施(地域選擇杭州),所有資源的名稱屬性都使用了Setting.NamePrefix作為前綴。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
  Setting:
    Type: MODULE::MyOrg::MyApp::InfrastructureSetting
    Version: default
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      VpcName:
        Fn::Sub: "${Setting.NamePrefix}Vpc"
      CidrBlock: 192.168.0.0/16
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchName:
        Fn::Sub: "${Setting.NamePrefix}VSwitch"
      CidrBlock: 192.168.0.0/24
      ZoneId: cn-hangzhou-k

預覽資源棧,可以看到Vpc和VSwitch名稱屬性的前綴都為NamePrefix中設定的值。

image.png

把模塊當作數據處理工具

創建一個模塊MODULE::MyOrg::Common::InfrastructureSetting,其內容如下:

該模塊接受組織名稱和應用名稱作為輸入,輸出Vpc名稱、VSwitch名稱和默認可用區。

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  OrgName:
    Type: String
    Default: MyOrg
    Description: 組織名稱
  AppName:
    Type: String
    Description: 應用名稱
Outputs:
  VpcName:
    Value:
      'Fn::Sub': '${OrgName}-${AppName}-Vpc'
    Description: Vpc名稱
  VSwitchName:
    Value:
      'Fn::Sub': '${OrgName}-${AppName}-VSwitch'
    Description: VSwitch名稱
  DefaultZoneId:
    Value:
      'Fn::Select':
        - '0'
        - 'Fn::GetAZs':
            Ref: 'ALIYUN::Region'
    Description: 默認可用區
  NamePrefix:
    Value:
      'Fn::Sub': '${OrgName}-${AppName}-'
    Description: 名稱前綴
  LowerNamePrefix:
    Value:
      'Fn::Jq':
        - First
        - '.[0] | ascii_downcase'
        - - 'Fn::Sub': '${OrgName}-${AppName}-'
    Description: 小寫名稱前綴

使用下面的模板創建一部分基礎設施(無地域限制),傳遞應用名稱給模塊,資源部分屬性(VpcName、VSwitchName、ZoneId)引用模塊的輸出。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
  Setting:
    Type: MODULE::MyOrg::Common::InfrastructureSetting
    Version: default
    Properties:
      AppName: MyApp
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      VpcName: !GetAtt Setting.VpcName
      CidrBlock: 192.168.0.0/16
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchName: !GetAtt Setting.VSwitchName
      CidrBlock: 192.168.0.0/24
      ZoneId: !GetAtt Setting.DefaultZoneId

預覽資源棧,VpcName和VSwitchName都帶上了前綴,ZoneId也實現了自動獲取。

image.png

用模塊來包裝資源

創建一個模塊MODULE::MyOrg::Common::OssPrivateBucket,其內容如下:

該模塊選擇了ALIYUN::OSS::Bucket部分會用到的資源屬性進行了封裝,並設置AccessControl為private,也就是限制Bucket只能為私有,以達到安全合規的目的。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
  Bucket:
    Type: 'ALIYUN::OSS::Bucket'
    Properties:
      AccessControl: private
      Tags:
        Ref: Tags
      RedundancyType:
        Ref: RedundancyType
      EnableOssHdfsService:
        Ref: EnableOssHdfsService
      ResourceGroupId:
        Ref: ResourceGroupId
      BucketName:
        Ref: BucketName
      DeletionForce:
        Ref: DeletionForce
      StorageClass:
        Ref: StorageClass
Parameters:
  Tags:
    Default: null
    Required: false
    Type: Json
    Description:
      zh-cn: 存儲空間標籤。Key-Value形式的鍵值對。
      en: Bucket tags in k-v pairs format.
    Label:
      zh-cn: 存儲空間標籤
      en: Tags
  RedundancyType:
    AssociationPropertyMetadata:
      LocaleKey: OSSRedundancyType
    Description:
      en: >-
        Specifies the data disaster recovery type of the storage space. The
        value range is as follows:

        LRS (default): Local redundant LRS stores your data redundantly on
        different storage devices in the same availability zone, and can support
        data loss and normal access even when two storage devices are damaged
        concurrently.

        ZRS: Intra-city redundant ZRS adopts a data redundancy storage mechanism
        in multiple availability zones (AZ), and stores user data redundantly in
        multiple availability zones in the same region. When an availability
        zone is unavailable, normal access to data can still be guaranteed.
    Default: LRS
    Required: false
    Label:
      zh-cn: 存儲冗餘類型
    AllowedValues:
      - LRS
      - ZRS
    Type: String
  EnableOssHdfsService:
    Default: false
    Required: false
    Type: Boolean
    Description:
      en: |-
        Whether enable OSS-HDFS service. 
        **Note**: Once it's enabled, it can't be disabled again.
    Label:
      zh-cn: 是否開啓OSS-HDFS服務
      en: EnableOssHdfsService
  ResourceGroupId:
    Description:
      en: The resource group id.
    Default: null
    Required: false
    Label:
      zh-cn: 資源組ID
      en: ResourceGroupId
    AssociationProperty: 'ALIYUN::ECS::ResourceGroup::ResourceGroupId'
    Type: String
  BucketName:
    Required: true
    Type: String
    Description:
      en: bucket name.
    Label:
      zh-cn: Bucket名稱
  DeletionForce:
    Default: false
    Required: false
    Type: Boolean
    Description:
      en: >-
        Whether force delete the relative objects in the bucket. Default value
        is false.
    Label:
      zh-cn: 是否強制刪除OSS中的文件
      en: DeletionForce
  StorageClass:
    AssociationPropertyMetadata:
      LocaleKey: OSSStorageClass
    Description:
      en: Specifies the storage class of the bucket. Default is "Standard".
    Default: null
    Required: false
    Label:
      zh-cn: 存儲空間類型
      en: StorageClass
    AllowedValues:
      - Standard
      - IA
      - Archive
      - ColdArchive
    Type: String
Outputs:
  InternalDomainName:
    Description: The internal DNS name of the specified bucket.
    Value:
      'Fn::GetAtt':
        - Bucket
        - InternalDomainName
  Name:
    Description: The name of Bucket
    Value:
      'Fn::GetAtt':
        - Bucket
        - Name
  DomainName:
    Description: The public DNS name of the specified bucket.
    Value:
      'Fn::GetAtt':
        - Bucket
        - DomainName
Metadata:
  'ALIYUN::ROS::Interface':
    ParameterGroups:
      - Parameters:
          - BucketName
          - StorageClass
          - RedundancyType
          - DeletionForce
        Label:
          default:
            zh-cn: 基礎設置
            en: Base Configuration
      - Parameters:
          - ResourceGroupId
          - Tags
        Label:
          default:
            zh-cn: 管理設置
            en: Manage Configuration
      - Parameters:
          - EnableOssHdfsService
        Label:
          default:
            zh-cn: 其他設置
            en: Other Configuration

使用下面的模板創建一部分基礎設施。

ROSTemplateFormatVersion: "2015-09-01"
Resources:
  Setting:
    Type: MODULE::MyOrg::Common::InfrastructureSetting
    Version: default
    Properties:
      AppName: MyApp
  Bucket:
    Type: MODULE::MyOrg::Common::OssPrivateBucket
    Version: default
    Properties:
      BucketName: 
        Fn::Sub: "${Setting.LowerNamePrefix}bucket"

預覽資源棧,Bucket為私有。

image.png

user avatar wanhuabandedasuan Avatar yunxiao0816 Avatar dengzhanyong Avatar 240cgxo4 Avatar timeofsunrise Avatar 54r9rxzy Avatar cynthia_59675eba1a2ee Avatar tiaoyuedelinghun_5b34a58295338 Avatar jiang_5f3236dd7afd1 Avatar
Favorites 9 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.