AWS CLIでAWS Elemental MediaLiveを制御する Part 2

夏本番です。セミの鳴き声があちこち聞こえてきます。まだまだ続く在宅勤務。この季節に外でのマスクはかなり堪えるので大変助かります。助かっていないのは体重だけです。増加が止まりませぬ。。。

さて、[前回](https://qiita.com/afadhli/items/218ba4fb5ebcd52af5c4)に続き、`AWS CLI`を使った`MediaLive`の制御についてもう少し深く踏み込みたいと思います。

#留意点
* `AWS CLI version 2`を使っています。
* `AWS CLI`を実行できる環境の用意が必要です。
* この記事のターゲット層は`AWS CLI`の基本的な使い方と`JSON`構文の基礎知識をお持ちの方となります。

#JMESPathとは
`JMESPath`とは`JSON`形式の結果を抽出・加工することのできる`AWS CLI`で使われるクエリ言語です。

`AWS CLI`はリソースの情報をリストアップするだけではなく、設定のアップデートやリソースの削除など様々な場面で登場します。ですが、管理リソースが増えれば増えるほど、どれがどれだか混乱しますし、そのままフィルターせずに表示される情報が多く見辛い場合もありますよね。そこで`--query`コマンドを工夫すれば表示結果をより分析しやすい形で出力させることができます。

#利用ケース
* 必要な情報のみ抽出したい場合
* 抽出した検索結果を別処理のために他のソフトウェアやスクリプトなどに引き渡したい場合

#準備
1. 今回もAWSサービスとして`AWS Elemental MediaLive`を例に紹介していきます。
2. `MediaLive`のChannel名は`test-medialive-channel-2020`とします。
3. `JMESPath`を使うには`--query`をオプションとして付けます

##基本的な使い方（検索条件なし）

```
$ aws --profile test medialive list-inputs --query Inputs
$ aws --profile test medialive list-channels --query Channels
```

##完全一致 
検索フォーマット：``[?Key==`Value`]``

```
$ aws --profile test medialive list-channels --query 'Channels[?Name==`test-medialive-channel-2020`]'
[
    {
        "Arn": "arn:aws:medialive:ap-northeast-1:XXXXX:channel:XXXXX",
        "ChannelClass": "SINGLE_PIPELINE",
        "Destinations": [
            {
                "Id": "Dest01234",
                "MediaPackageSettings": [
                    {
                        "ChannelId": "hogehoge"
                    }
                ],
                "Settings": []
            }
        ],
        "EgressEndpoints": [
            {
                "SourceIp": "XX.XX.XX.XX"
            }
        ],
        "Id": "111111",
        "InputAttachments": [
            {
                "InputAttachmentName": "test-medialive-input-2020",
                "InputId": "XXXXXX",
                "InputSettings": {
                    "AudioSelectors": [
                        {
                            "Name": "Audio01234"
                        }
                    ],
                    "CaptionSelectors": [],
                    "DeblockFilter": "DISABLED",
                    "DenoiseFilter": "DISABLED",
                    "FilterStrength": 1,
                    "InputFilter": "AUTO",
                    "SourceEndBehavior": "CONTINUE"
                }
            }
        ],
        "InputSpecification": {
            "Codec": "AVC",
            "MaximumBitrate": "MAX_20_MBPS",
            "Resolution": "HD"
        },
        "Name": "test-medialive-channel-2020",
        "PipelinesRunningCount": 0,
        "RoleArn": "arn:aws:iam::YYYYY:role/MediaLiveAccessRole",
        "State": "IDLE",
        "Tags": {}
    }
]
```
NameとStateのみ抽出したい場合

```
$ aws --profile test medialive list-channels --query 'Channels[?Name==`test-medialive-channel-2020`].[Name,State]'
[
    [
        "test-medialive-channel-2020",
        "IDLE"
    ]
]
```
上記をKey:Valueパターンで表示させたい場合

```
$ aws --profile test medialive list-channels --query 'Channels[?Name==`test-medialive-channel-2020`].{Name: Name,State: State}'
[
    {
        "Name": "test-medialive-channel-2020",
        "State": "IDLE"
    }
]
```
##前方一致
検索フォーマット： ``[?starts_with(Key,`Value`]``

```
$ aws --profile test medialive list-channels --query 'Channels[?starts_with(Name,`test`)].{Name: Name,State: State}'
[
    {
        "Name": "test-medialive-channel-2020",
        "State": "IDLE"
    }
]
```

##後方一致
検索フォーマット： ``[?ends_with(Key,`Value`]``

```
$ aws --profile test medialive list-channels --query "Channels[?ends_with(Name,'2020')].{Name: Name}"
[
    {
        "Name": "test-medialive-channel-2020"
    }
]
```
上記の例では検索条件は`string`ではなく`digit`のためValueをシングルクオート(')で囲んで`--query`をダブルクオート(")で囲まないといけません。然もないと次のエラーが吐かれます。

```
In function ends_with(), invalid type for value: 2020, expected one of: ['string'], received: "number"
```
##部分一致
フォーマット： ``[?contains(Key,`Value`]``

```
$ aws --profile test medialive list-channels --query "Channels[?contains(Name,'medialive')].{Name: Name}"
[
    {
        "Name": "test-medialive-channel-2020"
    }
]
```

#最後に
ニーズに合わせてJMESPathでより複雑なフィルタリングができますが私がよく使っているのは上記の4つです。これさえ覚えておけば作業がグッと楽になるかと思います。物足りない！もっと高度なクエリーをしたい！という方は是非参考文献を一読してみては如何でしょうか。大変な時期ではありますがみんなで一緒に乗り越えましょう！

#参考文献
https://jmespath.org/
https://opensourceconnections.com/blog/2015/07/27/advanced-aws-cli-jmespath-query/