全部產品
Search
文件中心

CloudOps Orchestration Service:ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup

更新時間:Sep 06, 2024

模板名稱

ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup 監控伸縮組內的搶佔式執行個體的價格與折扣超出閾值時警示

立即執行

模板描述

監控伸縮組內的搶佔式執行個體的折扣與價格,實際值超出閾值時發出警示通知

模板類型

自動化

所有者

Alibaba Cloud

輸入參數

參數名稱

描述

類型

是否必填

預設值

約束

scalingGroupId

伸縮組ID

List

threshold

價格/折扣閾值

Number

webhook

DingTalk接收資訊的地址

String

region

地區ID

String

{{ ACS::RegionId }}

taskType

監控任務類型

String

Discount

rateControl

任務執行的並發比率

Json

{‘Mode’: ‘Concurrency’, ‘MaxErrors’: 100, ‘Concurrency’: 10}

OOSAssumeRole

OOS扮演的RAM角色

String

OOSServiceRole

輸出參數

參數名稱

描述

類型

allThresholdInfo

List

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

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ess:DescribeScalingConfigurations",
                "ess:DescribeScalingGroups"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecs:DescribeSpotPriceHistory",
                "ecs:DescribeVSwitches"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

詳情

ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup詳情

模板內容

FormatVersion: OOS-2019-06-01
Description:
  en: 'Monitor the discounts and prices of spot instances in the scaling group, and send out alarm notifications if they exceed'
  zh-cn: 監控伸縮組內的搶佔式執行個體的折扣與價格,實際值超出閾值時發出警示通知
  name-en: ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup
  name-zh-cn: 監控伸縮組內的搶佔式執行個體的價格與折扣超出閾值時警示
