全部產品
Search
文件中心

CloudOps Orchestration Service:ACS-ESS-RollingUpdateByDownloadFileAndRunCommand

更新時間:Sep 06, 2024

模板名稱

ACS-ESS-RollingUpdateByDownloadFileAndRunCommand 通過下載檔案並執行命令的方式變換伸縮組內的ECS執行個體

立即執行

模板描述

通過下載檔案並執行命令的方式變換伸縮組內的ECS執行個體

模板類型

自動化

所有者

Alibaba Cloud

輸入參數

參數名稱

描述

類型

是否必填

預設值

約束

invokeType

操作類型

String

scalingGroupId

伸縮組ID

String

invokeSourcePath

用於升級的檔案URL

String

invokeDestinationDir

用於升級的檔案儲存體目錄

String

rollbackSourcePath

用於復原的檔案URL

String

rollbackDestinationDir

用於復原的檔案儲存體目錄

String

enterProcess

執行開始要暫停伸縮組流程

List

['ScaleIn', 'ScaleOut', 'HealthCheck', 'AlarmNotification', 'ScheduledAction']

exitProcess

執行結束要恢複的伸縮組流程

List

['ScaleIn', 'ScaleOut', 'HealthCheck', 'AlarmNotification', 'ScheduledAction']

invokeScript

用於升級的指令碼

String

""

rollbackScript

用於復原的指令碼

String

""

sourceExecutionId

用於復原的OOS執行ID

String

""

whetherSaveToFile

是否將內容下載到特定檔案

Boolean

True

batchPauseOption

分批模式

String

Automatic

batchNumber

分批執行的批次

Number

5

OOSAssumeRole

OOS扮演的RAM角色

String

""

輸出參數

參數名稱

描述

類型

commandOutputs

List

執行此模板需要的權限原則

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ess:CreateLifecycleHook",
                "ess:DescribeLifecycleHooks",
                "ess:DescribeScalingInstances",
                "ess:ModifyLifecycleHook",
                "ess:ResumeProcesses",
                "ess:SuspendProcesses"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecs:DescribeInstances",
                "ecs:DescribeInvocationResults",
                "ecs:DescribeInvocations",
                "ecs:RunCommand",
                "ecs:TagResources"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "oos:ListExecutions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

詳情

ACS-ESS-RollingUpdateByDownloadFileAndRunCommand詳情

模板內容

FormatVersion: OOS-2019-06-01
Description:
  en: Rolling update ECS instances that in scaling group by download file and run command
  zh-cn: 通過下載檔案並執行命令的方式變換伸縮組內的ECS執行個體
  name-en: ACS-ESS-RollingUpdateByDownloadFileAndRunCommand
  name-zh-cn: 通過下載檔案並執行命令的方式變換伸縮組內的ECS執行個體
  categories:
    - elastic_manage
