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

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

最終更新日:Sep 11, 2024

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

背景情報

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

前提条件

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

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

    • RAMユーザーのAccessKeyシークレットは、AccessKeyペアを作成した場合にのみ表示されます。 AccessKeyペアの作成後は、AccessKeyシークレットを表示できません。 AccessKeyペアを作成したら、AccessKeyシークレットを安全な場所に保存します。

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

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

  • オンプレミスのコンピューターにPython 3.6以降がインストールされます。

手順1: Alibaba Cloud SDK for Pythonのインストール

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

    python --version

    Alibaba Cloud SDK for Pythonがインストールされている場合、次の出力が表示されます。 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:
            """
            Use your AccessKey ID and AccessKey secret to initialize the client.
            @return: Client
            @throws Exception
            """
            # If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your Alibaba Cloud account may be compromised. The following sample code is provided only for reference. 
            config = open_api_models.Config(
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured. ,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured. ,
                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:
                # Write code to print the response of the API operation based on your business requirements.
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # Exercise caution when you handle exceptions in actual business scenarios, and do not ignore exceptions in your project. In this example, error messages are printed only for reference. 
                # Print error messages.
                print(error.message)
                # Provide the URL for troubleshooting.
                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:
            """
            Use your AccessKey ID and AccessKey secret to initialize the client.
            @return: Client
            @throws Exception
            """
            # If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your Alibaba Cloud account may be compromised. The following sample code is provided only for reference. 
            config = open_api_models.Config(
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured. ,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured. ,
                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:
                # Write code to print the response of the API operation based on your business requirements.
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # Exercise caution when you handle exceptions in actual business scenarios, and do not ignore exceptions in your project. In this example, error messages are printed only for reference. 
                # Print error messages.
                print(error.message)
                # Provide the URL for troubleshooting.
                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

タスクの ID を設定します。 有効な値:

  • invoke: ローリング更新タスク。

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

scalingGroupId

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

commandType

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

invokeScript

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

rollbackScript

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

OOSAssumeRole

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

enterProcess

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

exitProcess

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

batchNumber

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

batchPauseOption

タスクを中断するかどうかと中断方法を指定します。 有効な値:

  • 自動: タスクは中断することなく実行されます。

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

  • EveryBatchPause: 実行の各バッチが完了すると、タスクは中断されます。

sourceExecutionId

ロールバックタスクが実行されたときのソースローリング更新タスクの実行ID。