スケールインイベント時に削除するインスタンスを制御する場合 (例:CPU 負荷が最も低いインスタンスから削除する)、Function Compute を使用してカスタムスケールインポリシーを作成できます。Auto Scaling がスケールインアクティビティを実行する際、このポリシーに基づいて削除対象のインスタンスを自動的に選択します。
背景情報
Auto Scaling は、スケールインアクティビティ時にインスタンスを削除するための複数の組み込みポリシーをサポートしています。これらのポリシーは、インスタンス作成時刻やスケーリング設定のバージョンなどの基準を使用します。詳細については、「スケーリンググループのインスタンス終了ポリシーの設定」をご参照ください。
より具体的な要件がある場合は、Function Compute を使用してビジネスニーズに合わせたカスタムスケールインポリシーを作成できます。一般的な使用例は以下のとおりです。
-
シナリオ 1:アプリケーションへの影響を最小限に抑えるため、CPU 負荷が最も低いインスタンスを削除します。
-
シナリオ 2:独自のスケジューリングシステムと統合して、アイドル状態のインスタンスを優先的に削除することで、サービスの可用性を維持しながらコストを削減します。
前提条件
-
Function Compute がアクティブ化されており、必要な権限が付与されていること。詳細については、「ステップ 1:Function Compute のアクティブ化」をご参照ください。
-
Simple Log Service がアクティブ化されており、必要な権限があること。詳細については、「LoongCollector を使用した ECS テキストログの収集と分析」をご参照ください。
操作手順
ステップ 1:関数の作成
Alibaba Cloud Function Compute コンソールには、Function Compute 2.0 と Function Compute 3.0 の 2 つのバージョンがあります。このガイドでは Function Compute 2.0 を使用します。
-
Function Compute コンソールにログインします。
Function Compute 3.0 コンソールが表示されている場合は、[Function Compute 2.0 に戻る] をクリックします。
-
左側のナビゲーションペインで、サービスと関数 をクリックします。
-
上部メニューで、リージョンを選択します。
-
サービスを作成します。
-
サービス ページで、サービスの作成 をクリックします。
-
表示されたパネルで、サービス設定を行い、決定 をクリックします。
このトピックでは、以下の設定を例として使用します。その他のパラメータについては、デフォルト値を使用してください。詳細については、「サービスの作成」をご参照ください。
パラメータ
例
説明
[サービス名]
test-service
Function Compute サービスの名前。コンソールに表示される命名規則に従ってください。
[説明]
test
Function Compute サービスの説明。
[ログ]
有効化
ロギングを有効にすると、関数実行ログが自動的に Simple Log Service に送信されます。これにより、コードのデバッグ、障害の診断、データ分析が可能になります。
-
-
関数を作成します。
-
サービス名をクリックし、左側のナビゲーションペインで 関数管理 をクリックします。
-
関数の作成 をクリックします。
-
関数の作成 ページで、関数設定を行い、作成 をクリックします。
このトピックでは、組み込みランタイムを使い作成する メソッドを使用して関数を作成します。以下の設定を例として使用します。その他のパラメータについては、デフォルト値を使用してください。詳細については、「関数の作成」をご参照ください。
パラメータ
例
説明
[基本設定]
[関数名]
test-fc
関数の名前を入力します。コンソールに表示される命名規則に従ってください。
[リクエストタイプ]
イベントハンドラー
以下のハンドラータイプがサポートされています。
-
[イベントリクエスト]:関数はイベント駆動型リクエストを処理します。
-
HTTP ハンドラー:関数は HTTP または WebSocket リクエストを処理します。
[コード]
[動作環境]
Python 3.9
コードのランタイム環境。
[コードのアップロード方法]
サンプルコードを使用
Hello, world! サンプル
関数コードを Function Compute にアップロードする方法。
-
-
-
関数コードを記述してデプロイします。
-
関数名をクリックして、関数詳細ページに移動します。
-
コード タブで、コードエディターで
index.pyファイルを編集し、デプロイコード をクリックします。ビジネス要件に基づいて、各インスタンスの CPU 負荷を取得したり、独自のサービススケジューリングシステムに問い合わせたりするなど、特定のフィルタリングロジックを実装できます。
以下のサンプルコードは、イベントで渡された削除対象のインスタンス数 (
Capacity) とインスタンス ID のリスト (InstanceId) に基づいて、削除対象のインスタンスを選択します。# -*- coding: utf-8 -*- import logging import json def handler(event, context): evt = json.loads(event) logger = logging.getLogger() logger.info(evt) removeCount = 0 if "CapacityToRemove" in evt: for cp in evt["CapacityToRemove"]: logger.info(cp["Capacity"]) removeCount += int(cp["Capacity"]) instances_to_terminate = [] if "Instances" in evt: for i in evt["Instances"]: instances_to_terminate.append(i["InstanceId"]) response = { 'InstanceIds': instances_to_terminate[:removeCount] } logger.info(response) return response
-
-
(オプション) 関数をテストします。
-
コード タブで、関数のテスト の横にある
アイコンをクリックし、ドロップダウンリストから テストパラメーターの設定 を選択します。 -
テストイベントオブジェクトを入力し、決定 をクリックします。
以下のコードをテスト例として使用します。
ScalingGroupIdは管理するスケーリンググループを指定します。CapacityToRemoveはcn-beijing-gゾーンから 1 つの ECS インスタンスを削除することを指定します。Instancesは削除可能なインスタンスのリストを指定します。{ "ScalingGroupARN": "acs:ess:cn-beijing:160998252992****.scalinggroup/asg-2zei8mzn72rb115k****", "ScalingGroupId": "asg-2zei8mzn72rb115k****", "CapacityToRemove": [{ "ZoneId": "cn-beijing-g", "Capacity": 1 }], "Instances": [{ "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" }, { "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" }, { "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" } ], "AdjustmentType": "SystemScaleIn" } -
関数のテスト をクリックします。
-
レスポンス タブで、テスト結果を確認します。
関数からの期待されるレスポンスを以下に示します。このレスポンスは、スケールインイベント時にリストの最初のインスタンスを削除するよう Auto Scaling に指示します。
{ "InstanceIds": [ "i-2zeinb37ovdsx6l0****" ] }
-
-
ページ上部で バージョンの公開 をクリックし、決定 をクリックします。
ステップ 2:スケールインポリシーの設定
このセクションでは、新しいスケーリンググループを作成する際にカスタムスケールインポリシーを適用する方法を示します。既存のスケーリンググループがある場合は、代わりにそのスケールインポリシーを変更できます。
Auto Scalingコンソールにログインします。
-
スケーリンググループを作成します。
-
スケーリンググループ ページで、スケーリンググループの作成 をクリックします。
-
スケーリンググループのパラメータを設定し、作成 をクリックします。
このトピックでは、以下の設定を例として使用します。記載されていないパラメータについては、デフォルト値を使用してください。詳細については、「スケーリンググループの設定」をご参照ください。
パラメータ
例
説明
[スケーリンググループ名]
test
スケーリンググループの名前を入力します。コンソールに表示される命名規則に従ってください。
[タイプ]
ECS
スケーリンググループ内のインスタンスのタイプ。
この例では ECS を使用します。これは、スケーリンググループが ECS インスタンスを管理することを意味します。
[インスタンス設定ソース]
[最初から作成]
インスタンスを作成するためのテンプレート。
この例では 新規作成 を使用します。これは、この段階ではテンプレートが指定されていないことを意味します。スケーリンググループの作成後に、スケーリング設定を作成する必要があります。
[インスタンス削除ポリシー]
[カスタムポリシー]
-
サービス:test-service
-
バージョン:LATEST
-
関数:test-fc
スケールインアクティビティ時にスケーリンググループからインスタンスを削除するためのポリシー。
カスタムポリシー を選択し、ステップ 1 で作成した関数を選択します。
[最小インスタンス数]
0
スケーリンググループ内のインスタンスの最小数。現在のインスタンス数がこの値を下回ると、Auto Scaling は最小要件を満たすためにインスタンスを追加します。
[最大インスタンス数]
5
スケーリンググループ内のインスタンスの最大数。現在のインスタンス数がこの値を超えると、Auto Scaling は最大要件を満たすためにインスタンスを削除します。
予想されるインスタンス数を有効化する および 想定インスタンス数
有効、3
この機能を有効にして、期待されるインスタンス数を設定します。Auto Scaling は、グループ内のこのインスタンス数を自動的に維持します。
-
-
-
スケーリング設定を作成します。詳細については、「ECS インスタンスのスケーリング設定の作成」をご参照ください。
-
スケーリンググループを有効化します。詳細については、「スケーリンググループの有効化または無効化」をご参照ください。
このスケーリンググループの期待されるインスタンス数は 3 に設定されているため、グループが有効化されると、Auto Scaling は自動的に 3 つの ECS インスタンスを作成します。
ステップ 3:スケールインの検証
-
スケールインアクティビティをトリガーして、インスタンスの削除を確認します。
-
スケーリンググループの期待されるインスタンス数を変更して、スケールインアクティビティをトリガーします。詳細については、「スケーリンググループの表示または変更」をご参照ください。
重要スケジュールされたタスクやイベントトリガータスクを使用したり、スケーリングルールを手動で実行したりして、スケールインアクティビティをトリガーすることもできます。ただし、Function Compute を使用して作成したカスタムスケールインポリシーは、スケーリンググループのインスタンスの最小数または最大数の変更によってトリガーされたスケールインアクティビティには適用できません。
この例では、期待されるインスタンス数を 2 に変更します。スケーリンググループには以前 3 つの ECS インスタンスがあったため、この変更により自動的にスケールインアクティビティがトリガーされ、1 つの ECS インスタンスが削除されます。これにより、インスタンス数が新しい期待される数に減少します。
-
スケーリングアクティビティの詳細を表示して、どのインスタンスが削除されたかを確認します。詳細については、「スケーリングアクティビティの詳細の表示」をご参照ください。
この例では、削除されたインスタンスの ID は
i-2ze2qdtxxxxtldqです。スケーリングアクティビティの詳細では、[原因] フィールドに、ユーザーが期待されるインスタンス数を 3 から 2 に変更したことが示されています。[詳細] フィールドから、対応するインスタンスが削除されたことが分かります。[ステータス情報] フィールドには、1 つの ECS インスタンスが削除され、アクティビティのステータスが [成功] であると表示されます。
-
-
関数呼び出しログを表示して、スケールインアクティビティが関数をトリガーしたことを確認します。
-
Function Compute コンソールで、サービス ページに移動し、サービス名をクリックします。
-
[関数管理] ページで、関数名をクリックします。
-
関数詳細ページで、ログ タブをクリックします。
-
リクエスト数 タブの 呼び出しリクエストのリスト で、スケールインアクティビティの時刻に対応するリクエストを見つけ、リクエスト ID をクリックします。
-
表示されたリクエスト詳細パネルで、ログ詳細 をクリックして、関数呼び出しのログを表示します。
以下のログ出力は、スケールインアクティビティがトリガーされたときに、Auto Scaling が削除するインスタンスの数とスケーリンググループ内の現在のインスタンス ID のリストを Function Compute に渡したことを示しています。ロジックが適用された後、関数は削除対象のインスタンス ID
i-2ze2qdtxxxxtldqを返しました。この ID は、削除されたインスタンスの ID と一致します。FC Invoke Start RequestId: 000BFA95-CAA4-5D83-B643-BC51C42402CD 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] {'ScalingGroupARN': 'acs:ess:cn-beijing:16099825xxx:scalinggroup/asg-2e6ny5x9dtxxx', 'ScalingGroupId': 'asg-2e6ny5x9dtiaxxxg', 'CapacityToRemove': [{'ZoneId': 'cn-beijing-g', 'Capacity': 1}], 'Instances': [{'InstanceId': 'i-2ze2qdthrxxxxtldq', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}, {'InstanceId': 'i-2ze2qdtxxxxtldr', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}, {'InstanceId': 'i-2ze2qdthxxxxtlds', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}], 'AdjustmentType': 'SystemScaleIn'} 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] 1 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] {'InstanceIds': ['i-2ze2qdtxxxxtldq']} FC Invoke End RequestId: 000BFA95-CAA4-5D83-B643-BC51C42402CD
-