AWS CLIでAWS Elemental MediaLiveを制御する

こんにちは。streampackのfadoです。
蒸し暑い季節到来ですね。ここ最近家を出る機会（というより籠らざるを得ない状況？）がめっきりと減ったのでそろそろ運動をしないとまずいなーと思いながら昨日もオレオを一箱食べました。やれやれ。それはさておき、仕事でAWS コマンドラインインタフェース(`AWS CLI`)を使ってリソースを作成する作業が増えてきたのでそのちょっとした知識を共有したいと思い、今回のテーマにしました。

#はじめに
`AWS Media Services`のプラットフォームを構築する際にいつもコンソール上で対応していますがツールを使っての作業方法も知っておく必要があると気づくようになりました。よって今回は私が頻繁に使っている`AWS CLI`を`AWS Media Services`の一つのサービス、`AWS Elemental MediaLive`に絞って簡単に説明していきたいと思います。

#AWS CLIはこういう時に役立つ
* 複数のAWS サービスを制御したい時
* リソースを一斉作成したい時（e.g. MediaLive InputsとChannelsを10個同時作成するなど）
* スクリプトと組み合わせて自動化したい時

#注意事項
* `AWS CLI` version 2を使っています。Version 1も問題ないですが推奨されているVersion 2にしました。
* `AWS CLI`を実行するにあたり、リソースへの適切な権限が付与されたことを前提に説明します。
* ~/.aws/configにregionを記載すればコマンドライン上での指定を省略できます(設定ファイルは各環境により異なる可能があります)

```
[profile test]
region = ap-northeast-1
output = json
```

#実行方法
1.コマンドラインに設定をパラメーターとして指定して実行する方法
2.パラメーターにJSONファイルを指定して実行する方法

シンプルな設定ならパラメーターとしてそのまま指定はしますが、`MediaLive`の`create-channel`コマンドのように複雑な設定を要する場合はJSONファイルを用意した方がわかりやすくかつ簡単かなと。JSONファイルの用意は少々面倒なところもありますが、各リソースがどういった構造や設定になっているか触っていくうちに理解も深まります。JSON構文の知見があまりない方でも慣れていくいいチャンスだと思います（自分もその一人なので）

#よく利用するパラメーター/オプション

* 各パラメーターのhelpを表示させる

```
$ aws --profile test medialive  help
$ aws --profile test medialive create-input-security-group help
```
* `--generate-cli-skeleton`で設定可能サンプルJSONを表示させる（JSONファイルで指定したい場合）

```
$ aws --profile test mediapackage create-channel --generate-cli-skeleton
{
    "Description": "",
    "Id": "",
    "Tags": {
        "KeyName": ""
    }
}
```

* list-xxxx (e.g.`list-channels`)で既存リソースを表示させる

```
$ aws --profile test medialive list-input-security-groups
```

#AWS Elemental MediaLive
##Input-security-groups
###create-input-security-group
1. 設定をパラメーターとして指定するパターン

* 実行コマンド

```
$ aws --profile test medialive create-input-security-group --whitelist-rules Cidr=0.0.0.0/0 --tags Name=TestSecGroup,Project=Test
```
* 結果

```
{
    "SecurityGroup": {
        "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:inputSecurityGroup:YYYY",
        "Id": "YYYY",
        "Inputs": [],
        "State": "IDLE",
        "Tags": {
            "Project": "Test",
            "Name": "TestSecGroup"
        },
        "WhitelistRules": [
            {
                "Cidr": "0.0.0.0/0"
            }
        ]
    }
}
```
2.JSONファイルを指定し、実行するパターン

* JSONファイル

```
$ cat input-security-group.json
{
    "Tags": {
        "Name": "TestSecGroup",
        "Project": "Test"
    },
    "WhitelistRules": [
        {
            "Cidr": "0.0.0.0/0"
        }
    ]
}
```
* 実行コマンド

```
$ aws --profile test medialive create-input-security-group --cli-input-json file://input-security-group.json
```
* 結果

```
{
    "SecurityGroup": {
        "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:inputSecurityGroup:YYYY",
        "Id": "YYYY",
        "Inputs": [],
        "State": "IDLE",
        "Tags": {
            "Project": "Test",
            "Name": "TestSecGroup"
        },
        "WhitelistRules": [
            {
                "Cidr": "0.0.0.0/0"
            }
        ]
    }
}
```
###describe-input-security-group
パラメーターとして`--input-security-group-id`を指定する

* 実行コマンド

```
$ aws --profile test medialive describe-input-security-group --input-security-group-id YYYY
```
* 結果

```
{
    "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:inputSecurityGroup:YYYY",
    "Id": "YYYY",
    "Inputs": [],
    "State": "IDLE",
    "Tags": {
        "Project": "Test",
        "Name": "TestSecGroup"
    },
    "WhitelistRules": [
        {
            "Cidr": "0.0.0.0/0"
        }
    ]
}
```

###delete-input-security-group
パラメーターとして`--input-security-group-id`を指定する

* 実行コマンド

```
$  aws --profile test medialive delete-input-security-group --input-security-group-id YYYY
```
* 結果
`delete-input-security-group`の場合、結果は表示されませんのでご注意ください。

##Inputs
###create-input
`RTMP_PUSH`で作成する場合

1.設定をパラメーターとして指定するパターン

* 実行コマンド

