LoginSignup
131
117

More than 5 years have passed since last update.

AWS CLI の query による絞り込み

Last updated at Posted at 2015-01-21

aws ec2 describe-うんちゃら で必要な情報を取得した時のメモ。
主に↓を参照しつつ、Try&Errorの結果。
http://jmespath.readthedocs.org/en/latest/specification.html

絞り込み方

コマンドとしては以下の形式で絞り込む。--query の条件はシングルクォート'でないとエラーとなる。

$ aws ec2 describe-instances --query '条件'

この時、条件として設定する文字列は、以下のような感じで考えるとやり易いかもしれない。

  • JSONの階層構造を意識する
  • 表示項目を絞り込む
  • 表示対象を絞り込む

例えば aws ec2 describe-instances の実行結果を見ると、Reservations がトップレベルにあるのがわかる。

{
    "Reservations": [
        {
            "OwnerId": "XXXXXXXXXXXX",
            "ReservationId": "r-XXXXXXXX",
            "Groups": [],
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
:
:

なので、単純に Reservations 以下を表示させる場合は、

$ aws ec2 describe-instances --query 'Reservations[]'

とすることで、以下のように一階層下からの表示に絞り込める。

[
    {
        "OwnerId": "XXXXXXXXXXXX",
        "ReservationId": "r-XXXXXXXX",
        "Groups": [],
        "Instances": [
            {
                "Monitoring": {
                    "State": "disabled"
                },
:
:

さらに下の階層に絞る場合は . で繋げれば良い。

$ aws ec2 describe-instances --query 'Reservations[].Instances[]'
[
    {
        "Monitoring": {
            "State": "disabled"
        },
        "PublicDnsName": null,
        "Platform": "windows",
        "State": {
            "Code": 80,
            "Name": "stopped"
:
:

次に、表示対象を絞る場合、. で繋げた後に [] もしくは {} で囲った中に表示対象を記載すれば良い。
[] の場合は配列表示、{} の場合はハッシュ表示となる。

配列時
$ aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId]'
[
    [
        "i-AAAAAAAA"
    ],
    [
        "i-BBBBBBBB"
    ],
    [
        "i-CCCCCCCC"
    ],
:
:

ハッシュ時は任意のKeyを追加する必要がある。指定しないとエラー。

ハッシュ時
$ aws ec2 describe-instances --query 'Reservations[].Instances[].{ID:InstanceId}'
[
    {
        "ID": "i-AAAAAAAA"
    },
    {
        "ID": "i-BBBBBBBB"
    },
    {
        "ID": "i-CCCCCCCC"
    },:
:

ただ、このままだと全てのインスタンスが対象となるので、そこで絞り込みが必要となる。
表示階層を指定している [] 内にその配下にある項目に対して条件を [?項目名==`値`] という形式で記載する。値をバッククォートで囲うのが要注意。

$ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceId==`i-AAAAAAAA`].[InstanceId]'
[
    [
        [
            "i-AAAAAAAA"
        ]
    ],
    [],
    [],
    [],
    [],
:
:

しかし、空要素も表示されてしまうため、表示部分の末尾に [] を追加することで空要素を非表示にできる。
なぜ、[] で良いのかは不明。。。一階層下がることで空は消えるのか?

$ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceId==`i-AAAAAAAA `].[InstanceId][]'
[
    [
        "i-AAAAAAAA"
    ]
]

基本的には今までの考え方を組み合わせていくのみ。
応用的に色々あるみたいだが、Try&Errorの結果ベースなので説明は無理。。。

実行例

以下は簡単なシナリオ想定での例。

Tag名からインスタンス情報を取得したい

おそらくは、サーバホスト名=Tag名という設計が多いはず。

$ aws ec2 describe-instances --query 'Reservations[].Instances[?Tags[?Key==`Name`].Value|[0]==`TAG_NAME`][]|[0]'

Tag名からInstanceIdのみ取得する場合。

aws ec2 describe-instances --query 'Reservations[].Instances[?Tags[?Key==`Name`].Value|[0]==`TAG_NAME`][].[InstanceId][]|[0]'

インスタンス一覧が見たい

サマリ的な情報を見たいときとか。IPやらタグ名やら状態やら。

aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[?Key==`Name`].Value|[0],InstanceType:InstanceType,State:State.Name,Ip:PrivateIpAddress,AZ:Placement.AvailabilityZone,Platform:Platform},&Tags)' --output table                       |

サブネットの一覧を見たい

どのAZにどんなサブネットがあって、そのIDとかちょっと見たいなぁという時に。

aws ec2 describe-subnets --query 'Subnets[].{VpcId:VpcId,Cidr:CidrBlock,AZ:AvailabilityZone,SubnetId:SubnetId,Tags:Tags[?Key==`Name`].Value|[0]}' --output table

AZ順にソートもできる。

aws ec2 describe-subnets --query 'sort_by(Subnets[].{VpcId:VpcId,Cidr:CidrBlock,AZ:AvailabilityZone,SubnetId:SubnetId,Tags:Tags[?Key==`Name`].Value|[0]},&AZ)' --output table
131
117
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
131
117