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

Auto Scaling:Python 用 Alibaba Cloud SDK を使用してローリングアップデートタスクを実行する

最終更新日:Apr 02, 2025

Python 用 Alibaba Cloud SDK を使用すると、複雑なコーディングを実行することなく Alibaba Cloud サービスにアクセスできます。このトピックでは、Python 用 Alibaba Cloud SDK を使用して CloudOps Orchestration Service (OOS) が提供する API オペレーションを呼び出し、ローリングアップデートタスクを実行する方法について説明します。

背景情報

ローリングアップデートタスクを使用すると、複数の Elastic Compute Service (ECS) インスタンスの構成を同時に更新できます。ローリングアップデートタスクを使用して、実行中状態の複数の ECS インスタンスでイメージの一括更新、スクリプトの実行、OOS パッケージのインストールを行うことができます。ECS インスタンスは、同じスケーリンググループに属している必要があります。

前提条件

  • Resource Access Management (RAM) ユーザーが作成され、AccessKey ペアが取得されていること。詳細については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。API オペレーションを呼び出すときは、AccessKey ペアを使用して身分認証を完了する必要があります。

    重要
    • Alibaba Cloud アカウントの AccessKey ペアを保護するために、RAM ユーザーを作成し、Auto Scaling にアクセスするための権限を RAM ユーザーに付与してから、RAM ユーザーの AccessKey ペアを使用して Python 用 Auto Scaling SDK を呼び出すことをお勧めします。詳細については、「Auto Scaling のシステムポリシー」をご参照ください。

    • RAM ユーザーの AccessKey シークレットは、AccessKey ペアの作成時にのみ表示されます。AccessKey ペアの作成後は、AccessKey シークレットを表示することはできません。AccessKey ペアを作成したら、AccessKey シークレットを安全な場所に保管してください。

  • 環境変数が構成されていること。詳細については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。このトピックでは、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を使用して、ID 検証用の Alibaba Cloud Credentials ツールを構成します。これにより、ハードコードされたプレーンテキストの AccessKey ペアを使用せずに Alibaba Cloud OpenAPI Explorer にアクセスできます。

  • スケーリンググループが作成され、ECS インスタンスがスケーリンググループに追加されていること。詳細については、「既存の ECS インスタンスに基づいてスケーリンググループを作成する」をご参照ください。

  • オンプレミスコンピュータに Python 3.6 以降がインストールされていること。

手順 1: Python 用 Alibaba Cloud SDK をインストールする

  1. 次のコマンドを実行して、Python 用 Alibaba Cloud SDK がインストールされているかどうかを確認します。

    python --version

    Python 用 Alibaba Cloud SDK がインストールされている場合、次の出力が表示されます。2024-07-08_13-37-07.png

  2. 次のコマンドを実行して、OOS の依存関係をインストールします。

    pip install alibabacloud_oos20190601==3.2.1

