【YouTuber必見!】チャンネル登録者の増減を通知する
はじめに
YouTuberはチャンネル登録者の増減が気になってYouTube Studioに張り付いてしまうことがあります。YouTube Studioにはチャンネル登録者の増減を通知する仕組みがないのでつくってみました。
利用する技術
- YouTube Data API 👉 チャンネル登録者数を取得
- AWS Lambda 👉 処理の実行
- AWS DynamoDB 👉 前回の登録者数取得値を保存
- AWS SNS 👉 登録者数の増減をEmailで通知
- Terraform 👉 AWSリソースの管理
システム概要
システム構成図
フロー
- AWS Lambdaを定期実行し、YouTube Data APIを叩いてチャンネル登録者数を取得
- 前回の定期実行時の登録者数と比較し、変化があればAWSのSNSでメール通知
- AWS DynamoDBに現在の登録者数を保存
- 1~3を繰り返し
その他
- 定期実行はAWS CloudWatch Eventsで設定(10分間隔)
- Secrets ManagerにYouTube Data APIを叩くためのSecretKeyとSNSのTOPICのARNを登録
- SNSのTOPICにsubscribeしているメールアドレスに通知
- LambdaのコードはPythonで記述
実装
Terraform
main.tf
から/modules
以下の各モジュールを呼び出してAWSリソースを作成する構成にしています。
provider "aws" {
region = "ap-northeast-1"
}
module "iam" {
source = "./modules/iam"
aws_account_id = var.aws_account_id
aws_region = var.aws_region
aws_topic_name = var.aws_topic_name
}
module "lambda" {
source = "./modules/lambda"
lambda_role_arn = module.iam.lambda_role_arn
}
module "cloudwatch" {
source = "./modules/cloudwatch"
lambda_function_name = module.lambda.lambda_function_name
lambda_arn = module.lambda.lambda_arn
}
module "dynamodb" {
source = "./modules/dynamodb"
}
module "sns" {
source = "./modules/sns"
aws_topic_name = var.aws_topic_name
}
各モジュールの実装は割愛しますが、GitHubリポジトリにコードを公開していますので、そちらを参照してください。
Lambda
LambdaのコードはPythonで記述しています。boto3
を使ってAWSリソースを操作しています。
import json
import urllib.request
from secret_manager_utils import SecretManagerUtils
from dynamodb_utils import DynamoDBUtils
from sns_utils import SNSUtils
from constants import REGION, CHANNEL_ID, DYNAMODB_TABLE_NAME, YOUTUBE_API_SECRET_NAME
def lambda_handler(event, context):
# YouTube APIキーをSecretManagerから取得
youtube_api_key = __get_youtube_api_key()
# YouTube DATA APIからチャンネル登録者数を取得
subscriber_count = __fetch_subscriber_count(youtube_api_key)
# 前回保存したチャンネル登録者数をDynamoDBから取得
previous_subscriber_count = __get_previous_subscriber_count()
# チャンネル登録者数を比較して、SNSトピックにメッセージを送信し、DynamoDBにチャンネル登録者数を保存
# 登録者が変わっていない場合は何もしない
return __save_and_publish_subscriber(subscriber_count, previous_subscriber_count)
# 以下privateメソッドが続く
...
各AWSリソースの操作はutils
クラスを作成して、それぞれのクラスで処理を分割しています。
build_and_deploy.sh
の中で/modules/lambda/src
以下のファイルをzipにしてLambdaにデプロイしています。
# Lambda関数のzipファイルを作成
cd terraform/modules/lambda/src
zip -r ./lambda_function.zip .
cd ../../../../
# Terraformを使ったデプロイ
cd terraform
terraform init
terraform apply -auto-approve
cd ..
工夫したところ
1.DynamoDBのrange_keyにCreatedAt
を設定した
DynamoDBへの保存時にCreatedAt
を保存しています。保存するのはエポック秒です。
resource "aws_dynamodb_table" "youtube-subscriber-dynamodb-table" {
name = "youtube-subscriber-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "YoutubeChannelId"
range_key = "CreatedAt"
attribute {
name = "YoutubeChannelId"
type = "S"
}
attribute {
name = "CreatedAt"
type = "N"
}
}
こうすることで、過去の登録者数を取得する際に直近に保存したの登録者数を取得できるようになります。
def _get_latest_record(self):
response = self.table.query(
KeyConditionExpression=boto3.dynamodb.conditions.Key('YoutubeChannelId').eq(self.channel_id),
Limit=1,
ScanIndexForward=False
)
if response['Items']:
return response['Items'][0].get('SubscriberCount')
else:
return None
2.AWS Management Consoleからのリソース作成、更新操作を無くした
Terraformでのリソース管理と、CLIでのSecret作成やSNSのsubscribeを行うことで、AWS Management Consoleからの操作を無くしました。
デバッグ以外でAWS Management Consoleを開くことがなくなったので、実行した内容をコードで管理できるようになりました。
GitHubリポジトリ
リポジトリのREADMEに利用方法を記載してますのでご参照ください。
実行結果
こんな感じでチャンネル登録者の増減があった時だけメール通知が来ます。
ちなみに豆知識ですが、YouTube Data APIのチャンネル登録者取得の仕様として、
- 登録者数が1000人未満の場合は1人単位
- 登録者10000人未満の場合は10人単位
- 登録者10000人以上だと100人単位
の刻みになっています。
弊YouTubeチャンネルは最近10000人チャンネル登録者を達成しましたので、そのタイミングから100人単位での取得になりました。10万人チャンネル登録者になった時には1000人単位になるのか気になるので、ぜひみなさんチャンネル登録よろしくお願いします!
まとめ
今回はYouTuberがいつも気にしてるであろうチャンネル登録者数の増減を通知するシステムを作りました。
YouTuberの方々のYouTube Studioを見る時間が減るといいなと思います。
あと、Terraformを初めて触りましたが、AWSのリソースの作成と削除がコマンド一発なので、とてもデバッグがしやすかったです。
おまけ
実はGAS(Google App Script)を使えばもっと簡単に通知システムが実現できます。Spreadsheetに登録者数を保存して、前回の登録者数と比較して通知するだけです。YouTube Data APIもSecretKeyなしで叩けます。定期実行もGUIで簡単に実現できます。しかも無料です。こちらはYouTubeを始めた当初から動かしていて、今も動いています。
手軽に構築するならGASを使うのがおすすめです。
(今回はTerraformとAWSの勉強のために記事を書きました)
Discussion