JMESPath for Visual Studio Codeをつかってみる

vscodeでjsonファイルをJMESPathで評価して、出力パネルに結果を表示する拡張機能があったのでつかってみます。

## JMESPath for Visual Studio Codeのインストール

vscodeのマーケットプレイスにあるので、こちらをインストールします。

[JMESPath for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=jamesls.jmespath-vscode)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b5cfa04c-067d-e942-833d-504a83b308e4.png)

## JMESPath for Visual Studio Codeで整形してみる

今回は[aws ec2 describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instances.html)　のサンプルにあるOutputを少し手直しした、下記jsonをdescribe-instances.jsonとして保存して、このjsonファイルを整形してみます。

今回、ドキュメントにあるexsampleを実際にパースしてみようとして気が付きましたが、2022年4月現在。サンプルとして表示されているoutput。 jsonとしておかしいですね……

ダブルコーテーションが抜けてる所があったり、カンマがない所があったり、何箇所がおかしい部分がありますね……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4b30e7e1-8935-c9da-a7bc-72a4a9021949.png)

```json:describe-instances.json
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0abcdef1234567890",
                    "InstanceId": "i-1234567890abcdef0",
                    "InstanceType": "t2.micro",
                    "KeyName": "MyKeyPair",
                    "LaunchTime": "2018-05-10T08:05:20.000Z",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-2a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-10-0-0-157.us-east-2.compute.internal",
                    "PrivateIpAddress": "10.0.0.157",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "State": {
                        "Code": 0,
                        "Name": "pending"
                    },
                    "StateTransitionReason": "",
                    "SubnetId": "subnet-04a636d18e83cfacb",
                    "VpcId": "vpc-1234567890abcdef0",
                    "Architecture": "x86_64",
                    "BlockDeviceMappings": [],
                    "ClientToken": "",
                    "EbsOptimized": false,
                    "Hypervisor": "xen",
                    "NetworkInterfaces": [
                        {
                            "Attachment": {
                                "AttachTime": "2018-05-10T08:05:20.000Z",
                                "AttachmentId": "eni-attach-0e325c07e928a0405",
                                "DeleteOnTermination": true,
                                "DeviceIndex": 0,
                                "Status": "attaching"
                            },
                            "Description": "",
                            "Groups": [
                                {
                                    "GroupName": "MySecurityGroup",
                                    "GroupId": "sg-0598c7d356eba48d7"
                                }
                            ],
                            "Ipv6Addresses": [],
                            "MacAddress": "0a:ab:58:e0:67:e2",
                            "NetworkInterfaceId": "eni-0c0a29997760baee7",
                            "OwnerId": "123456789012",
                            "PrivateDnsName": "ip-10-0-0-157.us-east-2.compute.internal",
                            "PrivateIpAddress": "10.0.0.157",
                            "PrivateIpAddresses": [
                                {
                                    "Primary": true,
                                    "PrivateDnsName": "ip-10-0-0-157.us-east-2.compute.internal",
                                    "PrivateIpAddress": "10.0.0.157"
                                }
                            ],
                            "SourceDestCheck": true,
                            "Status": "in-use",
                            "SubnetId": "subnet-04a636d18e83cfacb",
                            "VpcId": "vpc-1234567890abcdef0",
                            "InterfaceType": "interface"
                        }
                    ],
                    "RootDeviceName": "/dev/xvda",
                    "RootDeviceType": "ebs",
                    "SecurityGroups": [
                        {
                            "GroupName": "MySecurityGroup",
                            "GroupId": "sg-0598c7d356eba48d7"
                        }
                    ],
                    "SourceDestCheck": true,
                    "StateReason": {
                        "Code": "pending",
                        "Message": "pending"
                    },
                    "Tags": [],
                    "VirtualizationType": "hvm",
                    "CpuOptions": {
                        "CoreCount": 1,
                        "ThreadsPerCore": 1
                    },
                    "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "open"
                    },
                    "MetadataOptions": {
                        "State": "pending",
                        "HttpTokens": "optional",
                        "HttpPutResponseHopLimit": 1,
                        "HttpEndpoint": "enabled"
                    }
                }
            ],
            "OwnerId": "123456789012",
            "ReservationId": "r-02a3f596d91211712"
        }
    ]
}
```

今回は上記のjsonに対して下記のクエリを投げてみます。

```text
Reservations[].Instances[].{InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value|[0],InstanceType:InstanceType,AvailabilityZone:Placement.AvailabilityZone,VirtualizationType:VirtualizationType,PIP:NetworkInterfaces[].PrivateIpAddress[]| join(`,`,@),Tenancy:Placement.Tenancy}
```

実行方法はJsonファイルを開いた状態で、コマンドパレット（CTRL+SHIFT+P）から`JMESPath: Evaluate Expression`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/69933b80-4894-086f-24ff-b3d3a35516e9.png)

入力欄が出てくるので、クエリを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2c719976-f3b2-9965-eabb-9ab65cf6f05f.png)

出力に表示されるJMESPathにクエリ結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8d63dc82-6feb-fda5-27aa-9ebcf70a6e3a.png)

## 総評

何かしらJSONファイルを用意して、色々とJMESPathを試して見ると学習にはいいのかもしれません。