「お役立ち Twitter Bot を作りながら学ぶ AWS ドリル」を元に作ったBotを紹介します

アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

これがシン・タイトル!

Event:

サーバーレス LT vol.2

Presented:

2022/05/26 nikkie

お前、誰よ(自己紹介)

  • Python大好き にっきー

  • 株式会社ユーザベースのデータサイエンティスト(NLPer)

ラクスさんのLT会、お世話になっております

映画『アイの歌声を聴かせて』🤖🎤🎼

アイの歌声を聴かせて

  • SF × 学園 × ミュージカル!

  • 最後にきっと、笑顔になれる

  • 面白いから、みんな観て! 6/10(金)まで 配信 、7/27(水) 円盤発売

このLTの目的

  • PythonとAWS LambdaでTwitter Bot 簡単 かもと思っていただく

  • AWSは独学なので、自分よりも詳しい方から、実装へのフィードバックを得たい

  • アイの歌声を聴かせて を知っていただく(達成)

Python、あんまり使わないんだよなという方へ

  • Pythonに限らない話題(AWSの構成など)を聞いていただければ!

  • 本当に簡単だと思うので、Pythonの素振りとして試してみては(またはお使いの言語で書き換えてみては)

  • アイの歌声を聴かせてのおすすめリンク 見ます?

本題へ:こんなTwitter Bot作りました

その名も @harmonizer_bot

その責務は、『アイの歌声を聴かせて』を応援!

カウントダウンして応援

秘密を明かしていきます

  • 秘密1

  • 秘密2

  • 秘密3

秘密1:AWSドリルを参考にしました

ご存知ですか? builders.flash

https://aws.amazon.com/jp/builders-flash/

builders.flash

  • AWS のデベロッパー向けウェブマガジン

  • ソリューションアーキテクトの皆様による 豊富な記事

  • メールメンバーに登録すると、特典(AWSのクーポン)いただけます

お役立ち Twitter Bot を作りながら学ぶ AWS ドリル

金澤さん(a.k.a @ketancho さん)による毎月連載(2022年1月〜)

Twitter Bot を開発・運用しながら AWS を学んでいただきます。(第1回より)

現在5️⃣回連載

  • 第1回 AWS Lambda・Amazon EventBridge・AWS CloudShell

  • 第2回 Amazon DynamoDB・AWS IAM

  • 第3回 AWS Systems Manager (Parameter Store)

現在5️⃣回連載

  • 第4回 Amazon SNS

  • 第5回 Amazon Translate

  • 今後も楽しみにしています!

harmonizer_botは 初回 の内容で作りました

  • 第3回も一部参照しています

  • ドリル4回分残しているので、拡張しがいがあって最高!

AWSドリル第1回で作るTwitter Bot

https://aws.amazon.com/jp/builders-flash/202201/aws-drill-twitter-bot-1/

Twitter Botの仕組み

  • Bot用のTwitterアカウントを用意

  • Twitter APIを介すと、Twitterアカウントにツイートさせられる

  • つまり、Twitter Bot= Bot用アカウントでツイートするプログラム

Bot用Twitterアカウントの設定

ツイートのエンドポイント

POST https://api.twitter.com/2/tweets

ツイートするプログラム(Python)

import os
from requests_oauthlib import OAuth1Session

# 環境変数の読み込み
consumer_key = os.getenv("TWITTER_API_KEY")
client_secret = os.getenv("TWITTER_API_KEY_SECRET")
access_token = os.getenv("TWITTER_API_ACCESS_TOKEN")
access_token_secret = os.getenv("TWITTER_API_ACCESS_TOKEN_SECRET")

oauth = OAuth1Session(consumer_key, client_secret, access_token, access_token_secret)

payload = {"text": "#アイの歌声を聴かせて 面白いからみんな観て"}
response = oauth.post("https://api.twitter.com/2/tweets", json=payload)

Twitter BotのプログラムをAWSで動かす

ツイートするプログラムを、定期的に自動で実行。それすなわちBot

Twitter Botの最小構成は2つのサービス

  • AWS Lambda

  • Amazon EventBridge

AWS Lambda

  • 先のツイートするプログラムをLambda関数にする

    • lambda_function.pylambda_handler 関数として実装(デフォルト設定に合わせる)

  • (手に馴染んだ言語に書き換えても素振りになるかもしれませんね)

ツイートするLambda関数の例

import os
from requests_oauthlib import OAuth1Session

consumer_key = os.getenv("TWITTER_API_KEY")
client_secret = os.getenv("TWITTER_API_KEY_SECRET")
access_token = os.getenv("TWITTER_API_ACCESS_TOKEN")
access_token_secret = os.getenv("TWITTER_API_ACCESS_TOKEN_SECRET")

oauth = OAuth1Session(consumer_key, client_secret, access_token, access_token_secret)

def lambda_handler(event, context):
    payload = {"text": "#アイの歌声を聴かせて 面白いからみんな観て"}
    response = oauth.post("https://api.twitter.com/2/tweets", json=payload)

Amazon EventBridge

  • Lambda関数はevent(JSON)を受け取ると実行される(lambda_handler 関数の第1引数)

  • EventBridgeでeventを 発生 させる

    • 定期的に、Lambda関数に対して(👉Lambda関数の日次実行)

