Alibaba Cloud SDK for Python を使用すると、複雑なコーディングを行うことなく Alibaba Cloud のサービスにアクセスできます。このトピックでは、Alibaba Cloud SDK for Python を使用して CloudOps Orchestration Service (OOS) が提供する API を呼び出し、ローリングアップデートタスクを実行する方法について説明します。
背景情報
ローリングアップデートタスクを使用すると、複数の Elastic Compute Service (ECS) インスタンスの設定を同時に更新できます。ローリングアップデートタスクを使用して、同じスケーリンググループに属する複数の ECS インスタンスのイメージの更新、スクリプトの実行、OOS パッケージのインストールをバッチで行うことができます。これらの ECS インスタンスは In Service 状態である必要があります。
前提条件
Resource Access Management (RAM) ユーザーが作成され、AccessKey ペアが取得されていること。詳細については、「RAM ユーザーの AccessKey の作成」をご参照ください。API を呼び出す際には、ID 認証を完了するために AccessKey ペアを使用する必要があります。
重要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環境変数を使用して、ID 検証のために Alibaba Cloud Credentials ツールを設定します。これにより、ハードコーディングされた平文の AccessKey ペアを必要とせずに Alibaba Cloud OpenAPI Explorer にアクセスできます。スケーリンググループが作成され、ECS インスタンスがスケーリンググループに追加されていること。詳細については、「既存のインスタンスからスケーリンググループを作成する」をご参照ください。
オンプレミスのコンピューターにPython 3.6 以降がインストールされていること。
ステップ1:Alibaba Cloud SDK for Python のインストール
次のコマンドを実行して、Alibaba Cloud SDK for Python がインストールされているかどうかを確認します。
python --versionAlibaba Cloud SDK for Python がインストールされている場合、次の出力が表示されます。
python --version Python 3.12.4次のコマンドを実行して、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 Secret を使用してクライアントを初期化します。 @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 はレスポンスから取得できます。
ローリングアップデートタスクが正常に実行されると、レスポンス内の
ExecutionId(例:exec-cxxx2) が、後続のロールバックタスクで必要となるソース実行 ID です。レスポンスの例:{"Execution": {"Counters": {"Failed": 0, "Total": 0, "Success": 0}, "CurrentTasks": [], "ExecutedBy": "xxx", "ExecutionId": "exec-cxxx2", "LoopMode": "Automatic", "Mode": "Automatic", "Outputs": "{}", "Parameters": "{\"invokeType\": \"invoke\", \"scalingGroupId\": \"asg-bp1xxx\", \"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\"}", "ResourceGroupId": "rg-axxx", "SafetyCheck": "Skip", "StartDate": "2024-08-13T03:39:27Z", "Status": "Started", "Tags": {"scaling_group": "asg-bp1xxx"}, "TemplateId": "t-3a5f0904084e4a3c8801", "TemplateName": "ACS-ESS-RollingUpdateByRunCommandInScalingGroup", "TemplateVersion": "v17"}, "RequestId": "D4B1C557-0E42-5AD4-A329-AA673ECD2DF1"}
ステップ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 Secret を使用してクライアントを初期化します。 @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 スクリプトを実行し、レスポンスを確認します。
出力例:
{'Execution': {'Counters': {'Failed': 0
テンプレートパラメーター
次の表に、このトピックで使用される ACS-ESS-RollingUpdateByRunCommandInScalingGroup パブリックテンプレートのパラメーターを示します。
パラメーター | 説明 |
invokeType | タスクのタイプ。有効な値:
|
scalingGroupId | タスクを実行するスケーリンググループ。 |
commandType | 実行するスクリプトのタイプ。値 RunShellScript は、シェルスクリプトを表します。 |
invokeScript | ローリングアップデートタスク中に ECS インスタンスで実行するスクリプト。 |
rollbackScript | ロールバックタスク中に ECS インスタンスで実行するスクリプト。 |
OOSAssumeRole | タスクの実行に使用する RAM ロール。デフォルト値: OOSServiceRole。 |
enterProcess | タスク実行前に一時停止するスケーリングプロセス。 |
exitProcess | タスク実行後に再開するスケーリングプロセス。 |
batchNumber | タスク実行のためにスケーリンググループ内の ECS インスタンスを分割するバッチ数。各バッチには少なくとも 1 つの ECS インスタンスが含まれます。 |
batchPauseOption | タスクを一時停止するかどうか、およびその方法を指定します。有効な値:
|
sourceExecutionId | ロールバックタスクのソース実行 ID。 |