はじめに
AWS MediaLiveを利用していると、
チャンネルを停止するのを忘れてしまうことがあるかと思います。
起動中のままにしておくと、請求が高額になる可能性があります。
今回はそれを防ぐために、RUNNING状態のチャンネルをslackに自動通知させる仕組みを考えました。
#やりたいこと
AWS MediaLiveで、ステータスが「RUNNING」となっているチャンネル情報を
自動的にSlackに通知させる。(どのタイミングで通知するかは任意で設定可能)
#構成図
#使用リソース
- CloudWatch Events
- Lambda
- IAM
- SNS
#手順
##SNS
1. SNSトピックを作成する。
2. サブスクリプションを作成する。
・プロトコル:Eメール
・エンドポイント:任意のメールアドレス
3. 指定したメールアドレスにAWSからメールが届くので、本文中のリンクをクリックして承認する。
・件名:Subscription Confirmation
##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
ここでは説明しませんので、下記のサイト等をご参照ください。
#出力例
※「RUNNING」状態のMediaLiveチャンネルがない場合、通知は飛びません。
#参考