aliyun CLI チートシート（jmespath）

 ## はじめに
CLIで取得した情報を整理して表示したいということは運用をしていればたまーに必要になることがあると思います。目的はいろいろあると思いますが、個人的に業務で使って便利だったものを備忘録として載せておきます。ここに記載せれているもの以上に他にもさまざまなオプションや活用方法があるので気が向いた時に加筆していこうと思います。

## 前提
執筆時のクライアントバージョンは3.0.127
```bash
 $ aliyun version
3.0.127
```
## 出力の制御
### 基本
普通にコマンドを入力するとJson形式で全ての情報が出力されます。
```bash
$ aliyun ecs DescribeInstances
{
	"Instances": {
		"Instance": [
			{
				"AutoReleaseTime": "",
				"ClusterId": "",
				"Cpu": 8,
				"CpuOptions": {
					"CoreCount": 4,
					"Numa": "",
					"ThreadsPerCore": 2
				},
				"CreationTime": "2022-11-30T08:19Z",
				"CreditSpecification": "",
				"DedicatedHostAttribute": {
					"DedicatedHostClusterId": "",
					"DedicatedHostId": "",
					"DedicatedHostName": ""
				},
				"DedicatedInstanceAttribute": {
					"Affinity": "",
					"Tenancy": ""
				},
				"DeletionProtection": false,
				"DeploymentSetId": "",
				"Description": "ESS",
				"DeviceAvailable": true,
				"EcsCapacityReservationAttr": {
					"CapacityReservationId": "",
					"CapacityReservationPreference": ""
				},
				以下略
```
### --outputオプション + cols
`---oution`もしくは`-o`をコマンドにつけると、必要な出力のみを表示させることが可能。
`-o`指定時に同時に必須となる`cols`で制御する。
出力例は以下の通り
```bash
$ aliyun ecs DescribeInstances -o cols=Instances.Instance[0].InstanceName
Instances.Instance[0].InstanceName
----------------------------------
instance01
```
コマンドの出力にたいして表示したい値にcolsでアクセスができる。結果はcolsが列名となる表形式で表示される。

複数取得することも可能。
```bash
$ aliyun ecs DescribeInstances -o cols=Instances.Instance[0].InstanceName,Instances.Instance[0].Status
Instances.Instance[0].InstanceName | Instances.Instance[0].Status
---------------------------------- | ----------------------------
instance01                         | Running
```
でもこれでは記述は冗長な割に、表示量はすくなり。なんならインスタンス全ての情報が欲しい。みたいなことはよくあること。そこで使うのがrows(jmespath)

### --option + cols + rows
さまざまなCLIでも利用されるjmespathですが、aliyunでも利用可能です。これによって、より自由な出力取得が可能。例えば上記と同じ結果を取得する場合はこう書きます。

:::note warn
落とし穴
rowsの条件は全体をダブルコーテーションで囲み、中で使われる文字列をシングルコーテーションで囲みます。どちらか一つしか使わない場合はこの限りではありません。
:::

```bash
$ aliyun ecs DescribeInstances -o cols=InstanceName,Status rows='Instances.Instance[]'
InstanceName  | Status
------------  | ------
instance01    | Running
instance02    | Running
instance03    | Stopped
(以下略)
```
簡単に解説すると、rowsで出力を絞り込みます。その中で表示したい要素をcolsで指定して出力します。条件を追加することもできます。
#### 条件付き出力
- 条件と等しいものを出力
```bash
$ aliyun ecs DescribeInstances -o cols=InstanceName,Status rows="Instances.Instance[?Status == 'Running']"
InstanceName  | Status
------------  | ------
instance01    | Running
instance02    | Running
(以下略)
```
- ある文字列を含むものを出力
```bash
$ aliyun ecs DescribeInstances -o cols=InstanceName,Status 
rows="Instances.Instance[?contains(Status, 'Run')]"
InstanceName  | Status
------------  | ------
instance01    | Running
instance02    | Running
(以下略)
```

#### ネストの深さが違う値をまとめて表示したい
欲しい情報を集めたオブジェクトを作り、それをcolsで指定して表示する。
```bash
$ aliyun ecs DescribeInstances --output cols=InstanceName,Status,IpAddress rows="Instances.Instance[].{InstanceName: InstanceName, Status: Status, IpAddress: VpcAtIpAddress.IpAddress[0]}"
InstanceName  | Status  | IpAddress
------------  | ------  | ---------
instance01    | Running | 10.2.15.116
instance02    | Running | 10.2.0.6
instance03    | Stopped | 10.2.7.252
```

今回はここまで。