手順 2: ローリングアップデートタスクを実行する

  1. Python スクリプトを作成し、次のサンプルコードを入力してローリングアップデートタスクを実行します。

    コード内の OOS テンプレートパラメータについては、「テンプレートパラメータ」をご参照ください。サンプルコード:

    # -*- coding: utf-8 -*-
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_oos20190601.client import Client as oos20190601Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_oos20190601 import models as oos_20190601_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> oos20190601Client:
            """
            AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
            @return: Client
            @throws Exception
            """
            # プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、Alibaba Cloud アカウントのすべてのリソースのセキュリティが侵害される可能性があります。次の行は参照用にのみ提供されています。
            config = open_api_models.Config(
                # 必須。 ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が構成されていることを確認してください。
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必須。 ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            config.endpoint = f'oos.cn-hangzhou.aliyuncs.com'
            return oos20190601Client(config)
    
        @staticmethod
        def main(
                args: List[str],
        ) -> None:
            client = Sample.create_client()
            tags = {
                'scaling_group': 'asg-bp1******'
            }
            start_execution_request = oos_20190601_models.StartExecutionRequest(
                region_id='cn-hangzhou',
                template_name='ACS-ESS-RollingUpdateByRunCommandInScalingGroup',
                parameters='''{"invokeType": "invoke",
                            "scalingGroupId": "asg-bp1******",
                            "commandType": "RunShellScript",
                            "invokeScript": "df -h;ifconfig",
                            "rollbackScript": "df -h;ifconfig",
                            "OOSAssumeRole": "",
                            "exitProcess": [
                                "ScaleIn",
                                "ScaleOut",
                                "HealthCheck",
                                "AlarmNotification",
                                "ScheduledAction"
                            ],
                            "enterProcess": [
                                "ScaleIn",
                                "ScaleOut",
                                "HealthCheck",
                                "AlarmNotification",
                                "ScheduledAction"
                            ],
                            "batchNumber": 2,
                            "batchPauseOption": "Automatic"}''',
                tags=tags
            )
            runtime = util_models.RuntimeOptions()
            try:
                # ビジネス要件に基づいて API オペレーションの応答を出力するコードを記述します。
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # 実際のビジネスシナリオで例外を処理する場合は注意し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージは参照用にのみ出力されます。
                # エラーメッセージを表示します。
                print(error.message)
                # トラブルシューティングに関する情報を表示します。
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    
  2. Python スクリプトを実行し、応答を表示します。

    説明

    ロールバックタスクを実行する場合は、ソースローリングアップデートタスクの実行 ID を入力します。次の図に示すように、コマンド出力でソースローリングアップデートタスクの実行 ID などの情報を取得できます。

    image

手順 3: (オプション) ロールバックタスクを実行する

ローリングアップデートタスクの実行時に例外が発生した場合、またはローリングアップデートタスクの実行後に以前の構成を使用する場合、ロールバックタスクを実行して ECS インスタンスの構成を復元できます。

  1. Python スクリプトを作成し、次のサンプルコードを入力してロールバックタスクを実行します。

    コード内の OOS テンプレートパラメータについては、「テンプレートパラメータ」をご参照ください。サンプルコード:

    # -*- coding: utf-8 -*-
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_oos20190601.client import Client as oos20190601Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_oos20190601 import models as oos_20190601_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> oos20190601Client:
            """
            AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
            @return: Client
            @throws Exception
            """
            # プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、Alibaba Cloud アカウントのすべてのリソースのセキュリティが侵害される可能性があります。次の行は参照用にのみ提供されています。
            config = open_api_models.Config(
                # 必須。 ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が構成されていることを確認してください。
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必須。 ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            config.endpoint = f'oos.cn-hangzhou.aliyuncs.com'
            return oos20190601Client(config)
    
        @staticmethod
        def main(
                args: List[str],
        ) -> None:
            client = Sample.create_client()
            tags = {
                'scaling_group': 'asg-bp1******'
            }
            start_execution_request = oos_20190601_models.StartExecutionRequest(
                region_id='cn-hangzhou',
                template_name='ACS-ESS-RollingUpdateByRunCommandInScalingGroup',
                parameters='''{"invokeType": "rollback",
                            "scalingGroupId": "asg-bp1******",
                            "commandType": "RunShellScript",
                            "rollbackScript": "df -h;ifconfig",
                            "OOSAssumeRole": "",
                            "sourceExecutionId": "exec-c1******",
                            "batchNumber": 2,
                            "batchPauseOption": "Automatic"}''',
                tags=tags
            )
            runtime = util_models.RuntimeOptions()
            try:
                # ビジネス要件に基づいて API オペレーションの応答を出力するコードを記述します。
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # 実際のビジネスシナリオで例外を処理する場合は注意し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージは参照用にのみ出力されます。
                # エラーメッセージを表示します。
                print(error.message)
                # トラブルシューティングに関する情報を表示します。
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    
  2. Python スクリプトを実行し、応答を表示します。

    次の図は例を示しています。image

テンプレートパラメータ

次の表に、このトピックで使用されている ACS-ESS-RollingUpdateByRunCommandInScalingGroup パブリックテンプレートのパラメータを示します。

パラメータ

説明

invokeType

タスクのタイプ。有効な値:

  • invoke: ローリングアップデートタスク。

  • rollback: ロールバックタスク。

scalingGroupId

タスクを実行するスケーリンググループ。

commandType

実行するスクリプトのタイプ。 RunShellScript の値はシェルスクリプトを指定します。

invokeScript

ローリングアップデートタスク中に ECS インスタンスで実行するスクリプト。

rollbackScript

ロールバックタスク中に ECS インスタンスで実行するスクリプト。

OOSAssumeRole

タスクの実行に使用する RAM ロール。デフォルト値: OOSServiceRole。

enterProcess

タスクが実行される前に一時停止するスケーリングプロセス。

exitProcess

タスクの実行後に再開するスケーリングプロセス。

batchNumber

タスク実行のためにスケーリンググループ内の ECS インスタンスを分割するバッチの数。各バッチには少なくとも 1 つの ECS インスタンスが含まれます。

batchPauseOption

タスクを一時停止するかどうか、およびその方法を指定します。有効な値:

  • Automatic: タスクは中断なく実行されます。

  • FirstBatchPause: 最初の実行バッチが完了すると、タスクは一時停止されます。

  • EveryBatchPause: 各実行バッチが完了すると、タスクは一時停止されます。

sourceExecutionId

ロールバックタスクの実行時のソースローリングアップデートタスクの実行 ID。