ACS-ECS-UpdateAndCopyImage

模板名称

ACS-ECS-UpdateAndCopyImage 更新ECS镜像并同步到其它地域

立即执行

模板描述

通过运行命令更新一个已存在的ECS镜像后创建一个新ECS镜像并且克隆新镜像到其他地域

模板类型

自动化

所有者

Alibaba Cloud

输入参数

参数名称

描述

类型

是否必填

默认值

约束

sourceImageId

源镜像ID

String

regionId

地域ID

String

{{ ACS::RegionId }}

zoneId

交换机可用区

String

“”

targetImageName

新镜像的名称

String

UpdateImage_from_{{sourceImageId}}on{{ACS::ExecutionId}}

instanceType

实例类型

String

ecs.g5.large

字符串校验正则表达式 : ecs.[A-Za-z0-9.-]*

whetherCreateVpc

是否新建VPC

Boolean

False

vpcCidrBlock

专有网络IPv4网段

String

192.168.0.0/16

vSwitchCidrBlock

交换机子网网段

String

192.168.1.0/24

securityGroupId

安全组ID

String

“”

vSwitchId

交换机ID

String

“”

internetMaxBandwidthOut

流量公网带宽

Number

0

ramRoleName

实例的RAM角色

String

“”

systemDiskCategory

系统盘的云盘种类

String

cloud_essd

tags

镜像标签

Json

[]

commandType

云助手命令类型

String

RunShellScript

commandContent

在ECS实例中执行的云助手命令

String

echo hello

timeout

超时时间

Number

600

targetRegionIds

目标地域ID

List

[]

accountIds

授权共享镜像的阿里云账号ID

List

[]

scalingConfigurationIds

待修改的伸缩配置ID

List

[]

launchTemplateNames

待更新的实例启动模板名称列表

List

[]

rateControl

任务执行的并发比率

Json

{‘Mode’: ‘Concurrency’, ‘MaxErrors’: 0, ‘Concurrency’: 5}

OOSAssumeRole

OOS扮演的RAM角色

String

“”

输出参数

参数名称

描述

类型

updatedImageId

String

imageIdAndRegion

List

执行此模板需要的权限策略

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ros:CreateStack",
                "ros:DeleteStack",
                "ros:GetStack"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecs:CopyImage",
                "ecs:CreateImage",
                "ecs:CreateLaunchTemplateVersion",
                "ecs:DeleteInstance",
                "ecs:DeleteLaunchTemplateVersion",
                "ecs:DescribeCloudAssistantStatus",
                "ecs:DescribeImages",
                "ecs:DescribeInstances",
                "ecs:DescribeInvocationResults",
                "ecs:DescribeInvocations",
                "ecs:DescribeLaunchTemplateVersions",
                "ecs:DescribeLaunchTemplates",
                "ecs:DescribeRegions",
                "ecs:InstallCloudAssistant",
                "ecs:ModifyImageSharePermission",
                "ecs:ModifyLaunchTemplateDefaultVersion",
                "ecs:RebootInstance",
                "ecs:RunCommand",
                "ecs:RunInstances",
                "ecs:StopInstance"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ess:ModifyScalingConfiguration"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

详情

ACS-ECS-UpdateAndCopyImage详情

模板内容

FormatVersion: OOS-2019-06-01
Description:
  name-en: ACS-ECS-UpdateAndCopyImage
  name-zh-cn: 更新ECS镜像并同步到其它地域
  en: Updates an existing ECS image via ECS Cloud Assistant then creates an ECS image and copy new image
  zh-cn: 通过运行命令更新一个已存在的ECS镜像后创建一个新ECS镜像并且克隆新镜像到其他地域
  categories:
    - image_manage