Parameters:
  region:
    Type: String
    Label:
      en: RegionId
      zh-cn: 地區ID
    Description:
      en: The region id
      zh-cn: 地區
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  scalingGroupId:
    Description:
      en: The scaling group id
      zh-cn: Auto Scaling組的ID
    Label:
      en: ScalingGroupId
      zh-cn: 伸縮組ID
    Type: List
  taskType:
    Description:
      en: The monitoring threshold task type(Discount:Monitor discount, Price:monitor price)
      zh-cn: 監控閾值任務類型(Discount:折扣監控, Price:價格監控)
    Label:
      en: TaskType
      zh-cn: 監控任務類型
    Type: String
    Default: Discount
    AllowedValues:
      - Discount
      - Price
  threshold:
    Description:
      en: The discount/price threshold(example:10 is 1% off,50 is 50% off,Or directly enter the price threshold)
      zh-cn: 價格/折扣閾值(例:10為1折,50為5折,或者直接輸入價格的閾值)
    Label:
      en: Threshold
      zh-cn: 價格/折扣閾值
    Type: Number
  webhook:
    Label:
      en: Webhook
      zh-cn: DingTalk接收資訊的地址
    Description:
      en: example:https://oapi.dingtalk.com/robot/send?access_token=bac51db2e39418ec6c2dbb27fd111bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      zh-cn: 例:https://oapi.dingtalk.com/robot/send?access_token=bac51db2e39418ec6c2dbb27fd111bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Type: String
  rateControl:
    Label:
      en: RateControl
      zh-cn: 任務執行的並發比率
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 100
      Concurrency: 10
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: OOS扮演的RAM角色
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: describeScalingGroups
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Describe the scaling groups
      zh-cn: 查詢Auto Scaling組
    Properties:
      Service: ESS
      API: DescribeScalingGroups
      Parameters:
        RegionId: '{{ region }}'
        ScalingGroupId1: '{{ ACS::TaskLoopItem }}'
    Outputs:
      scalingGroupInfo:
        Type: Json
        ValueSelector: '.ScalingGroups.ScalingGroup[] | {"scalingConfigurationId":.ActiveScalingConfigurationId, "scalingGroupId":.ScalingGroupId, "vSwitchIds": .VSwitchIds.VSwitchId}'
    Loop:
      Items: '{{ scalingGroupId }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        scalingGroupInfos:
          AggregateType: 'Fn::ListJoin'
          AggregateField: scalingGroupInfo
  - Name: describeScalingConfigurations
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Describe the scaling configurations
      zh-cn: 查詢現有的伸縮配置
    Properties:
      Service: ESS
      API: DescribeScalingConfigurations
      Parameters:
        RegionId: '{{ region }}'
        ScalingConfigurationId1:
          'Fn::Jq':
            - First
            - .scalingConfigurationId
            - '{{ ACS::TaskLoopItem }}'
    Outputs:
      scalingConfigurationInfo:
        Type: Json
        ValueSelector: '.ScalingConfigurations.ScalingConfiguration[] | {"instanceTypes":.InstanceTypes.InstanceType, "scalingConfigurationId":.ScalingConfigurationId}'
    Loop:
      Items: '{{ describeScalingGroups.scalingGroupInfos }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        scalingConfigurationInfos:
          AggregateType: 'Fn::ListJoin'
          AggregateField: scalingConfigurationInfo
  - Name: describeVSwitches
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Describe the scaling configurations
      zh-cn: 查詢現有的伸縮配置
    Properties:
      Service: ECS
      API: DescribeVSwitches
      Parameters:
        RegionId: '{{ region }}'
        VSwitchId: '{{ ACS::TaskLoopItem }}'
    Outputs:
      zoneInfo:
        Type: Json
        ValueSelector: '.VSwitches.VSwitch[] | {"vSwitchId":.VSwitchId, "zoneId":.ZoneId}'
    Loop:
      Items:
        'Fn::MergeList':
          'Fn::Jq':
            - All
            - '.[].vSwitchIds'
            - '{{ describeScalingGroups.scalingGroupInfos }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        zoneInfos:
          AggregateType: 'Fn::ListJoin'
          AggregateField: zoneInfo
  - Name: wetherOutPutPriceInfo
    Action: 'ACS::Choice'
    Description:
      en: Detect if need to out price
      zh-cn: 檢測是否需要查詢價格
    Properties:
      DefaultTask: instanceThresholdInfo
      Choices:
        - When:
            'Fn::Equals':
              - []
              - 'Fn::MergeList': '{{ describeScalingGroups.scalingGroupInfos }}'
          NextTask: 'ACS::END'
  - Name: instanceThresholdInfo
    Action: 'ACS::ECS::AlarmSpotPriceOrDiscountThresholdByScalingGroup'
    Description:
      en: Monitor discounts or spot prices under the scaling groups
      zh-cn: 監控Auto Scaling組下的折扣或價格
    Properties:
      regionId: '{{region}}'
      threshold: '{{ threshold }}'
      taskType: '{{ taskType }}'
      vSwitchId:
        'Fn::Jq':
          - First
          - .vSwitchId
          - '{{ ACS::TaskLoopItem }}'
      scalingConfigurationId:
        'Fn::Jq':
          - First
          - .scalingConfigurationId
          - '{{ ACS::TaskLoopItem }}'
      configurationInfos: '{{ describeScalingConfigurations.scalingConfigurationInfos }}'
      scalingGroupId:
        'Fn::Jq':
          - First
          - .scalingGroupId
          - '{{ ACS::TaskLoopItem }}'
      zoneIds: '{{ describeVSwitches.zoneInfos }}'
    Outputs:
      thresholdInfo:
        Type: List
        ValueSelector: instanceThresholdInfos
    Loop:
      Items:
        'Fn::Jq':
          - All
          - '.[] | {scalingConfigurationId, scalingGroupId, "vSwitchId":.vSwitchIds[]}'
          - 'Fn::MergeList':
              'Fn::Jq':
                - First
                - '. | map(. as $item | [$item])'
                - '{{ describeScalingGroups.scalingGroupInfos }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        thresholdInfos:
          AggregateField: thresholdInfo
          AggregateType: 'Fn::ListJoin'
  - Name: wetherNodifyWebhook
    Action: 'ACS::Choice'
    Description:
      en: Detect if an alarm notification is required
      zh-cn: 檢測是否需要發警示通知
    Properties:
      DefaultTask: alarmNotify
      Choices:
        - When:
            'Fn::Equals':
              - []
              - 'Fn::MergeList':
                  'Fn::MergeList': '{{ instanceThresholdInfo.thresholdInfos }}'
          NextTask: 'ACS::END'
  - Name: alarmNotify
    Action: 'ACS::Notify'
    Description:
      en: Instance discount / spot price exceeds threshold alarm notification
      zh-cn: 執行個體的折扣/現價超出閾值警示通知
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ webhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: 監控結果(MonitoringResult)
            text:
              'Fn::Join':
                - ''
                - 'Fn::ListJoin':
                    - |
                      ### 警示閾值(alarm threshold):{{ threshold }}
                    - 'Fn::Jq':
                          - First
                          - '.[0] | split(", ") | join("") | split("||") | join("|") | split(",") | join("") | split("|###") | join("###")'
                          - 'Fn::Jq':
                              - All
                              - '.[] | map(.[] | tostring)| join(" |")'
                              - 'Fn::Jq':
                                  - All
                                  - 'map(. | .threshold=.threshold+" |\n\n,")'
                                  - 'Fn::Jq':
                                      - All
                                      - '.[] | .scalingGroupId = "### 伸縮組ID(scaling group ID):"+.scalingGroupId+"\n| 機型(instance type) |  可用性區域(zone)|現價(current price)|折扣%(discount%)|\n|:----|----:|:----:|:----|\n,"'
                                      - 'Fn::MergeList':
                                              'Fn::MergeList': '{{ instanceThresholdInfo.thresholdInfos }}'
Outputs:
  allThresholdInfo:
    Type: List
    Value:
      'Fn::Join':
        - ''
        - 'Fn::ListJoin':
            - |
              ### 警示閾值(alarm threshold):{{ threshold }}
            - 'Fn::Jq':
                  - First
                  - '.[0] | split(", ") | join("") | split("||") | join("|") | split(",") | join("") | split("|###") | join("###")'
                  - 'Fn::Jq':
                      - All
                      - '.[] | map(.[] | tostring)| join(" |")'
                      - 'Fn::Jq':
                          - All
                          - 'map(. | .threshold=.threshold+" |\n\n,")'
                          - 'Fn::Jq':
                              - All
                              - '.[] | .scalingGroupId = "### 伸縮組ID(scaling group ID):"+.scalingGroupId+"\n| 機型(instance type) |  可用性區域(zone)|現價(current price)|折扣%(discount%)|\n|:----|----:|:----:|:----|\n,"'
                              - 'Fn::MergeList':
                                      'Fn::MergeList': '{{ instanceThresholdInfo.thresholdInfos }}'
Metadata:
  ALIYUN::OOS::Interface:
    ParameterGroups:
      - Parameters:
          - region
          - scalingGroupId
          - taskType
          - threshold
          - webhook
        Label:
          default:
            zh-cn: 配置參數
            en: Configure Parameters
      - Parameters:
          - rateControl
          - OOSAssumeRole
        Label:
          default:
            zh-cn: 進階選項
            en: Control Options