全部產品
Search
文件中心

Compute Nest:ECS鏡像部署物

更新時間:Nov 15, 2024

計算巢通過ECS鏡像部署物方式解決在多地區部署服務時,使用ECS鏡像因需要手動完成鏡像複製、映射和許可權管理等步驟而變得複雜的問題。本文為您介紹ECS鏡像部署物的原理以及建立和使用方法。

使用背景

  • 為什麼使用ECS鏡像部署物?

    在部署服務時,我們常使用ECS鏡像來支援多地區部署。然而,由於ECS鏡像具有地區限制,我們需要在每個目標地區複製這些鏡像,並在模板中為不同的地區指定對應的鏡像。這包括了鏡像的複製、映射以及許可權管理等一系列工作,而且每當有新的鏡像版本發布時,這些步驟都需要重複執行,使得整個過程非常複雜且繁瑣。

  • ECS鏡像部署物的優勢?

    服務商僅需完成原始鏡像的建立,後續鏡像複製、映射、許可權管理等均由計算巢完成,服務商僅需在計算巢控制台配置ECS鏡像部署物關聯即可。

    • 鏡像複製:計算巢會將服務商的原始鏡像複製到計算巢的通用帳號下,在此帳號下完成鏡像多地區複製。

    • 鏡像映射:計算巢會識別模板中是否存在ImageId的設定,若存在,則在服務詳情處可選擇將ImageId與ECS鏡像部署物關聯,在使用者部署時,計算巢會識別使用者的部署地區,自動選擇該地區對應鏡像Id替換模板的ImageId處,實現鏡像地區的動態映射。

    • 許可權管理:部署物許可權跟隨服務,若未關聯服務,部署物許可權為私人,僅服務商可用。若關聯至少一個公開許可權服務,則ECS鏡像部署物許可權為公開。若全部關聯私人許可權服務,則ECS鏡像部署物許可權為私人,此時若服務新增白名單,則ECS鏡像部署物也會新增對應白名單。

使用限制

模板中支援替換ECS部署物的雲資源。

ROS

如果部署方式選擇ROS,則需要在ROS模板Resource中包含鏡像ID:ImageId

Terraform

如果部署方式選擇Terraform,則需要在模板中包含鏡像ID:image_id

  • 支援的雲資源類型。

  • 資源屬性 image_id

  • 資源屬性值必須是字串(鏡像ID),禁止模板輸入參數或者其他模板內建函數。

建立和使用

前提條件

準備ECS鏡像,計算巢服務中支援自訂鏡像和雲市場鏡像,請根據您的需求進行選擇。

建立ECS鏡像部署物

  1. 配置部署物的基本資料。

    1. 登入計算巢控制台,在左側導覽列選擇服務部署物,並在部署物地區中單擊建立部署物

    2. 部署物資訊地區,完成部署物資訊填寫。

      配置項

      說明

      部署物名稱

      由中文、數字、英文及底線組成,長度在 3~50 個字元之間,一個中文字等於 2 個字元,部署物名稱建立後不可修改。

      部署物版本名稱

      由中文、數字、英文及底線組成,長度在 3~50 個字元之間,一個中文字等於 2 個字元。

      部署物描述

      簡介長度在10-500個字元之間,一個中文字等於2個字元。

      資源群組

      選擇建立的部署所歸屬的資源群組名稱。

      資源群組對您擁有的雲資源從用途、許可權、歸屬等維度進行分組,實現企業內部多使用者、多專案的資源分級管理。更多資訊,請參見資源群組

      標籤配置

      選擇或填寫完整的標籤鍵和標籤值,為部署物定標籤。每個資源最多可綁定20列標籤。若無可選的標籤鍵和標籤值,可建立自訂標籤。建立自訂標籤的詳細操作,請參見建立並綁定自訂標籤

  2. 配置ECS鏡像部署物。

    image

    1. 部署物內容地區,選擇部署物類型ECS鏡像鏡像類型選擇商品請選擇準備的鏡像。

    2. 設定分發地區選擇要分發的地區。本節以全部地區為例。

      重要

      ECS鏡像部署物至少選擇一個分發地區。

    3. 單擊發布部署物

      部署物發布後,不可對目前的版本內容進行修改,只能通過建立新版本或新部署物的方式進行修改。

      說明
      • 您需要對部署物進行測試,可單擊儲存部署物。完成測試後再單擊發布部署物

      • 若部署物處於未發布狀態,不能選擇部署物設定的分發地區進行測試,僅可選擇鏡像所在地區測試。

  3. 查看部署物。

    1. 返回服務部署物頁面,單擊新建立的部署物名稱,進入部署物詳情介面查看部署進度。

    2. 當狀態為可用後單擊查看,會擷取到ECS鏡像部署物的分髮結果

    說明

    分發鏡像的時間長度由於地區和鏡像大小的不同,可能在幾分鐘到幾小時不等。

    image

