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

CloudOps Orchestration Service:ACS-ESS-AdjustScalingGroupInstanceCount

最終更新日:Jan 17, 2025

テンプレート名

ACS-ESS-AdjustScalingGroupInstanceCount

今すぐ実行

テンプレートの説明

スケーリングルールを作成および実行することにより、スケーリンググループのインスタンス数を調整します。注:

  • スケーリンググループが予想インスタンス数で構成されている場合、スケーリンググループのインスタンス数が予想インスタンス数と異なる場合、Auto Scaling は自動的にスケーリンググループにインスタンスを追加または削除し、スケーリンググループのインスタンス数が予想インスタンス数と等しくなるようにします。テンプレートを実行した後、Auto Scaling コンソールでスケーリング結果を確認してください。

  • スケールイン後の Container Service for Kubernetes (ACK) クラスタのノード数は、コンポーネントに必要な最小ノード数より小さくすることはできません。そうでない場合、IncorrectCapacity エラーコードが返されます。

  • テンプレートを実行する前に、アカウントの残高が新しいインスタンスの購入費用よりも大きいことを確認してください。そうでない場合、InvalidAccountStatus.NotEnoughBalance エラーコードが返されます。

  • 複数ゾーンにデプロイされているスケーリンググループをスケールアウトするには、次の式を使用して AdjustmentCount パラメータの値を計算します。ゾーンごとに追加するインスタンス数 × ゾーン数。

  • スケールアウト後に追加される Elastic Compute Service (ECS) インスタンスは、従量課金制で課金されます。ビジネス要件に基づいて、課金方法をサブスクリプションに変更できます。詳細については、「インスタンスの課金方法を従量課金からサブスクリプションに変更する」をご参照ください。

  • 次のいずれかのスケールイン方法を使用できます。 パラメータを構成して特定の数の ECS インスタンスを削除する、 パラメータを 0 に設定し、削除する ECS インスタンスを選択して特定の ECS インスタンスを削除する。調整回数 パラメーターを指定し、特定の ECS インスタンスを削除します。調整回数 パラメーターを 0 に設定し、削除する ECS インスタンスを選択します。

  • スケールインで削除されるインスタンス数は、スケーリンググループに最初に作成されたインスタンス数より少なくすることはできません。

ACK クラスタのノードプールのノード数を調整します。詳細については、「ノードプールを作成および管理する」をご参照ください。注:

  • リンク先のドキュメントを読み、AliyunOOSLifecycleHook4CSRole ロールに権限を付与します。

テンプレートタイプ

自動

所有者

Alibaba Cloud

入力パラメータ

パラメータ

説明

タイプ

必須

デフォルト値

制限

resourceType

調整するリソースのタイプ。

String

いいえ

ESS

regionId

クローン作成する ECS インスタンスのリージョン ID。

String

いいえ

{{ ACS::RegionId }}

scalingGroupId

スケーリンググループ ID。

String

いいえ

""

adjustmentType

スケーリング方法。

String

いいえ

ScaleOut

adjustmentCount

スケーリンググループで変更する ECS インスタンスの数。

Number

いいえ

0

instancesToBeRemoved

スケーリンググループから削除する ECS インスタンス。

Json

いいえ

{'Type': 'ResourceIds', 'ResourceIds': [], 'RegionId': '{{ ACS::RegionId }}'}

clusterId

クラスタ ID。

String

いいえ

""

nodepoolId

ノードプール ID。

String

いいえ

""

desiredSize

予想ノード数。

Number

いいえ

0

OOSAssumeRole

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

String

いいえ

""

出力パラメータ

パラメータ

説明

タイプ

adjustDetail

String

lifecycleHookOOSExecutionResult

String

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

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeInstances"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ess:CreateScalingRule",
                "ess:DeleteScalingRule",
                "ess:DescribeScalingActivities",
                "ess:DescribeScalingActivityDetail",
                "ess:ExecuteScalingRule",
                "ess:RemoveInstances"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "oos:ListExecutions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "cs:DescribeClusterNodePoolDetail",
                "cs:ModifyClusterNodePool"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

参照

ACS-ESS-AdjustScalingGroupInstanceCount

テンプレートコンテンツ

