はじめに
AWS MediaLiveを利用していると、
チャンネルを停止するのを忘れてしまうことがあるかと思います。
起動中のままにしておくと、請求が高額になる可能性があります。
今回はそれを防ぐために、RUNNING状態のチャンネルをslackに自動通知させる仕組みを考えました。
やりたいこと
AWS MediaLiveで、ステータスが「RUNNING」となっているチャンネル情報を
自動的にSlackに通知させる。(どのタイミングで通知するかは任意で設定可能)
構成図
使用リソース
- CloudWatch Events
- Lambda
- IAM
- SNS
手順
SNS
1. SNSトピックを作成する。
2. サブスクリプションを作成する。
- プロトコル:Eメール
- エンドポイント:任意のメールアドレス
3. 指定したメールアドレスにAWSからメールが届くので、本文中のリンクをクリックして承認する。
- 件名:Subscription Confirmation
4. ステータスが「確認済み」となっていることを確認する。
IAM
Lambdaに設定するIAMロールを作成する。
1. 下記のJSONをコピーして、新規にポリシーを作成する。
2. Lambda用のIAMロールを作成する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "medialive:ListChannels", "Resource": "*" }, { "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
Lambda
Lambda関数を作成する。
- ランタイム:Python3.8
- タイムアウト:30秒
- 実行ロール:先ほどのIAMロールを設定する
import boto3 medialive = boto3.client('medialive') sns = boto3.client('sns') def lambda_handler(event, context): channels = medialive.list_channels() channel_list = [] for Channels in channels['Channels'] : if Channels['State'] == 'RUNNING': name = Channels['Name'] id = Channels['Id'] state = Channels['State'] channel_list.append("| " + name + " | " + id + " | " + state + " |") print('\n'.join(channel_list)) if channel_list == []: pass else: request = { 'TopicArn': "<SNSトピックのARN>", 'Message': ('\n'.join(channel_list)), 'Subject': "Running MediaLive Channels" } sns.publish(**request)
CloudWatch Events
CloudWatch Eventsでルールを作成する。
- イベントソース:スケジュール(タイミングはお好みで)
- ターゲット:先ほどのLambdaを設定する
Slack
ここでは説明しませんので、下記のサイト等をご参照ください。
出力例
- Slack通知
※「RUNNING」状態のMediaLiveチャンネルがない場合、通知は飛びません。