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 をインストールする
次のコマンドを実行して、Python 用 Alibaba Cloud SDK がインストールされているかどうかを確認します。
python --versionPython 用 Alibaba Cloud SDK がインストールされている場合、次の出力が表示されます。

次のコマンドを実行して、OOS の依存関係をインストールします。
pip install alibabacloud_oos20190601==3.2.1
手順 2: ローリングアップデートタスクを実行する
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:])Python スクリプトを実行し、応答を表示します。
説明ロールバックタスクを実行する場合は、ソースローリングアップデートタスクの実行 ID を入力します。次の図に示すように、コマンド出力でソースローリングアップデートタスクの実行 ID などの情報を取得できます。

手順 3: (オプション) ロールバックタスクを実行する
ローリングアップデートタスクの実行時に例外が発生した場合、またはローリングアップデートタスクの実行後に以前の構成を使用する場合、ロールバックタスクを実行して ECS インスタンスの構成を復元できます。
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:])Python スクリプトを実行し、応答を表示します。
次の図は例を示しています。

テンプレートパラメータ
次の表に、このトピックで使用されている ACS-ESS-RollingUpdateByRunCommandInScalingGroup パブリックテンプレートのパラメータを示します。
パラメータ | 説明 |
invokeType | タスクのタイプ。有効な値:
|
scalingGroupId | タスクを実行するスケーリンググループ。 |
commandType | 実行するスクリプトのタイプ。 RunShellScript の値はシェルスクリプトを指定します。 |
invokeScript | ローリングアップデートタスク中に ECS インスタンスで実行するスクリプト。 |
rollbackScript | ロールバックタスク中に ECS インスタンスで実行するスクリプト。 |
OOSAssumeRole | タスクの実行に使用する RAM ロール。デフォルト値: OOSServiceRole。 |
enterProcess | タスクが実行される前に一時停止するスケーリングプロセス。 |
exitProcess | タスクの実行後に再開するスケーリングプロセス。 |
batchNumber | タスク実行のためにスケーリンググループ内の ECS インスタンスを分割するバッチの数。各バッチには少なくとも 1 つの ECS インスタンスが含まれます。 |
batchPauseOption | タスクを一時停止するかどうか、およびその方法を指定します。有効な値:
|
sourceExecutionId | ロールバックタスクの実行時のソースローリングアップデートタスクの実行 ID。 |