こうして、毎朝カウントダウンするBotが爆誕した🎉

LT:アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • 秘密1: AWSドリル を参考にしました

  • 秘密2

  • 秘密3

NEXT:1日に複数回つぶやかせるには?🤔

  • Lambda関数をつぶやきの種類だけ作る?

  • 1つのLambda関数の中で、この時間はこのつぶやきというロジックを書く?

秘密2:eventの種類を変えて、1日複数回ツイートさせています

この設計について、AWSに詳しい方からのフィードバック希望🙏

IMO:1日に複数回つぶやかせる方法

  • Lambda関数は1個(保守しやすい)

  • EventBridgeで 様々なevent を発生させる

    • 14時には時報用event

    • 20時には劇場情報用event

Lambda関数の引数 event

def lambda_handler(event, context):
    # EventBridgeで発生させたevent(JSON)がevent引数に渡る
    # eventはPythonの辞書という型(他の言語でいうMap)
    # {"キー": "値"}

このeventを受け取って実行されたら、この振る舞いをすると実装

eventのカスタマイズ

  • EventBridgeの 入力トランスフォーマー

  • Lambda関数で参照するキーと値をeventに追加する

{"bot-mode": "time-signal"}

Lambda関数の実装(イメージ)

def lambda_handler(event, context):
    mode = event.get("bot-mode")
    if mode == "information":
        # informationモードの文面を作ってツイート
    elif mode == "time-signal":
        # time-signalモードの文面を作ってツイート
    ...

この実装の推しポイント

  • 「何時にどういうeventが発生して、それによりこれこれのツイートをする」という構成

  • 何時の部分は簡単に変えられる (8時にツイートしていたのを今日から9時にしよう)

  • EventBridgeのルール名は変更できないので、「何時」ではなく「やりたいこと」にした方がよかったです

入力トランスフォーマー

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-input-transformer-tutorial.html

入力トランスフォーマーの構成要素

  • 入力パス

  • 入力テンプレート

入力トランスフォーマーの設定例

  • 入力パスは変数定義。今回は使わないので {} にしています

  • 入力テンプレートは eventのJSON。何時ならこの値と固定しています

{
  "bot-mode": "time-signal"
}

こうして、アイうた応援Botは複数回つぶやけるようになった🚀

いいわ、いいわ!

LT:アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • 秘密1:AWSドリルを参考にしました

  • 秘密2: eventの種類を変え て、1日複数回ツイートさせています

  • 秘密3

現在、神化する lambda_function.py と戦っています

  • lambda_function.py が肥大化するSmellを察知

  • Pythonのパッケージングで、薄くするのを試みる日々(エントリポイントは薄く!)

秘密3:Twitter Bot開発生産性アップtips!

2つ紹介します

1. GitHubにpushしたらLambda関数を更新!

  • Lambda関数デプロイのハードルが下がり、捗りました

  • 小さくこまめにリリース、楽しい

第1回ドリルのCloudShell

mkdir twitter-ainouta-bot
cd twitter-ainouta-bot
python -m pip install -t ./ -r ../requirements.lock
cp ../lambda_function.py .
zip -r twitter-ainouta-bot.zip ./

aws lambda update-function-code \
    --function-name twitter-ainouta-bot \
    --zip-file fileb://twitter-ainouta-bot.zip | \
jq 'del(.Environment, .FunctionArn, .Role)'

GitHub Actionsに移植!(ただし注意点)

  • ドリルから変えて、Lambda関数の環境変数を使いました

  • aws lambda update-function-code の返り値(JSON)には 環境変数も含まれる

  • jq は環境変数などを画面に出さないように追加しています(マスクする方法もあるらしい)

2. AWSのアカウントの権限まわりの設定

実務レベルではない可能性あるので、気になる点あればフィードバックください

試行錯誤の末、AWSアカウントを2つに分けた

  • 開発中にコンソールを操作するアカウント

  • 自動デプロイするためのアカウント

2つのアカウント

  • 開発中にコンソールを操作するアカウント:Lambda full access

  • 自動デプロイするためのアカウント:権限絞る(コンソールにログインしない

1つでやろうとするのは苦しかった・・・

  • full accessは広すぎるので、権限を絞る

  • するとコンソールが満足に操作できない

  • 👉「これ、複数いるんだ!」と気づき

LT:アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • 秘密1:AWSドリルを参考にしました

  • 秘密2:eventの種類を変えて、1日複数回ツイートさせています

  • 秘密3:Twitter Bot開発生産性アップtips! 2つ紹介

まとめ🌯 アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • AWSドリル(の第1回)を参考に、アイうた応援Botを爆誕させました

    • AWS Lambda

    • Amazon EventBridge

まとめ🌯 アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • eventの種類を変えて、1日複数回ツイートさせています

    • 1つのLambda関数、複数種のevent

    • 入力トランスフォーマー

まとめ🌯 アイの歌声を聴かせて応援Botの秘密はね、最後じゃないけど明かされるんだよ

  • Twitter Bot開発生産性アップtips!

    • ドリルのCloudShellのスクリプトをGitHub Actionsに移植

    • 自動デプロイと開発、アカウントが分かれそう

ご清聴ありがとうございました

あなたの応援したいものにTwitter Botを試してもらえたら嬉しいです(驚くくらい簡単でした!)

EOF