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

はじめに

AWS Media Servicesのプラットフォームを構築する際にいつもコンソール上で対応していますがツールを使っての作業方法も知っておく必要があると気づくようになりました。よって今回は私が頻繁に使っているAWS CLIAWS 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ファイルを指定して実行する方法

シンプルな設定ならパラメーターとしてそのまま指定はしますが、MediaLivecreate-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ファイルを指定します。コマンドライン1行で全ての設定を盛り込むのは相当な作業、手間がかかるからです。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

元記事はこちら

AWS CLIでAWS Elemental MediaLiveを制御する