使用ECS鏡像部署物

本節以建立私人化部署服務為例,重點介紹在建立服務時使用ECS鏡像部署物相關配置。

  1. 登入計算巢控制台

  2. 在左側導覽列中選擇我的服務,在我建立的服務地區下單擊建立新服務

  3. 建立私人化部署服務。

    image

  4. 根據提示填入服務基本資料,在模板錄入中選擇並輸入模板。本節以經典情境的ROS模板為例。

    image

  5. 模板內容中存在鏡像IDImageId,則在部署物關聯區塊中可設定鏡像關聯

    image

    樣本模板

    說明

    本樣本模板僅可用於測試。

    ROSTemplateFormatVersion: '2015-09-01'
    Description:
      en: This template deploys custom image for single instance, supports creating new
        VPC and specifying VPC.
      zh-cn: 單一實例自訂鏡像部署,帶資料盤,公網IP可選(支援建立新VPC和指定VPC)。
    Conditions:
      CreateVpcConditions:
        Fn::Equals:
        - true
        - Ref: WhetherCreateVpc
      IfAllocatePublicIP:
        Fn::Equals:
        - Ref: AllocatePublicIP
        - true
    Parameters:
      PayType:
        Type: String
        Label:
          en: ECS Instance Charge Type
          zh-cn: 付費類型
        AssociationProperty: ChargeType
        AssociationPropertyMetadata:
          LocaleKey: InstanceChargeType
        Default: PostPaid
        AllowedValues:
          - PostPaid
          - PrePaid
      PayPeriodUnit:
        Type: String
        Label:
          en: Pay Period Unit
          zh-cn: 購買資源時間長度周期
        AssociationProperty: PayPeriodUnit
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
        Default: Month
        AllowedValues:
          - Month
          - Year
      PayPeriod:
        Type: Number
        Label:
          en: Period
          zh-cn: 購買資源時間長度
        AssociationProperty: PayPeriod
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
        Default: 1
        AllowedValues:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
      EcsInstanceType:
        Type: String
        Label:
          en: Instance Type
          zh-cn: 執行個體類型
        AssociationProperty: ALIYUN::ECS::Instance::InstanceType
        AssociationPropertyMetadata:
          ZoneId: ${ZoneId}
          InstanceChargeType: ${InstanceChargeType}
      ZoneId:
        Type: String
        Label:
          en: Availability Zone
          zh-cn: 可用性區域
        AssociationProperty: ALIYUN::ECS::Instance::ZoneId
      WhetherCreateVpc:
        Type: Boolean
        Label:
          en: WhetherCreateVpc
          zh-cn: 是否建立VPC
        Default: false
      VpcCidrBlock:
        Type: String
        Label:
          en: VPC CIDR IPv4 Block
          zh-cn: 專用網路IPv4網段
        Description:
          zh-cn: VPC的ip位址區段範圍,<br>您可以使用以下的ip位址區段或其子網:<br><font color='green'>[10.0.0.0/8]</font><br><font
            color='green'>[172.16.0.0/12]</font><br><font color='green'>[192.168.0.0/16]</font>
          en: 'The ip address range of the VPC in the CidrBlock form; <br>You can use
            the following ip address ranges and their subnets: <br><font color=''green''>[10.0.0.0/8]</font><br><font
            color=''green''>[172.16.0.0/12]</font><br><font color=''green''>[192.168.0.0/16]</font>'
        AssociationProperty: ALIYUN::VPC::VPC::CidrBlock
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Equals:
              - ${WhetherCreateVpc}
              - true
        Default: 192.168.0.0/16
      VSwitchCidrBlock:
        Type: String
        Label:
          en: VSwitch CIDR Block
          zh-cn: 交換器子網網段
        Description:
          zh-cn: 必須屬於VPC的子網段。
          en: Must belong to the subnet segment of VPC.
        AssociationProperty: ALIYUN::VPC::VSwitch::CidrBlock
        AssociationPropertyMetadata:
          VpcCidrBlock: VpcCidrBlock
          Visible:
            Condition:
              Fn::Equals:
              - ${WhetherCreateVpc}
              - true
        Default: 192.168.1.0/24
      VpcId:
        Type: String
        Label:
          en: VPC ID
          zh-cn: Virtual Private Cloud執行個體ID
        AssociationProperty: ALIYUN::ECS::VPC::VPCId
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Equals:
              - ${WhetherCreateVpc}
              - false
        Default: ''
      VSwitchId:
        Type: String
        Label:
          en: VSwitch ID
          zh-cn: 交換器執行個體ID
        AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
        AssociationPropertyMetadata:
          VpcId: ${VpcId}
          ZoneId: ${ZoneId}
          Visible:
            Condition:
              Fn::Equals:
              - ${WhetherCreateVpc}
              - false
        Default: ''
      InstancePassword:
        Type: String
        Label:
          en: Instance Password
          zh-cn: 執行個體密碼
        Description:
          en: Server login password, Length 8-30, must contain three(Capital letters,
            lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol
            in)
          zh-cn: 伺服器登入密碼,長度8-30,必須包含三項(大寫字母、小寫字母、數字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號)
        ConstraintDescription:
          en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers,
            ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
          zh-cn: 長度8-30,必須包含三項(大寫字母、小寫字母、數字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號)
        AssociationProperty: ALIYUN::ECS::Instance::Password
        AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
        MinLength: 8
        MaxLength: 30
        NoEcho: true
      SystemDiskCategory:
        Type: String
        Label:
          en: System Disk Category
          zh-cn: 系統硬碟類型
        AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
        AssociationPropertyMetadata:
          LocaleKey: DiskCategory
          InstanceType: ${EcsInstanceType}
        AllowedValues:
        - cloud_efficiency
        - cloud_ssd
        - cloud_essd
      SystemDiskSize:
        Type: Number
        Label:
          zh-cn: 系統硬碟空間 (GB)
          en: System Disk Space (GB)
        Default: 200
      DataDiskCategory:
        Type: String
        Label:
          zh-cn: 資料盤類型
          en: Data disk type
        AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
        AssociationPropertyMetadata:
          InstanceType: EcsInstanceType
          ZoneId: ZoneId
          LocaleKey: DiskCategory
      DataDiskSize:
        Type: Number
        Label:
          zh-cn: 資料盤空間
          en: Data disk space
        Description:
          zh-cn: ECS執行個體資料盤大小,單位為GiB。取值範圍:20~32768
          en: 'ECS Instance disk size, range of values: 20-32768, units: GB'
        Default: 200
        MinValue: 20
        MaxValue: 32768
      AllocatePublicIP:
        Type: Boolean
        Label:
          zh-cn: 開啟公網IP
          en: allocate public ip
        Default: true
      InternetMaxBandwidthOut:
        Type: Number
        Label:
          zh-cn: 流量公網頻寬
          en: Internet Max Bandwidth Out
        Description:
          zh-cn: 取值範圍0-100, 0為不開公網ip
          en: no public ip if zero
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Equals:
              - ${AllocatePublicIP}
              - true
        Default: 5
        MinValue: 0
        MaxValue: 100
    Resources:
      EcsVpc:
        Type: ALIYUN::ECS::VPC
        Condition: CreateVpcConditions
        Properties:
          CidrBlock:
            Ref: VpcCidrBlock
          VpcName:
            Ref: ALIYUN::StackName
      EcsVSwitch:
        Type: ALIYUN::ECS::VSwitch
        Condition: CreateVpcConditions
        Properties:
          ZoneId:
            Ref: ZoneId
          VpcId:
            Ref: EcsVpc
          CidrBlock:
            Ref: VSwitchCidrBlock
      EcsSecurityGroup:
        Type: ALIYUN::ECS::SecurityGroup
        Properties:
          # 按照軟體名稱設定安全性群組名稱
          #SecurityGroupName: nginx-sg
          VpcId:
            Fn::If:
            - CreateVpcConditions
            - Ref: EcsVpc
            - Ref: VpcId
          # 按照軟體監聽的連接埠,設定入方向規則(安全性群組預設出方向的全部連接埠都是允許存取的)
          #SecurityGroupIngress:
          #  - PortRange: 80/80
          #    Priority: 1
          #    SourceCidrIp: 0.0.0.0/0
          #    IpProtocol: tcp
      EcsInstanceGroup:
        Type: ALIYUN::ECS::InstanceGroup
        Properties:
          ZoneId:
            Ref: ZoneId
          VpcId:
            Fn::If:
            - CreateVpcConditions
            - Ref: EcsVpc
            - Ref: VpcId
          VSwitchId:
            Fn::If:
            - CreateVpcConditions
            - Ref: EcsVSwitch
            - Ref: VSwitchId
          SecurityGroupId:
            Ref: EcsSecurityGroup
          ImageId: centos_7
          IoOptimized: optimized
          InstanceChargeType:
            Ref: PayType
          PeriodUnit:
            Ref: PayPeriodUnit
          Period:
            Ref: PayPeriod
          SystemDiskCategory:
            Ref: SystemDiskCategory
          # 系統硬碟大小可以根據需要調整
          SystemDiskSize:
            Ref: SystemDiskSize
          # 資料盤配置
          DiskMappings:
          - Category:
              Ref: DataDiskCategory
            Size:
              Ref: DataDiskSize
          MaxAmount: 1
          InstanceType:
            Ref: EcsInstanceType
          Password:
            Ref: InstancePassword
          # 公網頻寬, 為 0 代表不開公網
          InternetMaxBandwidthOut:
            Fn::If:
            - IfAllocatePublicIP
            - Ref: InternetMaxBandwidthOut
            - 0
          InstanceName:
            Fn::Join:
            - '-'
            - - Ref: ALIYUN::StackName
              - '[1,4]'
      WaitConditionHandle:
        Type: ALIYUN::ROS::WaitConditionHandle
        Properties: {}
      WaitCondition:
        Type: ALIYUN::ROS::WaitCondition
        Properties:
          Count: 1
          Handle:
            Ref: WaitConditionHandle
          # 等待命令執行完成的逾時時間
          Timeout: 300
      InstanceRunCommand:
        Type: ALIYUN::ECS::RunCommand
        Properties:
          InstanceIds:
            Fn::GetAtt:
            - EcsInstanceGroup
            - InstanceIds
          CommandContent:
            Fn::Sub:
            - |
              #!/bin/bash
              # 1. 如果使用了資料盤,需要對資料盤進行格式化,並掛載到指定目錄,這裡假定掛載到/data
              init_and_mount_data_disk() {
                local fs_type=$1
                local mount_point=$2
    
                # 找出磁碟裝置(排除分區)
                devices=(`lsblk -o NAME,FSTYPE --noheadings --nodeps | awk '$2 == "" {print $1}'`)
                # 找出不存在檔案系統的磁碟裝置
                for device in ${!devices[@]};
                do
                  lsblk -o NAME,FSTYPE --noheadings  | awk '$2 != "" {print $1}' | grep ${!device}
                  if [[ $? -eq 1 ]]; then
                    data_disk=${!device}
                    break
                  fi
                done
    
                # 為資料盤建立檔案系統
                mkfs -t ${!fs_type} /dev/${!data_disk}
    
                cp /etc/fstab /etc/fstab.bak
                mkdir ${!mount_point}
                # 更新/etc/fstab並掛載磁碟
                echo `blkid /dev/${!data_disk} | awk '{print $2}' | sed 's/\\\"//g'` ${!mount_point} ext4 defaults 0 0 >> /etc/fstab
                mount -a
              }
    
              # 掛盤到/data
              init_and_mount_data_disk ext4 /data
    
              # 2. 安裝軟體,或者對軟體進行初始化配置,比如將資料檔案目錄指定到資料盤目錄
              # yum install -y nginx
    
              # 3. 如果需要開機自啟動,請添加系統服務並啟用
              # systemctl enable nginx.service
    
              # 4. 配置啟動指令碼或者啟動系統服務
              # systemctl start nginx.service
    
              # 5. 執行成功回調WaitCondition結束waitCondition的等待
              ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
              # 指令碼裡任何地方如果發現執行失敗,使用以下命令返回FAILURE和錯誤資訊
              # ${CurlCli} -d "{\"Data\" : \"error message\", \"status\" : \"FAILURE\"}"
            - CurlCli:
                Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
          Type: RunShellScript
          # 按照命令執行時間設定逾時,單位是秒;命令執行逾時則部署失敗
          Timeout: 300
    # outputs是根據軟體需求定義
    # Outputs are defined according to software requirements
    # 以下是以nginx為例,輸出了網站公網訪問地址
    # The following is an example of nginx, which outputs the public network access address of the website
    #Outputs:
    #  endpoint:
    #    Condition: IfAllocatePublicIP
    #    Description:
    #      zh-cn: 對外暴露的公網IP地址
    #      en: Public IP Addresses
    #    Value:
    #      Fn::Sub:
    #        - http://${ServerAddress}
    #        - ServerAddress:
    #            Fn::Select:
    #              - 0
    #              - Fn::GetAtt:
    #                  - EcsInstanceGroup
    #                  - PublicIps
    Metadata:
      ALIYUN::ROS::Interface:
    ## 參數組的順序會確定使用者建立服務執行個體頁面的參數排列順序
    ## The order of the parameter groups determines the order in which the parameters are arranged on the user creation service instance page
    ## 如果絕大部分執行個體規格都適用,比如x86架構,可以按注釋中將可用性區域放在前面選擇
    ## If most of the instance specifications are applicable, such as the x86 architecture, you can select the availability zone in front of the note
    #    ParameterGroups:
    #      - Parameters:
    #          - ZoneId
    #        Label:
    #          default:
    #            zh-cn: 可用性區域配置
    #            en: Zone Configuration
    #      - Parameters:
    #          - WhetherCreateVpc
    #          - VpcCidrBlock
    #          - VSwitchCidrBlock
    #          - VpcId
    #          - VSwitchId
    #        Label:
    #          default:
    #            zh-cn: VPC配置
    #            en: VPC Configuration
    #      - Parameters:
    #          - PayType
    #          - PayPeriodUnit
    #          - PayPeriod
    #        Label:
    #          default:
    #            en: PayType Configuration
    #            zh-cn: 付費類型配置
    #      - Parameters:
    #          - EcsInstanceType
    #          - InstancePassword
    #          - SystemDiskCategory
    #          - SystemDiskSize
    #          - DataDiskCategory
    #          - DataDiskSize
    #          - AllocatePublicIP
    #          - InternetMaxBandwidthOut
    #        Label:
    #          default:
    #            en: Instance
    #            zh-cn: ECS執行個體配置
        ParameterGroups:
        - Parameters:
            - PayType
            - PayPeriodUnit
            - PayPeriod
          Label:
            default:
              en: PayType Configuration
              zh-cn: 付費類型配置
        - Parameters:
          - EcsInstanceType
          Label:
            default:
              zh-cn: ECS執行個體規格配置
              en: ECS Instance Type Configuration
        - Parameters:
          - ZoneId
          Label:
            default:
              zh-cn: 可用性區域配置
              en: Zone Configuration
        - Parameters:
          - WhetherCreateVpc
          - VpcCidrBlock
          - VSwitchCidrBlock
          - VpcId
          - VSwitchId
          Label:
            default:
              zh-cn: VPC配置
              en: VPC Configuration
        - Parameters:
          - InstancePassword
          - SystemDiskCategory
          - SystemDiskSize
          - DataDiskCategory
          - DataDiskSize
          - AllocatePublicIP
          - InternetMaxBandwidthOut
          Label:
            default:
              en: Instance
              zh-cn: ECS執行個體詳細配置
        TemplateTags:
        - acs:example:ISV軟體部署:單一實例自訂鏡像部署帶資料盤公網IP可選
    
  6. 單擊選擇部署物,在彈框中選擇部署物和版本,單擊確定完成ECS鏡像部署物替換。

    重要
    • 若選擇的部署物版本為draft版本時,由於該版本的ECS鏡像未分發,則ECS鏡像只在建立鏡像的地區可用。

    • 若選擇的部署物版本為正式版本時,ECS鏡像已分發,則ECS鏡像在建立地區和已分發的地區均可用。

    image

  7. 完成服務的建立,並測試通過後, 請根據計算巢服務的發布審核標準進行自檢,並提交審核。發布審核標準的詳細資料,請參見發布審核標準

  8. 審核通過後,上線服務。詳細步驟,請參見上線服務

    當建立服務執行個體後,鏡像ID自動替換為部署物對應分髮結果

    • 替換前:

      image

    • 替換後:

      image

相關文檔

  • 關於建立計算巢服務的詳細內容,請參見建立服務

  • 當您不再需要部署物或部署物版本時,可刪除該部署物或部署物版本,請參見刪除部署物

  • 當您需要變更部署物的分發地區、部署物內容等資訊時,可通過建立新版本來實現,請參見建立新版本

  • 設定部署物的升級配置,請參見服務升級配置