Parameters:
  invokeType:
    Label:
      en: InvokeType
      zh-cn: 操作類型
    Type: String
    AllowedValues:
      - invoke
      - rollback
  scalingGroupId:
    Label:
      en: ScalingGroupId
      zh-cn: 伸縮組ID
    Type: String
  enterProcess:
    Label:
      en: EnterProcess
      zh-cn: 執行開始要暫停伸縮組流程
    Type: List
    Default:
      - ScaleIn
      - ScaleOut
      - HealthCheck
      - AlarmNotification
      - ScheduledAction
  exitProcess:
    Label:
      en: ExitProcess
      zh-cn: 執行結束要恢複的伸縮組流程
    Type: List
    Default:
      - ScaleIn
      - ScaleOut
      - HealthCheck
      - AlarmNotification
      - ScheduledAction
  invokeSourcePath:
    Type: String
    Label:
      en: InvokeSourcePath
      zh-cn: 用於升級的檔案URL
  invokeDestinationDir:
    Label:
      en: InvokeDestinationDir
      zh-cn: 用於升級的檔案儲存體目錄
    Type: String
  invokeScript:
    Label:
      en: InvokeScript
      zh-cn: 用於升級的指令碼
    Type: String
    AssociationProperty: Code
    Default: ''
  rollbackSourcePath:
    Type: String
    Label:
      en: InvokeSourcePath
      zh-cn: 用於復原的檔案URL
  rollbackDestinationDir:
    Label:
      en: InvokeDestinationDir
      zh-cn: 用於復原的檔案儲存體目錄
    Type: String
  rollbackScript:
    Label:
      en: RollbackScript
      zh-cn: 用於復原的指令碼
    Type: String
    AssociationProperty: Code
    Default: ''
  sourceExecutionId:
    Label:
      en: SourceExecutionId
      zh-cn: 用於復原的OOS執行ID
    Type: String
    Default: ''
  whetherSaveToFile:
    Label:
      en: whetherSaveToFile
      zh-cn: 是否將內容下載到特定檔案
    Type: Boolean
    Default: true
  batchPauseOption:
    Label:
      en: BatchPauseOption
      zh-cn: 分批模式
    Type: String
    AllowedValues:
      - Automatic
      - FirstBatchPause
      - EveryBatchPause
    Default: Automatic
  batchNumber:
    Label:
      en: BatchNumber
      zh-cn: 分批執行的批次
    Type: Number
    MinValue: 1
    MaxValue: 100
    Default: 5
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: OOS扮演的RAM角色
    Type: String
    Default: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: getLifecycleHook
    Action: ACS::ExecuteAPI
    Description:
      en: Get lifecycle hook
      zh-cn: 擷取生命週期掛鈎
    Properties:
      Service: ESS
      API: DescribeLifecycleHooks
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        LifecycleHookName: ACS-ESS-LifeCycleDownloadFileAndRunCommand
    Outputs:
      totalCount:
        Type: String
        ValueSelector: .TotalCount
  - Name: choiceNextTask
    Action: 'ACS::Choice'
    Description:
      en: Choose next task by invoke type
      zh-cn: 根據升級類型選擇任務
    Properties:
      DefaultTask: getInstance
      Choices:
        - When:
            'Fn::Equals':
              - rollback
              - '{{ invokeType }}'
          NextTask: getExecutionInstanceIds
  - Name: getInstance
    Description:
      en: Views the ECS instances
      zh-cn: 擷取ECS執行個體
    Action: 'ACS::ExecuteApi'
    Properties:
      Service: ESS
      API: DescribeScalingInstances
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        LifecycleState: InService
        CreationTypes:
          - AutoCreated
          - Attached
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: 'ScalingInstances.ScalingInstance[].InstanceId'
  - Name: createLifecycleHookOfUpgrade
    When:
      Fn::Equals:
        - '{{ getLifecycleHook.totalCount }}'
        - 0
    Action: ACS::ExecuteAPI
    Description:
      en: Create lifecycle hook of upgrade
      zh-cn: 建立用於升級的生命週期掛鈎
    Properties:
      Service: ESS
      API: CreateLifecycleHook
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        NotificationMetadata: '{"sourcePath":"{{ invokeSourcePath }}","destinationDir":"{{ invokeDestinationDir }}","commandContent":"{{ invokeScript }}","timeout":"600","regionId":"${regionId}","instanceIds":"${instanceIds}","lifecycleHookId":"${lifecycleHookId}","lifecycleActionToken":"${lifecycleActionToken}","rateControl":"{\"Mode\":\"Concurrency\",\"MaxErrors\":0,\"Concurrency\":10}","OOSAssumeRole":"OOSServiceRole"}'
        LifecycleTransition: SCALE_OUT
        LifecycleHookName: ACS-ESS-LifeCycleDownloadFileAndRunCommand
        NotificationArn: acs:oos:{{ ACS::RegionId }}:{{ACS::AccountId}}:template/ACS-ESS-LifeCycleDownloadFileAndRunCommand
  - Name: modifyLifecycleHookOfUpgrade
    When:
      Fn::Equals:
        - '{{ getLifecycleHook.totalCount }}'
        - 1
    Action: ACS::ExecuteAPI
    Description:
      en: Modify lifecycle hook of upgrade
      zh-cn: 修改用於升級的生命週期掛鈎
    Properties:
      Service: ESS
      API: ModifyLifecycleHook
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        NotificationMetadata: '{"sourcePath":"{{ invokeSourcePath }}","destinationDir":"{{ invokeDestinationDir }}","commandContent":"{{ invokeScript }}","timeout":"600","regionId":"${regionId}","instanceIds":"${instanceIds}","lifecycleHookId":"${lifecycleHookId}","lifecycleActionToken":"${lifecycleActionToken}","rateControl":"{\"Mode\":\"Concurrency\",\"MaxErrors\":0,\"Concurrency\":10}","OOSAssumeRole":"OOSServiceRole"}'
        LifecycleTransition: SCALE_OUT
        LifecycleHookName: ACS-ESS-LifeCycleDownloadFileAndRunCommand
  - Name: whetherTheScalingGroupInstanceIsEmpty
    Action: 'ACS::Choice'
    Description:
      en: Check whether the instances in the services in the scaling group are empty
      zh-cn: 檢查伸縮組內服務中的執行個體是否為空白
    Properties:
      DefaultTask: whetherTosuspendProcess
      Choices:
        - When:
            'Fn::Equals':
              - [ ]
              - '{{ getInstance.instanceIds }}'
          NextTask: 'ACS::END'
  - Name: whetherTosuspendProcess
    Action: 'ACS::Choice'
    Description:
      en: Choose next task by process
      zh-cn: 根據流程值判斷是否暫停流程
    Properties:
      DefaultTask: suspendProcess
      Choices:
        - When:
            'Fn::Equals':
              - []
              - '{{ enterProcess }}'
          NextTask: invokeByDownloadFileAndRunCommand
  - Name: suspendProcess
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Suspend process
      zh-cn: 暫停伸縮組流程
    Properties:
      Service: ESS
      API: SuspendProcesses
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        Process: '{{ enterProcess }}'
  - Name: invokeByDownloadFileAndRunCommand
    Action: ACS::ESS::DownloadFileAndRunCommand
    Description:
      en: Upgrade by downloading files to the instance and executing commands
      zh-cn: 通過下載檔案到執行個體並執行命令的方式進行升級
    Properties:
      instanceId: '{{ ACS::TaskLoopItem }}'
      sourceType: 'https'
      sourcePath: '{{ invokeSourcePath }}'
      destinationDir: '{{ invokeDestinationDir }}'
      commandContent: '{{ invokeScript }}'
      whetherSaveToFile: '{{ whetherSaveToFile }}'
    Loop:
      Items: '{{ getInstance.instanceIds }}'
      BatchPauseOption: '{{ batchPauseOption }}'
      Concurrency:
        'Fn::CalculateBatch':
          - '{{ batchNumber }}'
          - '{{ getInstance.instanceIds }}'
      Outputs:
        commandOutputs:
          AggregateType: 'Fn::ListJoin'
          AggregateField: commandOutput
    Outputs:
      commandOutput:
        Type: String
        ValueSelector: runCommandOutput
  - Name: tagInstance
    Action: ACS::ExecuteApi
    Description:
      en: Creates and attaches tag to ECS instance
      zh-cn: 建立並掛載標籤到ECS執行個體
    Properties:
      Service: ECS
      API: TagResources
      Parameters:
        ResourceIds:
          - '{{ ACS::TaskLoopItem }}'
        ResourceType: Instance
        Tags:
        - Key: 'ess:rollingupdate'
          Value: 'oos:{{ ACS::ExecutionId }}'
    Loop:
      Items: '{{ getInstance.instanceIds }}'
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 10
  - Name: whetherToResumeProcesses
    Action: 'ACS::Choice'
    Description:
      en: Choose next task by process
      zh-cn: 根據流程值判斷是否恢複流程
    Properties:
      DefaultTask: resumeProcesses
      Choices:
        - When:
            'Fn::Equals':
              - []
              - '{{ exitProcess }}'
          NextTask: 'ACS::END'
  - Name: resumeProcesses
    Action: 'ACS::ExecuteAPI'
    OnSuccess: 'ACS::END'
    Description:
      en: Resume process
      zh-cn: 恢複伸縮組流程
    Properties:
      Service: ESS
      API: ResumeProcesses
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        Process: '{{ exitProcess }}'
  - Name: getExecutionInstanceIds
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Get the instance that has been executed
      zh-cn: 擷取已經執行過執行指令碼的執行個體
    Properties:
      Service: OOS
      API: ListExecutions
      Parameters:
        ParentExecutionId: '{{ sourceExecutionId }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: 'Executions[].Parameters.instanceId'
  - Name: getExistInstanceIds
    Description:
      en: Views the ECS instances
      zh-cn: 擷取ECS執行個體
    Action: ACS::SelectTargets
    Properties:
      ResourceType: ALIYUN::ECS::Instance
      Filters:
        - Type: ResourceIds
          ResourceIds: '{{ getExecutionInstanceIds.instanceIds }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: Instances.Instance[].InstanceId
  - Name: getRollbackProcess
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Views resource parameters
      zh-cn: 擷取源執行的參數
    Properties:
      Service: OOS
      API: ListExecutions
      Parameters:
        ExecutionId: '{{ sourceExecutionId }}'
    Outputs:
      enterProcess:
        Type: List
        ValueSelector: 'Executions[].Parameters.enterProcess[]'
      exitProcess:
        Type: List
        ValueSelector: 'Executions[].Parameters.exitProcess[]'
  - Name: suspendProcessWithRollBack
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Suspend process
      zh-cn: 暫停伸縮組流程
    Properties:
      Service: ESS
      API: SuspendProcesses
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        Process: '{{ getRollbackProcess.enterProcess }}'
  - Name: rollbackByDownloadFileAndRunCommand
    Action: ACS::ESS::DownloadFileAndRunCommand
    Description:
      en: Rollback by downloading files to the instance and executing commands
      zh-cn: 通過下載檔案到執行個體並執行命令的方式進行復原
    Properties:
      instanceId: '{{ ACS::TaskLoopItem }}'
      sourceType: 'https'
      sourcePath: '{{ rollbackSourcePath }}'
      destinationDir: '{{ rollbackDestinationDir }}'
      commandContent: '{{ rollbackScript }}'
      whetherSaveToFile: '{{ whetherSaveToFile }}'
    Loop:
      Items: '{{ getExistInstanceIds.instanceIds }}'
      BatchPauseOption: '{{ batchPauseOption }}'
      Concurrency:
        'Fn::CalculateBatch':
          - '{{ batchNumber }}'
          - '{{ getExistInstanceIds.instanceIds }}'
      Outputs:
        commandOutputs:
          AggregateType: 'Fn::ListJoin'
          AggregateField: commandOutput
    Outputs:
      commandOutput:
        Type: String
        ValueSelector: runCommandOutput
  - Name: modifyLifecycleHookOfRollback
    When:
      Fn::Equals:
        - '{{ getLifecycleHook.totalCount }}'
        - 1
    Action: ACS::ExecuteAPI
    Description:
      en: Modify lifecycle hook of rollback
      zh-cn: 修改用於復原的生命週期掛鈎
    Properties:
      Service: ESS
      API: ModifyLifecycleHook
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        NotificationMetadata: '{"sourcePath":"{{ rollbackSourcePath }}","destinationDir":"{{ rollbackDestinationDir }}","commandContent":"{{ rollbackScript }}","timeout":"600","regionId":"${regionId}","instanceIds":"${instanceIds}","lifecycleHookId":"${lifecycleHookId}","lifecycleActionToken":"${lifecycleActionToken}","rateControl":"{\"Mode\":\"Concurrency\",\"MaxErrors\":0,\"Concurrency\":10}","OOSAssumeRole":"OOSServiceRole"}'
        LifecycleTransition: SCALE_OUT
        LifecycleHookName: ACS-ESS-LifeCycleDownloadFileAndRunCommand
  - Name: whetherToResumeProcessesWithRollback
    Action: 'ACS::Choice'
    Description:
      en: Choose next task by process
      zh-cn: 根據流程值判斷是否恢複流程
    Properties:
      DefaultTask: resumeProcessesWithRollback
      Choices:
        - When:
            'Fn::Equals':
              - []
              - '{{ getRollbackProcess.exitProcess }}'
          NextTask: 'ACS::END'
  - Name: resumeProcessesWithRollback
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Resume process
      zh-cn: 恢複伸縮組流程
    Properties:
      Service: ESS
      API: ResumeProcesses
      Parameters:
        ScalingGroupId: '{{ scalingGroupId }}'
        Process: '{{ getRollbackProcess.exitProcess }}'
Outputs:
  commandOutputs:
    Type: List
    Value:
      'Fn::If':
        - 'Fn::Equals':
            - invoke
            - '{{ invokeType }}'
        - '{{ invokeByDownloadFileAndRunCommand.commandOutputs }}'
        - '{{ rollbackByDownloadFileAndRunCommand.commandOutputs }}'