Parameters:
  regionId:
    Type: String
    Label:
      en: RegionId
      zh-cn: 地域ID
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  zoneId:
    Type: String
    Label:
      en: VSwitch Availability Zone
      zh-cn: 交换机可用区
    Default: ''
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    AssociationPropertyMetadata:
      RegionId: regionId
  targetImageName:
    Label:
      en: TargetImageName
      zh-cn: 新镜像的名称
    Type: String
    Description:
      en: <p class="p">Note:</p> <ul class="ul"> <li class="li">Length is 2~128 English or Chinese characters</li> <li class="li"><font color='red'>must start with big or small letters or Chinese, not http:// and https://. </font></li> <li class="li">Can contain numbers, colons (:), underscores (_), or dashes (-). </li> </ul>
      zh-cn: <p class="p">注意:</p> <ul class="ul"> <li class="li">长度为2~128个英文或中文字符</li> <li class="li"><font color='red'>必须以大小字母或中文开头,不能以http://和https://开头。</font></li> <li class="li">可以包含数字、半角冒号(:)、下划线(_)或者短划线(-)。</li> </ul>
    Default: 'UpdateImage_from_{{sourceImageId}}_on_{{ACS::ExecutionId}}'
  sourceImageId:
    Label:
      en: SourceImageId
      zh-cn: 源镜像ID
    Type: String
    AssociationProperty: 'ALIYUN::ECS::Image::ImageId'
    AssociationPropertyMetadata:
      RegionId: regionId
  instanceType:
    Label:
      en: InstanceType
      zh-cn: 实例类型
    Type: String
    AssociationProperty: 'ALIYUN::ECS::Instance::InstanceType'
    AssociationPropertyMetadata:
      RegionId: regionId
      ZoneId: zoneId
    AllowedPattern: ecs\.[A-Za-z0-9\.\-]*
    Default: 'ecs.g5.large'
  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>'
    Default: 192.168.0.0/16
    AssociationProperty: ALIYUN::VPC::VPC::CidrBlock
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Equals:
            - ${whetherCreateVpc}
            - true
  vSwitchCidrBlock:
    Type: String
    Label:
      en: VSwitch CIDR Block
      zh-cn: 交换机子网网段
    Description:
      zh-cn: 必须属于VPC的子网段
      en: Must belong to the subnet segment of VPC
    Default: 192.168.1.0/24
    AssociationProperty: ALIYUN::VPC::VSwitch::CidrBlock
    AssociationPropertyMetadata:
      VpcCidrBlock: vpcCidrBlock
      Visible:
        Condition:
          Fn::Equals:
            - ${whetherCreateVpc}
            - true
  securityGroupId:
    Label:
      en: SecurityGroupId
      zh-cn: 安全组ID
    Type: String
    Default: ''
    AssociationProperty: 'ALIYUN::ECS::SecurityGroup::SecurityGroupId'
    AssociationPropertyMetadata:
      RegionId: regionId
      Visible:
        Condition:
          Fn::Equals:
            - ${whetherCreateVpc}
            - false
  vSwitchId:
    Label:
      en: VSwitchId
      zh-cn: 交换机ID
    Type: String
    Default: ''
    AssociationProperty: 'ALIYUN::VPC::VSwitch::VSwitchId'
    AssociationPropertyMetadata:
      RegionId: regionId
      ZoneId: zoneId
      Filters:
        - SecurityGroupId: securityGroupId
      Visible:
        Condition:
          Fn::Equals:
            - ${whetherCreateVpc}
            - false
  internetMaxBandwidthOut:
    Type: Number
    Label:
      zh-cn: 流量公网带宽
      en: Internet Max Bandwidth Out
    Description:
      zh-cn: 取值范围0-100, 0为不开公网ip
      en: no public ip if zero
    Default: 0
    MinValue: 0
    MaxValue: 100
  ramRoleName:
    Label:
      en: RamRoleName
      zh-cn: 实例的RAM角色
    Type: String
    AssociationProperty: ALIYUN::ECS::RAM::Role
    Default: ''
  systemDiskCategory:
    Label:
      en: SystemDiskCategory
      zh-cn: 系统盘的云盘种类
    Type: String
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      RegionId: regionId
      InstanceType: instanceType
    Default: cloud_essd
  tags:
    Label:
      en: Tags
      zh-cn: 镜像标签
    Type: Json
    AssociationProperty: Tags
    AssociationPropertyMetadata:
      ShowSystem: false
    Default: []
  commandType:
    Label:
      en: CommandType
      zh-cn: 云助手命令类型
    Type: String
    AllowedValues:
      - RunBatScript
      - RunPowerShellScript
      - RunShellScript
    Default: RunShellScript
  commandContent:
    Label:
      en: CommandContent
      zh-cn: 在ECS实例中执行的云助手命令
    Type: String
    AssociationProperty: Code
    Default: 'echo hello'
  timeout:
    Label:
      en: Timeout
      zh-cn: 超时时间
    Type: Number
    Default: 600
  targetRegionIds:
    Label:
      en: TargetRegionIds
      zh-cn: 目标地域ID
    Type: List
    AllowedValues:
      - all-regions
      - cn-beijing
      - cn-qingdao
      - cn-zhangjiakou
      - cn-huhehaote
      - cn-hangzhou
      - cn-shanghai
      - cn-shenzhen
      - cn-chengdu
      - cn-hongkong
      - cn-heyuan
      - cn-wulanchabu
      - ap-northeast-1
      - ap-southeast-1
      - ap-southeast-2
      - ap-southeast-3
      - ap-southeast-5
      - ap-south-1
      - us-east-1
      - us-west-1
      - eu-west-1
      - me-east-1
      - eu-central-1
    Default: []
  accountIds:
    Label:
      en: AccountIds
      zh-cn: 授权共享镜像的阿里云账号ID
    Type: List
    Default: []
  scalingConfigurationIds:
    Description:
      en: <font color='red'><b>Must correspond to the selected region</b></font>
      zh-cn: <font color='red'><b>必须要在所选的地域</b></font>
    Label:
      en: ScalingConfigurationIds
      zh-cn: 待修改的伸缩配置ID
    Type: List
    Default: []
  launchTemplateNames:
    Description:
      en: <font color='red'><b>Must correspond to the selected region</b></font>
      zh-cn: <font color='red'><b>必须要在所选的地域</b></font>
    Label:
      en: LaunchTemplateNames
      zh-cn: 待更新的实例启动模板名称列表
    Type: List
    Default: []
  rateControl:
    Label:
      en: RateControl
      zh-cn: 任务执行的并发比率
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 5
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: OOS扮演的RAM角色
    Type: String
    Default: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: createStack
  Action: 'ACS::ExecuteAPI'
  When:
    Fn::Equals:
      - '{{ whetherCreateVpc }}'
      - true
  Description:
    en: Create a resource stack
    zh-cn: 创建资源栈
  Properties:
    Service: ROS
    API: CreateStack
    Parameters:
      RegionId: '{{ regionId  }}'
      StackName: 'OOS-{{ACS::ExecutionId}}'
      TimeoutInMinutes: 10
      DisableRollback: false
      Parameters:
        - ParameterKey: ZoneId
          ParameterValue: '{{ zoneId }}'
        - ParameterKey: VpcCidrBlock
          ParameterValue: '{{ vpcCidrBlock  }}'
        - ParameterKey: VSwitchCidrBlock
          ParameterValue: '{{ vSwitchCidrBlock  }}'
      TemplateBody: |
        ROSTemplateFormatVersion: '2015-09-01'
        Parameters:
          ZoneId:
            Type: String
          VpcCidrBlock:
            Type: String
          VSwitchCidrBlock:
            Type: String
        Resources:
          EcsVpc:
            Type: ALIYUN::ECS::VPC
            Properties:
              CidrBlock:
                Ref: VpcCidrBlock
              VpcName:
                Ref: ALIYUN::StackName
          EcsVSwitch:
            Type: ALIYUN::ECS::VSwitch
            Properties:
              ZoneId:
                Ref: ZoneId
              VpcId:
                Ref: EcsVpc
              CidrBlock:
                Ref: VSwitchCidrBlock
          EcsSecurityGroup:
            Type: ALIYUN::ECS::SecurityGroup
            Properties:
              VpcId:
                Ref: EcsVpc
        Outputs:
          SecurityGroupId:
            Value:
              Ref: EcsSecurityGroup
          VSwitchId:
            Value:
              Ref: EcsVSwitch
  Outputs:
    StackId:
      Type: String
      ValueSelector: StackId
