夏本番です。セミの鳴き声があちこち聞こえてきます。まだまだ続く在宅勤務。この季節に外でのマスクはかなり堪えるので大変助かります。助かっていないのは体重だけです。増加が止まりませぬ。。。
さて、前回に続き、AWS CLI
を使ったMediaLive
の制御についてもう少し深く踏み込みたいと思います。
#留意点
-
AWS CLI version 2
を使っています。 -
AWS CLI
を実行できる環境の用意が必要です。 - この記事のターゲット層は
AWS CLI
の基本的な使い方とJSON
構文の基礎知識をお持ちの方となります。
#JMESPathとは
JMESPath
とはJSON
形式の結果を抽出・加工することのできるAWS CLI
で使われるクエリ言語です。
AWS CLI
はリソースの情報をリストアップするだけではなく、設定のアップデートやリソースの削除など様々な場面で登場します。ですが、管理リソースが増えれば増えるほど、どれがどれだか混乱しますし、そのままフィルターせずに表示される情報が多く見辛い場合もありますよね。そこで--query
コマンドを工夫すれば表示結果をより分析しやすい形で出力させることができます。
#利用ケース
- 必要な情報のみ抽出したい場合
- 抽出した検索結果を別処理のために他のソフトウェアやスクリプトなどに引き渡したい場合
#準備
- 今回もAWSサービスとして
AWS Elemental MediaLive
を例に紹介していきます。 -
MediaLive
のChannel名はtest-medialive-channel-2020
とします。 -
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/