awscliのqueryオプションについて

どうもごきげんまるです。
前回のブログから3か月か経過し、もう書く必要がないんじゃないかと思い始めてます。

桜、散っちゃいますね。
ごきげんまるの頭の中からもはてなのブログの書き方がきれいさっぱり散っています(笑)

ということで、今日はawscliのqueryオプションについてです。

AWSCLIのqueryオプション

以前のブログで、show系のコマンド(AWSCLIではdescribeやlistです)を多く使うと書きましたが、このshow系のコマンド実際に実行するとすべての情報が出力されるので結構見づらいことが多いです。
そもそもですが、必要な情報というのはピンポイントでほしかったりするので、大量に出力されても該当の情報を見るのが大変。。。
ということで、出力される情報を制限することが結果として正しいオペレーションにつながったりします。
また、このAWSCLIというコマンドですが、設定変更や起動・停止などをするときに、対象となるインスタンスやfunctionなどの名前だけでは引数としては足らず、IDやARNなど、コマンドによって必要となる情報が違います。
手動実行であれば都度必要な引数に合わせた情報をメモなどに残してということもできますが、スクリプトなどを仕込んで自動化しようとすると都度メモはできないので、show系のコマンドの出力結果を変数に叩き込んで、実際の変更コマンドを実行するなどの工夫が必要です。

その時に必要となるのが--queryというオプション。

使いこなせればかなり便利(決して自分が使いこなしているとは言えないけど。。。)なので、積極的に利用して覚えていくのがいいかと思います。
ということで、実際に使うとどうなるか書いていきます。


よくあるec2で見てみます。
対象のアカウントで作成されているec2インスタンスの設定を見るには"aws ec2 describe-instances"を使います。

$ aws ec2 describe-instances
{
    "Reservations": [
        {
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "ec2-1-2-3-4.ap-northeast-1.compute.amazonaws.com",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "EbsOptimized": false,
                    "PublicIpAddress": "1.2.3.4",
                    "PrivateIpAddress": "10.0.0.4",
                    "ProductCodes": [],
                    "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
                    "CpuOptions": {
                        "CoreCount": 1,
                        "ThreadsPerCore": 1
                    },
                    "StateTransitionReason": "",
                    "InstanceId": "i-1234567890",
                    "EnaSupport": true,
                    "ImageId": "ami-123456789",
                    "PrivateDnsName": "ip-10-0-0-4.ap-northeast-1.compute.internal",
                    "KeyName": "MyKeyName",
                    "SecurityGroups": [
                        {
                            "GroupName": "launch-wizard-1",
                            "GroupId": "sg-xxxxxxxxxxxxxxxxx"
                        }
                    ],
                    "ClientToken": "",
                    "SubnetId": "subnet-123456789",
                    "InstanceType": "t2.micro",
                    "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "open"
                    },
                    "NetworkInterfaces": [
                        {
                            "Status": "in-use",
                            "MacAddress": "01:02:03:04:05:06",
                            "SourceDestCheck": true,
                            "VpcId": "vpc-XXXXXXXXXXXXXXXXX",
                            "Description": "Primary network interface",
                            "NetworkInterfaceId": "eni-123456789",
                            "PrivateIpAddresses": [
                                {
                                    "PrivateDnsName": "ip-10-0-0-4.ap-northeast-1.compute.internal",
                                    "PrivateIpAddress": "10.0.0.4",
                                    "Primary": true,
                                    "Association": {
                                        "PublicIp": "1.2.3.4",
                                        "PublicDnsName": "ec2-1-2-3-4.ap-northeast-1.compute.amazonaws.com",
                                        "IpOwnerId": "amazon"
                                    }
                                }
                            ],
                            "PrivateDnsName": "ip-10-0-0-4.ap-northeast-1.compute.internal",
                            "Attachment": {
                                "Status": "attached",
                                "DeviceIndex": 0,
                                "DeleteOnTermination": true,
                                "AttachmentId": "eni-attach-123456789",
                            },
                            "Groups": [
                                {
                                    "GroupName": "launch-wizard-1",
                                    "GroupId": "sg-123456789"
                                }
                            ],
                            "Ipv6Addresses": [],
                            "OwnerId": "xx##$$##XX",
                            "PrivateIpAddress": "10.0.0.4",
                            "SubnetId": "subnet-123456789",
                            "Association": {
                                "PublicIp": "1.2.3.4",
                                "PublicDnsName": "ec2-1-2-3-4.ap-northeast-1.compute.amazonaws.com",
                                "IpOwnerId": "amazon"
                            }
                        }
                    ],
                    "SourceDestCheck": true,
                    "Placement": {
                        "Tenancy": "default",
                        "GroupName": "",
                        "AvailabilityZone": "ap-northeast-1a"
                    },
                    "Hypervisor": "xen",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "Status": "attached",
                                "DeleteOnTermination": true,
                                "VolumeId": "vol-123456789",
                            }
                        }
                    ],
                    "Architecture": "x86_64",
                    "RootDeviceType": "ebs",
                    "RootDeviceName": "/dev/xvda",
                    "VirtualizationType": "hvm",
                    "HibernationOptions": {
                        "Configured": false
                    },
                    "AmiLaunchIndex": 0
                }
            ],
            "ReservationId": "r-xxxxxxxxxxxxxxxx",
            "Groups": [],
            "OwnerId": "xx##$$##XX"
        }
    ]
}

このコマンド、ec2インスタンスの情報が大量に出てくるので、必要な情報を探すのは大変…。
というときにいいのがqueryオプション。
例えばPrivateIpAddressだけ知りたいときとかは以下のようにqueryオプションで絞れます。

$ aws ec2 describe-instances --query 'Reservations[].Instances[].PrivateIpAddress'
[
    "10.0.0.4"
]

こんな感じでqueryオプションを使うとほしい情報だけに出力を絞れます。
これ、結構便利なんですよねー。
EC2だとインスタンスIDとかの情報をよく使ったりするのですが、その場合は以下のようにします。

$ aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId'

[
    "i-1234567890"
]

便利、超便利。
この便利なqueryですが、お作法があります。

・まず、コマンドのオプションは以下のように記載する。
  --query
・検索する情報は'(シングルクォーテーション)で囲う。

aws ec2 describe-instances --query 'ここにqueryの条件を入れる'

となります。
これは覚えてしまってください。

そしてqueryを使うとき、意識するのはjsonファイルの構造。
例えば上で使ってるインスタンスIDを出力させるためのコマンドで説明すると、

aws ec2 describe-instances --query 'Reservations.Instances.InstanceId'
これは
aws ec2 describe-instances で出てくる情報の

Reservations という階層にある
 Instances という階層にある
  InstanceId の情報を出力する
となります。
つまり

{
    "Reservations": [
        {
            "Instances": [
                {
                    "InstanceId": "i-1234567890",  <-ここの情報が取れる
                }
            ]
        }
    ]
}

こんな感じ?
わかるといいんですが…。


ということで、queryオプションが便利という話でした。
ほんと触りだけしか書いてないのですが、これだけでも便利なのが伝わるんじゃないかなと思います。





え、伝わらない?











伝われ(笑)


明日はAnsible Night in Tokyo 2019.04にイッテキマスー