Alibaba Cloud SDK V1.0 for Python は汎用 API 呼び出しをサポートしています。このトピックでは、Alibaba Cloud SDK V1.0 for Python を使用して汎用呼び出しを行う方法について説明します。
特性
軽量:Python 用 Alibaba Cloud SDK V1.0 を使用すると、各サービスの SDK をインストールする必要なく、
aliyun-python-sdk-coreのみインストールすることで、すべての API 操作を呼び出すことができます。迅速な反復と互換性:クラウドサービスが SDK を提供していない場合、または SDK が最新の API 操作用に更新されていない場合は、汎用呼び出しを行うことができます。この方法では、SDK の更新を待つことなく、最新の API 操作を呼び出すことができます。
詳細については、「汎用呼び出しと専用呼び出し」をご参照ください。
使用上の注意
汎用呼び出しを行う前に、API バージョン、リクエスト URL、パラメータータイプなど、必要なメタデータを手動で取得して指定します。詳細については、「API メタデータ」をご参照ください。
Alibaba Cloud SDK V1.0 for Python のコアライブラリをインストールする
ターミナルで次のコマンドを実行して、Alibaba Cloud SDK V1.0 for Python のコアライブラリをインストールします。
pip install aliyun-python-sdk-coreAPI 操作を呼び出す
リクエストクライアントを初期化する
aliyunsdkcore パッケージで、 client モジュールを作成してリクエストクライアントを初期化し、 client を使用して API 操作を呼び出します。この例では、 AccessKey ペア を使用してリクエストクライアントを初期化します。詳細については、「アクセス認証情報を管理する」をご参照ください。
AccessKey の漏洩を防ぐために、AccessKey ペアを環境変数に記録できます。詳細については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。
import os
from aliyunsdkcore.client import AcsClient
# AccessKey ペアを使用してリクエスト クライアントを直接初期化します。
client = AcsClient(
os.environ['ALIYUN_ACCESS_KEY_ID'],
os.environ['ALIYUN_ACCESS_KEY_SECRET'],
region_id='cn-hangzhou',
# verify=False # SSL 証明書の検証を無効にします。
# proxy={'http': 'http://127.0.0.1:9898'}, # プロキシを構成します。
# proxy={'https': 'http://<user>:<password>@127.0.0.1:8989'},
connect_timeout=10, # 接続リクエストのタイムアウト期間を構成します。
timeout=15 # 読み取りリクエストのタイムアウト期間を構成します。
)API 操作情報とリクエストパラメーターを構成する
CommonRequest を使用して、 API 操作 の共通リクエストパラメーターと操作固有のパラメーターを構成します。共通リクエストパラメーターの詳細については、「詳細設定」をご参照ください。
request モジュールは、バージョン番号、URL、パラメータータイプなどの API メタデータを標準のリクエスト構成プロセスを通じて有効な HTTP リクエストに変換し、元のレスポンスデータを返します。パラメーターの受け渡し方法は、API のスタイルと設計によって決まります。
操作固有のパラメーター
リクエストパラメーターの受け渡し方法は、API 操作のメタデータによって決まります。たとえば、DescribeInstanceStatus API 操作は、メタデータで {"name":"RegionId","in":"query",...}} として定義されています。この場合、 "in":"query" は、リージョン ID(RegionId)を putQueryParameter で渡す必要があることを示します。
説明 | パラメーターの受け渡し方法 |
| dd_query_param(self, k, v) 説明 キーと値のペアのセットを指定するには、dd_query_param("key.1","value1"); add_query_param("key.2","value2");... |
| add_body_params(self, k, v) 説明 リクエスト パラメーターが文字列型でない場合は、パラメーター値を JSON 文字列に変換する必要があります。 |
ファイルをアップロードする | set_content(self, content) 説明
|
# 2. CommonRequest オブジェクトを作成し、API 操作の基本情報とリクエスト パラメーターを構成します。
request = CommonRequest()
# 2.1 共通リクエスト パラメーターを構成します。
request.set_domain('ecs-cn-hangzhou.aliyuncs.com') # API のエンドポイント。
request.set_version('2014-05-26') # API バージョン番号。
request.set_action_name('DescribeInstanceStatus') # API 操作の名前。RPC スタイルの API 操作を呼び出すときは、set_action_name() を構成して API 操作の名前を指定する必要があります。
request.set_method('POST') # API 操作のリクエスト メソッド。
request.set_protocol_type('HTTPS') # リクエスト プロトコル。有効な値:HTTP および HTTPS。HTTPS を使用することをお勧めします。
# request.set_uri_pattern('/') # リソース パス。ROA スタイルの API 操作で必要です。RPC スタイルの API 操作には、このパラメーターを構成しないでください。
# 2.2 操作固有のリクエスト パラメーターを構成します。
# シナリオ 1:add_query_param(self, k, v) でクエリ パラメーターを指定します。
InstanceIds = [
"i-bp1axhql4dqXXXXXXXX",
"i-bp124uve8zqXXXXXXXX"
]
for depth1 in range(len(InstanceIds)):
request.add_query_param('InstanceId.' + str(depth1 + 1), InstanceIds[depth1])
request.add_query_param('PageNumber', '1')
request.add_query_param('PageSize', '30')
# シナリオ 2:add_body_params(self, k, v) でボディ パラメーターを指定します。
# request.add_body_params('key1', 'value1')
# request.add_body_params('key2', 'value2')
# request.add_body_params('key3', 'value3')
# シナリオ 3:set_content(self, content) を使用してファイルをアップロードし、content をバイト配列に設定します。
# file_path = "<FILE_PATH>" # <FILE_PATH> を実際のファイル パスに置き換えます。
# with open(file_path, 'rb') as file:
# 画像コンテンツをバイト配列として読み取ります。
# ByteArray = file.read()
# request.set_content(ByteArray)リクエストを開始する
client を使用して do_action_with_exception 関数を呼び出します。CommonRequest インスタンスを使用してリクエスト パラメーターを指定します。
# リクエストを開始します。
response = client.do_action_with_exception(request)
# レスポンスがバイト型の場合、リクエスト ID とレスポンス パラメーターが返されます。
print(f"response:\n{response}")
# JSON 形式でレスポンスを解析します。
response_json = json.loads(response.decode('utf-8')) # レスポンスを Python 辞書に変換します。
print("RequestId:", response_json["RequestId"]) # リクエスト ID。
サンプルコード
例:RPC スタイルの API 操作を呼び出す
次の例は、Elastic Compute Service (ECS) の DescribeInstanceStatus API 操作を呼び出す方法を示しています。
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
class Sample:
@staticmethod
def main():
# AccessKey ペアを使用してリクエスト クライアントを直接初期化します。
client = AcsClient(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
'cn-hangzhou')
# リクエスト オブジェクトを作成します。
request = CommonRequest()
request.set_domain('ecs-cn-hangzhou.aliyuncs.com') # API のエンドポイント。
request.set_version('2014-05-26') # API バージョン番号。
request.set_action_name('DescribeRegions') # API 操作の名前。RPC スタイルの API 操作を呼び出すときは、set_action_name() を構成して API 操作の名前を指定する必要があります。
request.set_method('POST') # API 操作のリクエスト メソッド。
request.set_protocol_type('HTTPS') # リクエスト プロトコル。有効な値:HTTP および HTTPS。HTTPS を使用することをお勧めします。
InstanceIds = [
"i-bp1axhql4dqXXXXXXXX",
"i-bp124uve8zqXXXXXXXX"
]
for depth1 in range(len(InstanceIds)):
request.add_query_param('InstanceId.' + str(depth1 + 1), InstanceIds[depth1])
request.add_query_param('PageNumber', '1')
request.add_query_param('PageSize', '30')
# リクエストを開始し、レスポンスを処理します。
response = client.do_action_with_exception(request)
print(response)
if __name__ == '__main__':
Sample.main()
例:RESTful スタイル (ROA スタイル) の API 操作を呼び出す
この例では、Container Service for Kubernetes (ACK) の DescribeClustersV1 操作を呼び出して、操作の汎用呼び出しを行う方法を示します。
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
class Sample:
@staticmethod
def main():
# AccessKey ペアを使用してリクエスト クライアントを直接初期化します。
client = AcsClient(
os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
'cn-hangzhou')
# リクエスト オブジェクトを作成します。
request = CommonRequest()
request.set_domain('cs.aliyuncs.com') # API 操作のエンドポイント。
request.set_version('2015-12-15') # API バージョン番号。
request.set_uri_pattern(
f'/api/v1/clusters') # API 操作の URL。ROA スタイルの API 操作を呼び出すときは、set_uri_pattern() を構成して API 操作の完全な URL を指定する必要があります。API 操作の URL は、API メタデータから取得できます。
request.set_method('GET') # API 操作のリクエスト メソッド。
request.add_query_param('name', 'cluster-demo') # リクエスト パラメーターを構成します。
# リクエストを開始し、レスポンスを処理します。
response = client.do_action_with_exception(request)
print(response)
if __name__ == '__main__':
Sample.main()
よくある質問
「エラー:MissingParameter このリクエストの処理に必須の入力パラメーター「AccessKeyId」が指定されていません」というエラーメッセージが返された場合はどうすればよいですか?
原因:AccessKey ペアが正しく構成されていません。
解決策:
次のコマンドを実行して、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されているかどうかを確認します。
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%有効な AccessKey ペアが返された場合、環境変数は正しく構成されています。 AccessKey ペアが返されない場合、または無効な AccessKey ペアが返された場合は、必要に応じて環境変数を構成します。詳細については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。
コードで AccessKey ペアに関連するエラーを確認します。
エラーリクエストの例:
AccessKeyId = os.environ['yourAccessKeyID'], AccessKeySecret = os.environ['yourAccessKeySecret']説明上記のエラーリクエストの例では、os.environ の入力値が AccessKey ペアとして使用されています。ただし、この関数は環境変数から値を読み取るために使用されます。マシンで環境変数名を ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET として指定した後、os.environ は環境変数から値を読み取ることができます。
成功リクエストの例:
os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
「aliyunsdkcore.acs_exception.exceptions.ServerException: HTTP Status: 400 Error:MissingParameter このリクエストの処理に必須の入力パラメーター「Timestamp」が指定されていません」というエラーメッセージが返された場合はどうすればよいですか?
原因:uri_pattern パラメーターが RPC スタイルの API 操作の共通リクエストパラメーターで構成されています。
解決策:共通リクエストパラメーターから uri_pattern パラメーターを削除します。