FormatVersion: OOS-2019-06-01
Description:
  ja: <p class="p">スケーリンググループルールを作成および実行することにより、スケーリンググループのインスタンス数を調整します。説明:</p>
    <ul class="ul">
    <li class="li">スケーリンググループで必要なインスタンス数が構成されている場合、スケーリンググループのインスタンス数が予想インスタンス数と等しくない場合、自動スケーリングサービスは、スケーリンググループのインスタンス数が常に維持されるように自動的にスケーリングします。実行が完了したら、ESS コンソールに移動して調整結果を表示してください。</li>
    <li class="li">ノードをスケールダウンした後のクラスタノードの数は、コンポーネントの最小ノード要件より少なくすることはできません。そうでない場合、スケーリング操作でコード:IncorrectCapacity のエラーが返される可能性があります。</li>
    <li class="li">アカウントの残高が新しく購入したインスタンスの費用よりも大きいことを確認してください。そうでない場合、コード:InvalidAccountStatus.NotEnoughBalance のエラーが返されます。</li>
    <li class="li">マルチゾーンの場合は、ゾーン数の倍数に展開してください。</li>
    <li class="li">拡張された ECS の支払方法は従量課金です。必要に応じて、お客様は年間および月間の手動下請けを行う必要があります。</a></li>
    <li class="li">スケールダウンには 2 つの方法があります。指定された数の ECS インスタンスをスケールダウンする(<b>スケーリンググループの ECS インスタンス調整の数</b>は 0 ではない)、指定された ECS インスタンスをスケーリンググループから削除する(<b>スケーリンググループの ECS インスタンス調整の数</b>は 0 で、削除する ECS インスタンスが選択されている)</li>
    <li class="li">スケーリングは、スケーリンググループで最初に開かれた数より少なくすることはできません。</li>
    </ul>
    <p class="p">スケーリンググループルールを作成および実行することにより、スケーリンググループのインスタンス数を調整します。説明:</p>
    <ul class="ul">
    <li class="li">ACK クラスタノードプール<a href='https://www.alibabacloud.com/help/ja/ack/ack-edge/user-guide/create-a-node-pool?spm=a3c0i.23458820.2359477120.9.57186e9b4Ewe21'>予想ノード数</a>を調整します。リンク先のドキュメントをよく読んで、ロール AliyunOOSLifecycleHook4CSRole を承認してください。</li>
    </ul>
  name-ja: エラスティックスケーリング
  categories:
    - エラスティック管理
    - アプリケーション管理
    - コンピュートネスト


