Alibaba Cloud CLI を使用して API を呼び出す際に、ページ分割されたすべてのデータを一度に取得したり、リソースが作成されるまで待機してから次に進んだり、コマンドを実際に実行せずにその正しさを検証したりする必要がある場合があります。本トピックでは、これら 3 つのシナリオを実現するためのグローバルパラメーターと、その設定方法について説明します。
適切なパラメーターの選択
これらはすべて、単一の API 呼び出しに適用されるグローバルパラメーターです。シナリオに応じてパラメーターを選択してください。
|
シナリオ |
パラメーター |
|
List API が 1 ページ分のデータしか返さないが、すべてのデータが必要な場合 |
|
|
リソースの作成後、そのステータスが準備完了になるまで待機する場合 |
|
|
コマンドを実際には実行せず、その正しさを検証する場合 |
|
相互排他のルール
-
--pagerと--waiterは併用できません。これらを組み合わせると、CLI は次のエラーを返します:ERROR: flag --pager is exclusive with --waiter -
--cli-dry-runは--pagerまたは--waiterと共存できますが、リクエストは送信されないため、ページネーションとポーリングは実行されません。
全ページの自動集計 (--pager)
基本的な使用方法
ページ分割に対応した任意の List/Describe API に --pager を追加します。CLI は自動的にすべてのページを反復処理し、結果を単一の出力にマージします。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --pager
2 つのページングモード
CLI は使用するモードを自動的に決定します。手動での設定は不要です。
-
PageNumberモード: API レスポンスにPageNumber、PageSize、TotalCountフィールドが含まれます。CLI は、すべてのページが取得されるまでページ番号をインクリメントします。 -
NextTokenモード: API レスポンスにNextTokenフィールドが含まれます。CLI は、NextTokenが空文字列になるまで、返されたNextTokenの値を次のリクエストパラメーターとして渡します。
レスポンスに空でない値を持つ NextToken フィールドが含まれている場合は NextToken モードが使用され、それ以外の場合は PageNumber モードが使用されます。
フィールドマッピング
以下のサブパラメーターはすべてオプションです。API がページネーション情報にデフォルト以外のフィールド名を使用している場合にのみ、そのフィールド名を CLI に伝えるために指定する必要があります。ほとんどの場合、--pager を追加するだけで十分です。
|
サブパラメーター |
デフォルト |
指定が必要なケース |
|
|
(なし) |
レスポンス内のデータ配列のパスがトップレベルにない場合 (例: |
|
|
PageNumber |
API がページ番号にデフォルトとは異なるフィールド名を使用している場合 |
|
|
PageSize |
API がページサイズにデフォルトとは異なるフィールド名を使用している場合 |
|
|
TotalCount |
API が総レコード数にデフォルトとは異なるフィールド名を使用している場合 |
|
|
NextToken |
API がページネーショントークンにデフォルトとは異なるフィールド名を使用している場合 |
構文: --pager key=value key=value。複数のサブパラメーターはスペースで区切ります。value は、API レスポンス内の実際のフィールド名であり、特定の値ではありません。たとえば、PageNumber=CurrentPage は、開始ページを指定しているのではなく、API がページ番号を表すために CurrentPage フィールドを使用していることを意味します。
カスタムフィールドマッピングの例
データ配列が API レスポンスの Vpcs.Vpc[] にネストされている場合:
aliyun vpc describe-vpcs --biz-region-id cn-hangzhou --pager path=Vpcs.Vpc[]
API が NextToken の代わりに Token を使用している場合 (xxx と list-yyy はコマンドのプレースホルダーです):
aliyun xxx list-yyy --biz-region-id cn-hangzhou --pager NextToken=Token
リソースステータスの待機 (--waiter)
基本的な使用方法
CLI は現在のコマンドを繰り返し呼び出し、expr 式を使用して各レスポンスから値を抽出します。抽出された値が to の値と等しくなるとポーリングを停止し、最後のレスポンスを返します。timeout と interval が指定されていない場合、CLI はデフォルトで最大 180 秒 (3 分間)、5 秒ごとにポーリングします。
aliyun ecs describe-instances \
--biz-region-id cn-hangzhou \
--instance-ids '["i-bp1xxxxx"]' \
--waiter expr='Instances.Instance[0].Status' to=Running
サブパラメーター
|
サブパラメーター |
必須 |
デフォルト |
値の範囲 |
説明 |
|
|
はい |
— |
— |
JSON レスポンス内でポーリング対象のフィールドを指定する JMESPath 式です。 |
|
|
はい |
— |
— |
ターゲット値です。 |
|
|
いいえ |
180 |
1~600 (秒) |
ポーリングの最大待機時間です。この期間内にターゲット値に一致しない場合、CLI はエラーを返して終了します。 |
|
|
いいえ |
5 |
2~10 (秒) |
ポーリング試行間の間隔です。 |
-
exprによって参照されるフィールドは、文字列型である必要があります。API レスポンス内のフィールドが数値または JSON ブール値 (true/false) である場合、CLI は直ちにエラーを返します。 -
toの値は、常に文字列として比較されます。ステータスが数値の場合、to=1と記述します (to=1.0ではありません)。API がブール値を文字列として返す場合 (例:"true")、to=trueと記述します。 -
ポーリング中に API 呼び出しが HTTP エラーを返した場合、CLI は直ちに停止し、再試行せずにエラーを出力します。
-
timeoutで指定した期間が経過してもターゲット値に一致しない場合、CLI はゼロ以外の終了コードで終了し、stderrに以下の内容を出力します:wait 'Instances.Instance[0].Status' to 'Running' timeout(180seconds), last='Pending'lastの値は、最後のポーリングで取得された実際の値を示します。
ポーリング頻度の制御
ポーリング間隔を短縮する (最大 30 秒待機し、2 秒ごとにポーリング):
aliyun ecs describe-instances \
--biz-region-id cn-hangzhou \
--instance-ids '["i-bp1xxxxx"]' \
--waiter expr='Instances.Instance[0].Status' to=Running timeout=30 interval=2
起動に時間がかかるリソースの待機時間を延長する (最大 10 分待機し、10 秒ごとにポーリング):
aliyun ecs describe-instances \
--biz-region-id cn-hangzhou \
--instance-ids '["i-bp1xxxxx"]' \
--waiter expr='Instances.Instance[0].Status' to=Running timeout=600 interval=10
実行なしのコマンド検証 (--cli-dry-run)
基本的な使用方法
コマンドに追加すると有効になるブール型のスイッチで、値を割り当てる必要はありません。CLI はリクエストを完全に構築してその詳細を出力しますが、サーバーには送信しません。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --cli-dry-run
出力内容
出力には、HTTP メソッド、Endpoint、API Action、Query Parameters が含まれます。これにより、Endpoint が正しいか、パラメーターのシリアル化が期待どおりかを確認できます。
出力例:
============================================================
DRY-RUN MODE: Request Details (No actual API call)
============================================================
Method: POST
URL:
Endpoint: ecs.cn-hangzhou.aliyuncs.com
API Version: 2014-05-26
API Action: DescribeInstances
Protocol: HTTPS
Style: RPC
Query Parameters:
RegionId: cn-hangzhou
============================================================
Request NOT sent (dry-run mode)
============================================================
{
"message": "dry-run mode - no request sent"
}
典型的なシナリオ
-
機密性の高い操作 (
delete-instanceやstop-instanceなど) を実行する前のプレビュー。パラメーターが正しいことを確認した後、--cli-dry-runを削除してコマンドを実行します。 -
CI/CD パイプラインにおけるコマンド構成の正しさの検証 (リソースの消費やコストの発生なし)。
自動化シナリオ:非同期ワークフローの完了
シナリオ: VPC を作成し、そのステータスが「利用可能」になったら、VPC の全リストを取得します。以下では、3 つのパラメーターが連携して非同期操作を完了させる仕組みを説明します。
ステップ 1: --cli-dry-run で作成コマンドを検証
aliyun vpc create-vpc \
--biz-region-id cn-hangzhou \
--cidr-block 172.16.0.0/12 \
--vpc-name test-vpc \
--cli-dry-run
Endpoint とパラメーターのシリアル化が正しいことを確認した後、--cli-dry-run を削除してコマンドを実行します。
ステップ 2: 作成コマンドを実行し、VPC ID を抽出
VPC_ID=$(aliyun vpc create-vpc \
--biz-region-id cn-hangzhou \
--cidr-block 172.16.0.0/12 \
--vpc-name test-vpc \
--cli-query 'VpcId')
--cli-query は、レスポンスから VPC ID を抽出します。
ステップ 3: --waiter で VPC が利用可能になるまで待機
CLI は、ステータスが Available に変わるか、60 秒のタイムアウトに達するまで、5 秒ごとにポーリングします:
aliyun vpc describe-vpcs \
--biz-region-id cn-hangzhou \
--vpc-id "$VPC_ID" \
--waiter expr='Vpcs.Vpc[0].Status' to=Available timeout=60
ステップ 4: --pager ですべての VPC を取得
VPC が多数存在する場合、--pager を使用しないと最初のページしか返されず、新規作成した VPC が表示されないことがあります。--pager を使用して、新しく作成された VPC がリストに含まれていることを確認します:
aliyun vpc describe-vpcs --biz-region-id cn-hangzhou --pager
ステップ 5: VPC の削除 (オプション)
先ほど作成した VPC を削除します:
aliyun vpc delete-vpc --vpc-id $VPC_ID
よくある質問
--pager と --waiter は併用できますか?
いいえ、併用できません。これらは相互排他的です。CLI は次のエラーを返します: ERROR: flag --pager is exclusive with --waiter。リソースが利用可能になるのを待ってから完全なリストを取得する必要がある場合は、2 つのコマンドを別々に使用してください。