```
$ aws --profile test medialive create-input --destination StreamName=test/live_A StreamName=test/live_B --input-security-groups YYYY --name test-input-001 --type RTMP_PUSH
```
* 結果

```
{
    "Input": {
        "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:input:ZZZZ",
        "AttachedChannels": [],
        "Destinations": [
            {
                "Ip": "XX.XX.XX.XX",
                "Port": "1935",
                "Url": "rtmp://XX.XX.XX.XX:1935/test/live_A"
            },
            {
                "Ip": "YY.YY.YY.YY",
                "Port": "1935",
                "Url": "rtmp://YY.YY.YY.YY:1935/test/live_B"
            }
        ],
        "Id": "ZZZZ",
        "InputClass": "STANDARD",
        "InputSourceType": "STATIC",
        "MediaConnectFlows": [],
        "Name": "test-input-001",
        "SecurityGroups": [
            "XXXX"
        ],
        "Sources": [],
        "State": "DETACHED",
        "Tags": {},
        "Type": "RTMP_PUSH"
    }
}
```

2.JSONファイルを指定し、実行するパターン

* JSONファイル

```
{
    "Destinations": [
        {
            "StreamName": "test/live_A"
        },
        {
            "StreamName": "test/live_B"
        }
    ],
    "InputSecurityGroups": [
        "XXXX"
    ],
    "Name": "test-input-001",
    "Type": "RTMP_PUSH"
}
```
* 実行コマンド

```
$ aws --profile test medialive create-input file://{FILENAME}.json
```
* 結果

```
{
    "Input": {
        "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:input:ZZZZ",
        "AttachedChannels": [],
        "Destinations": [
            {
                "Ip": "XX.XX.XX.XX",
                "Port": "1935",
                "Url": "rtmp://XX.XX.XX.XX:1935/test/live_A"
            },
            {
                "Ip": "YY.YY.YY.YY",
                "Port": "1935",
                "Url": "rtmp://YY.YY.YY.YY:1935/test/live_B"
            }
        ],
        "Id": "ZZZZ",
        "InputClass": "STANDARD",
        "InputSourceType": "STATIC",
        "MediaConnectFlows": [],
        "Name": "test-input-001",
        "SecurityGroups": [
            "XXXX"
        ],
        "Sources": [],
        "State": "DETACHED",
        "Tags": {},
        "Type": "RTMP_PUSH"
    }
}
```

###describe-input
`--input-id`をパラメーターとして指定する

* 実行コマンド

```
$ aws --profile test medialive describe-input --input-id 5770059
```
* 結果

```
{
    "Arn": "arn:aws:medialive:ap-northeast-1:XXXX:input:ZZZZ",
    "AttachedChannels": [],
    "Destinations": [
        {
            "Ip": "XX.XX.XX.XX",
            "Port": "1935",
            "Url": "rtmp://XX.XX.XX.XX:1935/test/live_A"
        },
        {
            "Ip": "XX.XX.XX.XX",
            "Port": "1935",
            "Url": "rtmp://XX.XX.XX.XX:1935/test/live_B"
        }
    ],
    "Id": "ZZZZ",
    "InputClass": "STANDARD",
    "InputSourceType": "STATIC",
    "MediaConnectFlows": [],
    "Name": "test-input-001",
    "SecurityGroups": [
        "YYYY"
    ],
    "Sources": [],
    "State": "DETACHED",
    "Tags": {},
    "Type": "RTMP_PUSH"
}
```

###delete-input
`--input-id`をパラメーターとして指定する

* 実行コマンド

```
$ aws --profile test medialive delete-input --input-id ZZZZ
```

* 結果

`delete-input`の場合、結果は表示されませんのでご注意ください。

##Channels
###create-channel
私は`create-channel`を使う際は必ずJSONファイルを指定します。コマンドライン１行で全ての設定を盛り込むのは相当な作業、手間がかかるからです。JSONファイルがすごく長くなるので例としてこの記事に載せませんがまず`--generate-cli-skeleton`で設定可能の項目を確認し、要件に合わせた設定に変更後、下記コマンドを実行しましょう。

* 実行コマンド

```
$ aws --profile test medialive create-channel file://{FILENAME}.json
```

###describe-channel
`--channel-id`パラメーターを指定する

* 実行コマンド

```
$ aws --profile test medialive describe-channel --channel-id XXXX
```
###delete-channel
`--channel-id`パラメーターを指定する。尚、結果は表示されませんのでご注意下さい。

* 実行コマンド

```
$ aws --profile test medialive delete-channel --channel-id XXXX
```

###start-channel
* 実行コマンド

```
$ aws --profile test medialive describe-channel --channel-id XXXX
```
###stop-channel
* 実行コマンド

```
$ aws --profile test medialive stop-channel --channel-id XXXX
```

#最後に
いかがでしょうか。上記に挙げた`MediaLive`のコマンドはまだまだたくさんあります。気なる方は参考文献を参考にしてみて下さい。個人としては使ってみてある程度コツが掴めば（特にJSONファイルの作成）そこまで難しくはないかもしれません。まあ、何もかも繰り返しと慣れですね。

次回は`JMESPath`というJSON構文から検索条件などをフィルターしたりエレメントを抽出する際に用いられる言語と組合わせた、もう少し踏み込んだAWS CLIの使い方も紹介できたらいいなと思っています。それでは簡単ではありますが読んで頂いた方々の参考になれば何よりです！

#参考文献
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/medialive/index.html