Parameters:
  resourceType:
    Type: String
    Label:
      ja: リソースタイプ
    AllowedValues:
      - ACK
      - ESS
    Default: ESS
  regionId:
    Type: String
    Label:
      ja: リージョン ID
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  scalingGroupId:
    Type: String
    Label:
      ja: スケーリンググループ ID
    Default: ''
    AssociationProperty: ALIYUN::ESS::AutoScalingGroup::AutoScalingGroupId
    AssociationPropertyMetadata:
      RegionId: regionId
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ESS
  adjustmentType:
    Type: String
    Label:
      ja: 調整タイプ
    AssociationPropertyMetadata:
      LocaleKey: ESSGroupAdjustmentType
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ESS
    AllowedValues:
      - ScaleOut
      - ScaleIn
      - TotalCapacity
    Default: ScaleOut
  adjustmentCount:
    Type: Number
    Label:
      ja: 調整カウント
    MinValue: 0
    MaxValue: 100
    Default: 0
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ESS
  instancesToBeRemoved:
    Type: Json
    Label:
      ja: 削除されたインスタンス
    Default:
      Type: ResourceIds
      ResourceIds: []
      RegionId: '{{ ACS::RegionId }}'
    AssociationProperty: Targets
    AssociationPropertyMetadata:
      ResourceType: ALIYUN::ECS::Instance
      RegionId: regionId
      Visible:
        Condition:
          Fn::And:
            - Fn::Equals:
                - '${resourceType}'
                - ESS
            - Fn::Equals:
                - '${adjustmentType}'
                - ScaleIn
            - Fn::Equals:
                - '${adjustmentCount}'
                - 0
  clusterId:
    Label:
      ja: クラスタ ID
    Type: String
    Default: ''
    AssociationProperty: ALIYUN::CS::Cluster::ClusterId
    AssociationPropertyMetadata:
      RegionId: ${regionId}
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ACK
  nodepoolId:
    Label:
      ja: ノードプール ID
    Type: String
    Default: ''
    AssociationProperty: ALIYUN::CS::Cluster::ClusterNodePool
    AssociationPropertyMetadata:
      RegionId: ${regionId}
      ClusterId: ${clusterId}
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ACK
  desiredSize:
    Label:
      ja: 必要なサイズ
    Type: Number
    MinValue: 0
    MaxValue: 100
    Default: 0
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Equals:
            - '${resourceType}'
            - ACK
  OOSAssumeRole:
    Label:
      ja: OOS アシュームロール
    Type: String
    Default: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: chooseNextTaskByResourceType
    Action: 'ACS::Choice'
    Description:
      ja: リソースタイプ別に次のタスクを選択
    Properties:
      DefaultTask: whetherToRemoveInstancesFromScalingGroup
      Choices:
        - When:
            Fn::Equals:
              - 'ACK'
              - '{{ resourceType }}'
          NextTask: getNodePoolDetail
  - Name: whetherToRemoveInstancesFromScalingGroup
    Action: 'ACS::Choice'
    Description:
      ja: 調整タイプ別に次のタスクを選択
    Properties:
      DefaultTask: createScalingRule
      Choices:
        - When:
            Fn::And:
              - Fn::Equals:
                  - '{{adjustmentType}}'
                  - ScaleIn
              - Fn::Equals:
                  - '{{adjustmentCount}}'
                  - 0
          NextTask: getInstanceToBeRemoved
  - Name: getInstanceToBeRemoved
    Description:
      ja: 削除する ECS インスタンスを取得
    Action: ACS::SelectTargets
    Properties:
      ResourceType: ALIYUN::ECS::Instance
      RegionId: '{{ regionId }}'
      Filters:
        - '{{ instancesToBeRemoved }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: Instances.Instance[].InstanceId
  - Name: removeInstances
    Action: 'ACS::ExecuteAPI'
    OnSuccess: waitScalingActivityComplete
    When:
      Fn::Not:
        Fn::Equals:
          - '{{ getInstanceToBeRemoved.instanceIds }}'
          - []
    Description:
      ja: スケーリンググループからインスタンスを削除
    Properties:
      Service: ESS
      API: RemoveInstances
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingGroupId: '{{ scalingGroupId }}'
        InstanceIds: '{{ getInstanceToBeRemoved.instanceIds }}'
    Outputs:
      scalingActivityId:
        Type: String
        ValueSelector: .ScalingActivityId
  - Name: createScalingRule
    Action: 'ACS::ExecuteAPI'
    Description:
      ja: スケーリングルールを作成
    Properties:
      Service: ESS
      API: CreateScalingRule
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingGroupId: '{{ scalingGroupId }}'
        ScalingRuleName: '{{ ACS::ExecutionId }}'
        AdjustmentType:
          Fn::If:
            - Fn::Equals:
                - 'TotalCapacity'
                - '{{ adjustmentType }}'
            - TotalCapacity
            - QuantityChangeInCapacity
        AdjustmentValue:
          Fn::If:
            - Fn::Equals:
                - ScaleIn
                - '{{ adjustmentType }}'
            - '-{{ adjustmentCount }}'
            - '{{ adjustmentCount }}'
    Outputs:
      scalingRuleAri:
        Type: String
        ValueSelector: ScalingRuleAri
      scalingRuleId:
        Type: String
        ValueSelector: ScalingRuleId
  - Name: executeScalingRule
    Description:
      ja: スケーリングルールを実行
    OnError: deleteScalingRule
    Action: 'ACS::ExecuteApi'
    Properties:
      Service: ESS
      API: ExecuteScalingRule
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingRuleAri: '{{ createScalingRule.scalingRuleAri }}'
    Outputs:
      scalingActivityId:
        Type: String
        ValueSelector: ScalingActivityId
  - Name: waitScalingActivityComplete
    Description:
      ja: スケーリングアクティビティの実行が成功または失敗するまでポーリング
    OnError: deleteScalingRule
    Retries: 30
    Action: 'ACS::WaitFor'
    Properties:
      Service: ESS
      API: DescribeScalingActivities
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingActivityId1:
          Fn::If:
            - Fn::And:
                - Fn::Equals:
                    - '{{adjustmentType}}'
                    - ScaleIn
                - Fn::Equals:
                    - '{{adjustmentCount}}'
                    - 0
            - '{{ removeInstances.scalingActivityId }}'
            - '{{ executeScalingRule.scalingActivityId }}'
      DesiredValues:
        - Successful
      StopRetryValues:
        - Failed
        - Rejected
        - Warning
      PropertySelector: 'ScalingActivities.ScalingActivity[0].StatusCode'
  - Name: deleteScalingRule
    When:
      Fn::Not:
        Fn::And:
          - Fn::Equals:
              - '{{adjustmentType}}'
              - ScaleIn
          - Fn::Equals:
              - '{{adjustmentCount}}'
              - 0
    Description:
      ja: スケーリングルールを削除
    Action: 'ACS::ExecuteApi'
    Properties:
      Service: ESS
      API: DeleteScalingRule
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingRuleId: '{{ createScalingRule.scalingRuleId }}'
  - Name: describeScalingActivityDetail
    Description:
      ja: スケーリングアクティビティの詳細を記述
    Action: 'ACS::ExecuteApi'
    Properties:
      Service: ESS
      API: DescribeScalingActivityDetail
      Parameters:
        RegionId: '{{ regionId }}'
        ScalingActivityId:
          Fn::If:
            - Fn::And:
                - Fn::Equals:
                    - '{{adjustmentType}}'
                    - ScaleIn
                - Fn::Equals:
                    - '{{adjustmentCount}}'
                    - 0
            - '{{ removeInstances.scalingActivityId }}'
            - '{{ executeScalingRule.scalingActivityId }}'
    Outputs:
      detail:
        Type: String
        ValueSelector: .Detail
  - Name: getOOSExecutionOutput
    Action: 'ACS::ExecuteAPI'
    OnSuccess: ACS::END
    Description:
      ja: ライフサイクルフック OOS 実行出力を取得
    Properties:
      Service: OOS
      API: ListExecutions
      Parameters:
        RegionId: '{{ regionId }}'
        Tags:
          ESS:ScalingActivityId:
            Fn::If:
              - Fn::And:
                  - Fn::Equals:
                      - '{{adjustmentType}}'
                      - ScaleIn
                  - Fn::Equals:
                      - '{{adjustmentCount}}'
                      - 0
              - '{{ removeInstances.scalingActivityId }}'
              - '{{ executeScalingRule.scalingActivityId }}'
    Outputs:
      lifecycleHookOOSExecutionResult:
        Type: String
        ValueSelector: 'Executions[].Outputs'
  - Name: getNodePoolDetail
    Action: ACS::WaitFor
    Description:
      ja: クラスタノードプール情報を取得
    Retries: 20
    Properties:
      Service: CS
      API: DescribeClusterNodePoolDetail
      Method: GET
      URI: /clusters/{{clusterId}}/nodepools/{{nodepoolId}}
      Parameters: {}
      DesiredValues:
        - active
      PropertySelector: .status.state
    Outputs:
      nodePoolInfo:
        Type: Json
        ValueSelector: .
  - Name: modifyClusterNodePool
    Action: ACS::ExecuteAPI
    Description:
      ja: クラスタノードプール構成を変更
    Properties:
      Service: CS
      API: ModifyClusterNodePool
      Method: PUT
      Headers:
        Content-Type: application/json
      URI: /clusters/{{clusterId}}/nodepools/{{nodepoolId}}
      Body:
        Fn::Jq:
          - First
          - '.+({"scaling_group": (.scaling_group + {"desired_size": {{desiredSize}}})}) | del(.scaling_group.login_password)'
          - '{{ getNodePoolDetail.nodePoolInfo }}'
  - Name: untilClusterNodePoolReady
    Action: ACS::WaitFor
    Description:
      ja: クラスタノードプール構成が完了するまで待機
    Retries: 20
    Properties:
      Service: CS
      API: DescribeClusterNodePoolDetail
      Method: GET
      Parameters: {}
      URI: /clusters/{{clusterId}}/nodepools/{{nodepoolId}}
      DesiredValues:
        - active
      PropertySelector: .status.state
Outputs:
  adjustDetail:
    Type: String
    Value: '{{ describeScalingActivityDetail.detail }}'
  lifecycleHookOOSExecutionResult:
    Type: String
    Value: '{{ getOOSExecutionOutput.lifecycleHookOOSExecutionResult }}'
Metadata:
  ALIYUN::OOS::Interface:
    ParameterGroups:
      - Parameters:
          - regionId
          - resourceType
          - scalingGroupId
          - adjustmentType
          - adjustmentCount
          - instancesToBeRemoved
          - clusterId
          - nodepoolId
          - desiredSize
        Label:
          default:
            ja: スケーリングルールの構成パラメータ
      - Parameters:
          - OOSAssumeRole
        Label:
          default:
            ja: 制御オプション