🎥

【YouTuber必見!】チャンネル登録者の増減を通知する

2024/03/27に公開

はじめに

YouTuberはチャンネル登録者の増減が気になってYouTube Studioに張り付いてしまうことがあります。YouTube Studioにはチャンネル登録者の増減を通知する仕組みがないのでつくってみました。

利用する技術

  • YouTube Data API 👉 チャンネル登録者数を取得
  • AWS Lambda 👉 処理の実行
  • AWS DynamoDB 👉 前回の登録者数取得値を保存
  • AWS SNS 👉 登録者数の増減をEmailで通知
  • Terraform 👉 AWSリソースの管理

システム概要

システム構成図

フロー

  1. AWS Lambdaを定期実行し、YouTube Data APIを叩いてチャンネル登録者数を取得
  2. 前回の定期実行時の登録者数と比較し、変化があればAWSのSNSでメール通知
  3. AWS DynamoDBに現在の登録者数を保存
  4. 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リソースを作成する構成にしています。

main.tf
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リソースを操作しています。

lambda_function.py
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にデプロイしています。

build_and_deploy.sh
# 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を保存しています。保存するのはエポック秒です。

dynamodb.tf
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"
  }
}

こうすることで、過去の登録者数を取得する際に直近に保存したの登録者数を取得できるようになります。

dynamodb_utils.py
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に利用方法を記載してますのでご参照ください。
https://github.com/atamakonkurii/youtube-subscriber-tracker

実行結果

こんな感じでチャンネル登録者の増減があった時だけメール通知が来ます。

ちなみに豆知識ですが、YouTube Data APIのチャンネル登録者取得の仕様として、

  • 登録者数が1000人未満の場合は1人単位
  • 登録者10000人未満の場合は10人単位
  • 登録者10000人以上だと100人単位
    の刻みになっています。

弊YouTubeチャンネルは最近10000人チャンネル登録者を達成しましたので、そのタイミングから100人単位での取得になりました。10万人チャンネル登録者になった時には1000人単位になるのか気になるので、ぜひみなさんチャンネル登録よろしくお願いします!

https://www.youtube.com/channel/UC2JHTgLF0wHhkKIPS9sTl0w

まとめ

今回はYouTuberがいつも気にしてるであろうチャンネル登録者数の増減を通知するシステムを作りました。
YouTuberの方々のYouTube Studioを見る時間が減るといいなと思います。
あと、Terraformを初めて触りましたが、AWSのリソースの作成と削除がコマンド一発なので、とてもデバッグがしやすかったです。

おまけ

実はGAS(Google App Script)を使えばもっと簡単に通知システムが実現できます。Spreadsheetに登録者数を保存して、前回の登録者数と比較して通知するだけです。YouTube Data APIもSecretKeyなしで叩けます。定期実行もGUIで簡単に実現できます。しかも無料です。こちらはYouTubeを始めた当初から動かしていて、今も動いています。
手軽に構築するならGASを使うのがおすすめです。
(今回はTerraformとAWSの勉強のために記事を書きました)

GitHubで編集を提案

Discussion