- Name: untilStackReady
  Action: 'ACS::WaitFor'
  When:
    Fn::Equals:
      - '{{ whetherCreateVpc }}'
      - true
  Description:
    en: Wait for the stack status CREATE_COMPLETE
    zh-cn: 等待资源栈至创建成功状态
  OnError: deleteStack
  Properties:
    Service: ROS
    API: GetStack
    Parameters:
      RegionId: '{{ regionId  }}'
      StackId: '{{createStack.StackId}}'
    DesiredValues:
      - CREATE_COMPLETE
    StopRetryValues:
      - CREATE_FAILED
      - CHECK_FAILED
      - ROLLBACK_FAILED
      - ROLLBACK_COMPLETE
      - CREATE_ROLLBACK_COMPLETE
    PropertySelector: Status
  Outputs:
    securityGroupId:
      Type: String
      ValueSelector: 'Outputs[0].OutputValue'
    vSwitchId:
      Type: String
      ValueSelector: 'Outputs[1].OutputValue'
- Name: runInstances
  Action: ACS::ECS::RunInstances
  Description:
    en: Create a ECS instance with source image
    zh-cn: 用源镜像创建一台ECS实例
  OnError: deleteStack
  Properties:
    regionId: '{{ regionId }}'
    imageId: '{{ sourceImageId }}'
    instanceType: '{{ instanceType }}'
    securityGroupId:
      Fn::If:
        - Fn::Equals:
            - '{{ whetherCreateVpc }}'
            - true
        - '{{ untilStackReady.securityGroupId }}'
        - '{{ securityGroupId }}'
    vSwitchId:
      Fn::If:
        - Fn::Equals:
            - '{{ whetherCreateVpc }}'
            - true
        - '{{ untilStackReady.vSwitchId }}'
        - '{{ vSwitchId }}'
    internetMaxBandwidthOut: '{{ internetMaxBandwidthOut }}'
    ramRoleName: '{{ ramRoleName }}'
    systemDiskCategory: '{{ systemDiskCategory }}'
  Outputs:
    instanceId:
      ValueSelector: instanceIds[0]
      Type: String
