All Products
Search
Document Center

CloudOps Orchestration Service:ACS-ECS-AlarmDiscountOrPriceInScalingGroupExistingInstanceTypes

Last Updated:Sep 20, 2024

Template name

ACS-ECS-AlarmDiscountOrPriceInScalingGroupExistingInstanceTypes

Execute Now

Template description

Monitors the price or discount of preemptible instances in the specified scaling groups and sends alert notifications if the price or discount exceeds the specified threshold.

Template type

Automated

Owner

Alibaba Cloud

Input parameters

Parameter

Description

Type

Required

Default value

Limit

scalingGroupId

The ID of the scaling group.

List

Yes

threshold

The price or discount threshold.

Number

Yes

webhook

The webhook URL of the DingTalk chatbot for receiving the alert notifications.

String

Yes

region

The region ID.

String

No

{{ ACS::RegionId }}

taskType

The type of the monitoring task.

String

No

Discount

rateControl

The rate control settings.

Json

No

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

OOSAssumeRole

The Resource Access Management (RAM) role that is assumed by CloudOps Orchestration Service (OOS).

String

No

OOSServiceRole

Output parameters

Parameter

Description

Type

allThresholdInfo

List

Permission policy that is required to execute the template

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

References

For more information, see ACS-ECS-AlarmDiscountOrPriceInScalingGroupExistingInstanceTypes.yml at GitHub.

Template content

FormatVersion: OOS-2019-06-01
Description:
  en: 'Monitor the discounts and prices of spot instances that currently exist in the scaling group, and send out alarm notifications if they exceed'
  zh-cn: the description in Chinese
  name-en: ACS-ECS-AlarmDiscountOrPriceInScalingGroupExistingInstanceTypes
  name-zh-cn: the description in Chinese
Parameters:
  region:
    Type: String
    Label:
      en: RegionId
      zh-cn: the description in Chinese
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  scalingGroupId:
    Description:
      en: ScalingGroupId
      zh-cn: the description in Chinese
    Label:
      en: scalingGroupId
      zh-cn: the description in Chinese
    Type: List
  taskType:
    Description:
      en: 'The monitoring threshold task type (Discount: Monitor discount, Price: monitor price).'
      zh-cn: the description in Chinese '
    Label:
      en: TaskType
      zh-cn: the description in Chinese
    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: the description in Chinese
    Label:
      en: Threshold
      zh-cn: the description in Chinese
    Type: Number
  webhook:
    Description:
      en: 'example:https://oapi.dingtalk.com/robot/send?access_token=bac51db2e39418ec6c2dbb27fd111bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.'
      zh-cn: the description in Chinese '
    Label:
      en: Webhook
      zh-cn: the description in Chinese
    Type: String
  rateControl:
    Label:
      en: RateControl
      zh-cn: the description in Chinese
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 100
      Concurrency: 10
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: the description in Chinese
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: describeScalingGroups
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Describe the scaling groups
      zh-cn: the description in Chinese
    Properties:
      Service: ESS
      API: DescribeScalingGroups
      Parameters:
        RegionId: '{{ region }}'
        ScalingGroupId1: '{{ ACS::TaskLoopItem }}'
    Outputs:
      scalingGroupInfo:
        Type: String
        ValueSelector: '.ScalingGroups.ScalingGroup[].ScalingGroupId'
    Loop:
      Items: '{{ scalingGroupId }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        scalingGroupInfos:
          AggregateType: 'Fn::ListJoin'
          AggregateField: scalingGroupInfo
  - Name: wetherOutPutPriceInfo
    Action: 'ACS::Choice'
    Description:
      en: Check if the scaling group exists
      zh-cn: the description in Chinese
    Properties:
      DefaultTask: scalingGroupMonitorInfos
      Choices:
        - When:
            'Fn::Equals':
              - []
              - 'Fn::MergeList': '{{ describeScalingGroups.scalingGroupInfos }}'
          NextTask: 'ACS::END'
  - Name: scalingGroupMonitorInfos
    Action: 'ACS::ECS::AlarmSpotPriceOrDiscountBySingleScalingGroup'
    Description:
      en: Monitor the discount or price of the instance type popped up under the scaling group
      zh-cn: the description in Chinese
    Properties:
      regionId: '{{region}}'
      threshold: '{{ threshold }}'
      taskType: '{{ taskType }}'
      scalingGroupId: '{{ ACS::TaskLoopItem }}'
    Outputs:
      monitorInfo:
        Type: String
        ValueSelector: singleMonitorInfo
    Loop:
      Items: '{{ scalingGroupId }}'
      RateControl: '{{ rateControl }}'
      Outputs:
        allMonitorInfo:
          AggregateField: monitorInfo
          AggregateType: 'Fn::ListJoin'
  - Name: wetherNodifyWebhook
    Action: 'ACS::Choice'
    Description:
      en: Detect if an alarm notification is required
      zh-cn: the description in Chinese
    Properties:
      DefaultTask: alarmNotify
      Choices:
        - When:
            'Fn::Equals':
              - []
              - 'Fn::MergeList':
                  - '{{ scalingGroupMonitorInfos.allMonitorInfo }}'
          NextTask: 'ACS::END'
  - Name: alarmNotify
    Action: 'ACS::Notify'
    Description:
      en: Instance discount / spot price exceeds threshold alarm notification
      zh-cn: the description in Chinese
    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: {{ threshold }}
                    - 'Fn::Jq':
                        - First
                        - . | join("\n\n")
                        - 'Fn::MergeList':
                            - '{{ scalingGroupMonitorInfos.allMonitorInfo }}'
Outputs:
  allThresholdInfo:
    Type: List
    Value:
        'Fn::Join':
          - ''
          - 'Fn::ListJoin':
              - |
                ### The alert threshold: {{ threshold }}
              - 'Fn::Jq':
                  - First
                  - . | join("\n\n")
                  - 'Fn::MergeList':
                      - '{{ scalingGroupMonitorInfos.allMonitorInfo }}'
Metadata:
  ALIYUN::OOS::Interface:
    ParameterGroups:
      - Parameters:
          - region
          - scalingGroupId
          - taskType
          - threshold
          - webhook
        Label:
          default:
            zh-cn: the description in Chinese
            en: Configure Parameters
      - Parameters:
          - rateControl
          - OOSAssumeRole
        Label:
          default:
            zh-cn: the description in Chinese
            en: Control Options