ECS镜像部署物

计算巢通过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

    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: 专有网络VPC实例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

相关文档

  • 关于创建计算巢服务的详细内容,请参见创建服务

  • 当您不再需要部署物或部署物版本时,可删除该部署物或部署物版本,请参见删除部署物

  • 当您需要变更部署物的分发地域、部署物内容等信息时,可通过创建新版本来实现,请参见创建新版本

  • 设置部署物的升级配置,请参见服务升级配置