- Name: installCloudAssistant
  Action: ACS::ECS::InstallCloudAssistant
  Description:
    en: Install cloud assistant for ECS instance
    zh-cn: 给实例安装云助手
  OnError: deleteInstance
  Properties:
    regionId: '{{ regionId }}'
    instanceId: '{{ runInstances.instanceId }}'
- Name: runCommand
  Action: ACS::ECS::RunCommand
  Description:
    en: Run cloud assistant command on ECS instance
    zh-cn: 在实例中运行云助手命令
  OnError: deleteInstance
  Properties:
    regionId: '{{ regionId }}'
    commandContent: '{{ commandContent }}'
    commandType: '{{ commandType }}'
    instanceId: '{{ runInstances.instanceId }}'
    timeout: '{{ timeout }}'
- Name: stopInstance
  Action: ACS::ECS::StopInstance
  Description:
    en: Stops the ECS instance
    zh-cn: 停止ECS实例
  Properties:
    regionId: '{{ regionId }}'
    instanceId: '{{ runInstances.instanceId }}'
- Name: createImage
  Action: ACS::ECS::CreateImage
  Description:
    en: Create new image with the specified image name and instance ID
    zh-cn: 通过指定实例ID和镜像名称创建新的镜像
  OnError: deleteInstance
  Properties:
    regionId: '{{ regionId }}'
    tags: '{{tags}}'
    imageName: '{{ targetImageName }}-{{ ACS::CurrentUTCTime }}'
    instanceId: '{{ runInstances.instanceId }}'
  Outputs:
    imageId:
      ValueSelector: imageId
      Type: String
