全部产品
Search
文档中心

CloudOps Orchestration Service:ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup

更新时间:Jun 28, 2025

Nama Template

ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup

Eksekusi Sekarang

Deskripsi Template

Memantau harga atau diskon dari instans preemptible di grup penskalaan yang ditentukan dan mengirimkan notifikasi peringatan jika harga atau diskon melebihi ambang batas tertentu.

Tipe Template

Otomatis

Pemilik

Alibaba Cloud

Parameter Input

Parameter

Deskripsi

Tipe

Diperlukan

Nilai Default

Batasan

scalingGroupId

ID grup penskalaan.

Daftar

Ya

threshold

Ambang batas diskon atau harga spot.

Angka

Ya

webhook

URL webhook chatbot DingTalk.

String

Ya

region

ID wilayah.

String

Tidak

{{ ACS::RegionId }}

taskType

Tipe pekerjaan pemantauan.

String

Tidak

Discount

rateControl

Pengaturan kontrol laju.

Json

Tidak

{'Mode': 'Concurrency', 'MaxErrors': 100, 'Concurrency': 10}

OOSAssumeRole

Peran Manajemen Akses Sumber Daya (RAM) yang diasumsikan oleh Layanan Orkestrasi CloudOps (OOS).

String

Tidak

OOSServiceRole

Parameter Output

Parameter

Deskripsi

Tipe

allThresholdInfo

Daftar

Kebijakan Izin yang Dibutuhkan untuk Menjalankan Template

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

Referensi

Untuk informasi lebih lanjut, lihat ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup.yml di GitHub.

Isi Template

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: deskripsi dalam bahasa Cina
  name-en: ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup
  name-zh-cn: deskripsi dalam bahasa Cina
Parameters:
  region:
    Type: String
    Label:
      en: RegionId
      zh-cn: deskripsi dalam bahasa Cina
    Description:
      en: The region id
      zh-cn: deskripsi dalam bahasa Cina
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  scalingGroupId:
    Description:
      en: The scaling group id
      zh-cn: deskripsi dalam bahasa Cina
    Label:
      en: ScalingGroupId
      zh-cn: deskripsi dalam bahasa Cina
    Type: List
  taskType:
    Description:
      en: The monitoring threshold task type (Discount: Monitor discount, Price: monitor price)
      zh-cn: deskripsi dalam bahasa Cina
    Label:
      en: TaskType
      zh-cn: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    Label:
      en: Threshold
      zh-cn: deskripsi dalam bahasa Cina
    Type: Number
  webhook:
    Label:
      en: Webhook
      zh-cn: deskripsi dalam bahasa Cina
    Description:
      en: example:https://oapi.dingtalk.com/robot/send?access_token=bac51db2e39418ec6c2dbb27fd111bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      zh-cn: deskripsi dalam bahasa Cina
    Type: String
  rateControl:
    Label:
      en: RateControl
      zh-cn: deskripsi dalam bahasa Cina
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 100
      Concurrency: 10
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: deskripsi dalam bahasa Cina
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: describeScalingGroups
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Describe the scaling groups
      zh-cn: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    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: deskripsi dalam bahasa Cina
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ webhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: Monitoring results
            text:
              'Fn::Join':
                - ''
                - 'Fn::ListJoin':
                    - |
                      ### The alert threshold (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 = "### 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':
            - |
              ### The alert threshold (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 = "### 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: deskripsi dalam bahasa Cina
            en: Configure Parameters
      - Parameters:
          - rateControl
          - OOSAssumeRole
        Label:
          default:
            zh-cn: deskripsi dalam bahasa Cina
            en: Control Options