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

さて、前回に続き、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/

元記事はこちら

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