- Name: deleteInstanceAfterUpdateImageSuccessfully
  Action: ACS::ExecuteAPI
  Description:
    en: Release the instance after updating the image successfully
    zh-cn: 删除ECS实例
  Properties:
    Service: ECS
    API: DeleteInstance
    Risk: Normal
    Parameters:
      RegionId: '{{ regionId }}'
      InstanceId: '{{ runInstances.instanceId }}'
      Force: true
- Name: deleteStack
  Action: 'ACS::ExecuteApi'
  When:
    Fn::Equals:
      - '{{ whetherCreateVpc }}'
      - true
  Description:
    en: Delete the stack
    zh-cn: 删除资源栈
  Properties:
    Service: ROS
    API: DeleteStack
    Parameters:
      RegionId: '{{ regionId  }}'
      StackId: '{{ createStack.StackId }}'
- Name: queryAllAvailableRegions
  Action: 'ACS::ExecuteAPI'
  Description:
    en: View all available regions
    zh-cn: 查询当前所有可用地域
  Properties:
    Service: ECS
    API: DescribeRegions
    Parameters:
      RegionId: '{{ regionId }}'
  Outputs:
    regionIds:
      Type: List
      ValueSelector: >-
        Regions.Region[]|.RegionId|select([scan("{{regionId}}|test")]|length<1)
    allRegionsChosen:
      Type: String
      ValueSelector: '.|{{targetRegionIds}}|sort|.[0]'
- Name: whetherCloneToAllRegions
  Action: 'ACS::Choice'
  Description:
    en: Choose next task by targetRegionIds Chosen
    zh-cn: 根据所选目的地域判断下一步执行
  Properties:
    DefaultTask: copyImage
    Choices:
      - When:
          'Fn::Equals':
            - all-regions
            - '{{ queryAllAvailableRegions.allRegionsChosen }}'
        NextTask: copyImageToAllRegions
- Name: copyImage
  Action: 'ACS::ECS::CopyImage'
  OnSuccess: whetherToShareImage
  OnError: 'ACS::END'
  Description:
    en: Copy image to regions chosen
    zh-cn: 复制镜像到被指定的地域
  Properties:
    regionId: '{{ regionId }}'
    imageId: '{{ createImage.imageId }}'
    targetRegionId: '{{ ACS::TaskLoopItem }}'
    targetImageName: '{{ targetImageName }}-{{ ACS::CurrentUTCTime }}'
  Loop:
    Items: '{{ targetRegionIds }}'
    RateControl: '{{ rateControl }}'
    Outputs:
      imageIdsWithRegion:
        AggregateType: 'Fn::ListJoin'
        AggregateField: imageIdWithRegion
  Outputs:
    imageIdWithRegion:
      ValueSelector: '.|(.imageId),"{{ ACS::TaskLoopItem }}"'
      Type: List
- Name: copyImageToAllRegions
  Action: 'ACS::ECS::CopyImage'
  Description:
    en: Copy image to all available regions
    zh-cn: 复制镜像到所有可用地域
  Properties:
    regionId: '{{ regionId }}'
    imageId: '{{ createImage.imageId }}'
    targetRegionId: '{{ ACS::TaskLoopItem }}'
    targetImageName: '{{ targetImageName }}-{{ ACS::CurrentUTCTime }}'
  Loop:
    Items: '{{ queryAllAvailableRegions.regionIds }}'
    RateControl: '{{ rateControl }}'
    Outputs:
      imageIdsWithRegion:
        AggregateType: 'Fn::ListJoin'
        AggregateField: imageIdWithRegion
  Outputs:
    imageIdWithRegion:
      ValueSelector: '.|(.imageId),"{{ ACS::TaskLoopItem }}"'
      Type: List
