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のインストール
次のコマンドを実行して、Alibaba Cloud SDK for Pythonがインストールされているかどうかを確認します。
python --version
Alibaba Cloud SDK for Pythonがインストールされている場合、次の出力が表示されます。
次のコマンドを実行して、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: """ 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:])
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: """ 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:])
Pythonスクリプトを実行し、応答を表示します。
以下の図は一例です。
テンプレートパラメーター
次の表に、このトピックで使用するACS-ESS-RollingUpdateByRunCommandInScalingGroupパブリックテンプレートのパラメーターを示します。
パラメーター | 説明 |
invokeType | タスクの ID を設定します。 有効な値:
|
scalingGroupId | タスクを実行するスケーリンググループ。 |
commandType | 実行するスクリプトのタイプ。 RunShellScriptの値は、シェルスクリプトを指定します。 |
invokeScript | ローリングアップデートタスク中にECSインスタンスで実行するスクリプト。 |
rollbackScript | ロールバックタスク中にECSインスタンスで実行するスクリプト。 |
OOSAssumeRole | タスクの実行に使用するRAMロール。 デフォルト値: OOSServiceRole。 |
enterProcess | タスクが実行される前に一時停止するスケーリングプロセス。 |
exitProcess | タスクの実行後に再開するスケーリングプロセス。 |
batchNumber | スケーリンググループ内のECSインスタンスがタスク実行のために分割されるバッチの数。 各バッチには、少なくとも1つのECSインスタンスが含まれます。 |
batchPauseOption | タスクを中断するかどうかと中断方法を指定します。 有効な値:
|
sourceExecutionId | ロールバックタスクが実行されたときのソースローリング更新タスクの実行ID。 |