AWS CLI の出力フォーマットが text の場合に query オプションで先頭の配列要素のみ絞り込みしたが複数要素が返ってしまったときの対処方法

コマンドに 「--no-paginate」 を含めて実行

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

CodeDeploy で成功した最新のデプロイ ID を取得するために、下記の AWS CLI を実行しました。

「--output text」のオプションをコマンドに含め、さらに、query オプションで配列の先頭の要素を取得しようとしましたが、複数のデプロイ ID が返されました。

$ aws deploy list-deployments  \
 --application-name test-nakano-app \
 --deployment-group-name test-nakano-group \
 --include-only-statuses Succeeded \
 --output text \
 --query deployments[0]

d-NNNNNNNNN
d-YYYYYYYYY

想定通り、1つのデプロイ ID を返答させるにはどうすればよいでしょうか。

どう対応すればいいの?

コマンドに 「--no-paginate」 を含めて実行してください。

$ aws deploy list-deployments  \
 --application-name test-nakano-app \
 --deployment-group-name test-nakano-group \
 --include-only-statuses Succeeded \
 --output text \
 --query deployments[0] \
 --no-paginate

d-NNNNNNNNN

AWS CLI の--ouput の値に「text」を指定された場合は、コマンドのレスポンスにページネーションが含まれていると、各ページ毎に--query フィルタを実行する仕様となっています。

したがって、コマンドのレスポンスが 2 つの deployid を返却してしまった原因は、オプションで指定された「--query deployments[0]」をページ毎にフィルタ実行してしまったため、ページ毎の先頭にある deployid(合計 2 つ)を出力しまったことによるものです。

参考資料

指定する出力タイプによって、--query オプションの動作が変更されます。
--output text を指定した場合、出力は --query フィルタが適用される前にページ分割され、AWS CLI は出力の各ページで 1 回クエリを実行します。このため、クエリには各ページで最初に一致する要素が含まれており、予期しない余分な出力が発生する可能性があります。この余分な出力を回避するには、フィルターを結果の完全なセットにのみ適用するように --no-paginate を指定できますが、出力が長くなる可能性があります。出力をさらにフィルタリングするには、head や tail などの他のコマンドラインツールを使用できます

aws deploy list-deployments \
    --application-name WordPress_App \
    --create-time-range start=2014-08-19T00:00:00,end=2014-08-20T00:00:00 \
    --deployment-group-name WordPress_DG \
    --include-only-statuses Failed
Output:

{
    "deployments": [
        "d-EXAMPLE11",
        "d-EXAMPLE22",
        "d-EXAMPLE33"
    ]
}