すべてのプロダクト
Search
ドキュメントセンター

CloudOps Orchestration Service:スケーリンググループ別に割引またはスポット価格がしきい値を超えた場合のアラート

最終更新日:Jan 17, 2025

テンプレート名

ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup

今すぐ実行

テンプレートの説明

指定されたスケーリンググループのプリエンプティブル インスタンスの価格または割引を監視し、価格または割引が指定されたしきい値を超えた場合にアラート通知を送信します。

テンプレートタイプ

自動化

所有者

Alibaba Cloud

入力パラメーター

パラメーター

説明

タイプ

必須

デフォルト値

制限

scalingGroupId

スケーリンググループの ID です。

リスト

はい

threshold

割引またはスポット価格のしきい値です。

数値

はい

webhook

DingTalk チャットボットの Webhook URL です。

文字列

はい

region

リージョン ID です。

文字列

いいえ

{{ ACS::RegionId }}

taskType

監視ジョブのタイプです。

文字列

いいえ

割引

rateControl

レート制御設定です。

JSON

いいえ

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

OOSAssumeRole

CloudOps Orchestration Service (OOS) がアシュームする Resource Access Management (RAM) ロールです。

文字列

いいえ

OOSServiceRole

出力パラメーター

パラメーター

説明

タイプ

allThresholdInfo

リスト

テンプレートを実行するために必要な権限ポリシー

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

参照

詳細については、GitHub の ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup.yml をご参照ください。

テンプレートコンテンツ

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: the description in Chinese
  name-en: ACS-ECS-AlarmWhenDiscountOrSpotPriceExceedsThresholdByScalingGroup
  name-zh-cn: the description in Chinese
Parameters:
  region:
    Type: String
    Label:
      en: RegionId
      zh-cn: the description in Chinese
    Description:
      en: The region id
      zh-cn: the description in Chinese
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  scalingGroupId:
    Description:
      en: The scaling group id
      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:
    Label:
      en: Webhook
      zh-cn: the description in Chinese
    Description:
      en: example:https://oapi.dingtalk.com/robot/send?access_token=bac51db2e39418ec6c2dbb27fd111bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      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: スケーリンググループを記述する
      ja: スケーリンググループを記述する
    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: スケーリング構成を記述する
      ja: スケーリング構成を記述する
    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: スケーリング構成を記述する
      ja: 仮想スイッチを記述する
    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: 価格を出力する必要があるかどうかを検出する
      ja: 価格を出力する必要があるかどうかを検出する
    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: スケーリンググループの割引またはスポット価格を監視する
      ja: スケーリンググループの割引またはスポット価格を監視する
    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: アラーム通知が必要かどうかを検出する
      ja: アラーム通知が必要かどうかを検出する
    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: インスタンスの割引/スポット価格がしきい値を超えた場合のアラーム通知
      ja: インスタンスの割引/スポット価格がしきい値を超えた場合のアラーム通知
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ webhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: 監視結果
            text:
              'Fn::Join':
                - ''
                - 'Fn::ListJoin':
                    - |\n\n### アラートしきい値 (アラームしきい値):{{ 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:"+.scalingGroupId+"\n| インスタンスタイプ |  ゾーン|現在の価格|割引|\n|:----|----:|:----:|:----|\n,"'
                                      - 'Fn::MergeList':
                                              'Fn::MergeList': '{{ instanceThresholdInfo.thresholdInfos }}'
Outputs:
  allThresholdInfo:
    Type: List
    Value:
      'Fn::Join':
        - ''
        - 'Fn::ListJoin':
            - |\n\n### アラートしきい値 (アラームしきい値):{{ 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:"+.scalingGroupId+"\n| インスタンスタイプ |  ゾーン|現在の価格|割引|\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
            ja: パラメーターを構成する
      - Parameters:
          - rateControl
          - OOSAssumeRole
        Label:
          default:
            zh-cn: 制御オプション
            en: Control Options
            ja: 制御オプション