- Name: whetherToShareImage
  Action: 'ACS::Choice'
  Description:
    en: Choose next task by accountIds
    zh-cn: 根据输入账户值判断下一步执行
  Properties:
    DefaultTask: shareImage
    Choices:
      - When:
          'Fn::Equals':
            - []
            - '{{ accountIds }}'
        NextTask: modifyScalingConfiguration
- Name: shareImage
  Action: 'ACS::ExecuteAPI'
  Description:
    en: Shares a custom image to other Alibaba Cloud accounts
    zh-cn: 共享自定义镜像到其他阿里云账号
  Properties:
    Service: ECS
    API: ModifyImageSharePermission
    Parameters:
      RegionId: '{{ regionId }}'
      ImageId: '{{ createImage.imageId }}'
      AddAccount: '{{ accountIds }}'
- Name: modifyScalingConfiguration
  Action: 'ACS::ExecuteAPI'
  OnError: ACS::NEXT
  Description:
    en: Modify scaling configuration
    zh-cn: 修改伸缩配置
  Properties:
    Service: ESS
    API: ModifyScalingConfiguration
    Parameters:
      RegionId: '{{ regionId }}'
      ScalingConfigurationId: '{{ ACS::TaskLoopItem }}'
      ImageId: '{{ createImage.imageId }}'
  Loop:
    Items: '{{ scalingConfigurationIds }}'
- Name: updateLaunchTemplate
  Action: 'ACS::ECS::UpdateLaunchTemplate'
  OnSuccess: ACS::END
  Description:
    en: Update instance launch template
    zh-cn: 更新实例启动模板
  Properties:
    regionId: '{{ ACS::RegionId }}'
    imageId: '{{ createImage.imageId }}'
    launchTemplateName: '{{ ACS::TaskLoopItem }}'
  Loop:
    Items: '{{ launchTemplateNames }}'
- Name: deleteInstance
  Action: ACS::ExecuteAPI
  Description:
    en: Deletes the ECS instance after updating the image failure
    zh-cn: 删除ECS实例
  Properties:
    Service: ECS
    API: DeleteInstance
    Risk: Normal
    Parameters:
      RegionId: '{{ regionId }}'
      InstanceId: '{{ runInstances.instanceId }}'
      Force: true
Outputs:
  updatedImageId:
    Type: String
    Value: '{{ createImage.imageId }}'
  imageIdAndRegion:
    Type: List
    Value:
      'Fn::If':
        - 'Fn::Equals':
            - all-regions
            - '{{ queryAllAvailableRegions.allRegionsChosen }}'
        - '{{ copyImageToAllRegions.imageIdsWithRegion }}'
        - '{{ copyImage.imageIdsWithRegion }}'
Metadata:
  ALIYUN::OOS::Interface:
    ParameterGroups:
      - Parameters:
          - regionId
          - zoneId
          - sourceImageId
        Label:
          default:
            zh-cn: 选择源镜像
            en: Select Origin Image
      - Parameters:
          - targetImageName
          - tags
        Label:
          default:
            zh-cn: 镜像设置
            en: Image Configure
      - Parameters:
          - instanceType
          - whetherCreateVpc
          - vpcCidrBlock
          - vSwitchCidrBlock
          - securityGroupId
          - vSwitchId
          - internetMaxBandwidthOut
          - systemDiskCategory
          - ramRoleName
        Label:
          default:
            zh-cn: 配置中转实例
            en: ECS Instance Configure
      - Parameters:
          - commandType
          - commandContent
          - timeout
        Label:
          default:
            zh-cn: 发送远程命令
            en: Run Command
      - Parameters:
          - targetRegionIds
          - accountIds
        Label:
          default:
            zh-cn: 镜像分发
            en: Copy Image
      - Parameters:
          - scalingConfigurationIds
          - launchTemplateNames
          - rateControl
          - OOSAssumeRole
        Label:
          default:
            zh-cn: 高级选项
            en: Control Options