お役立ち Twitter Bot を作りながら学ぶ AWS ドリル
~第 1 回 おはよう Bot 編
Author : 金澤 圭
ソリューションアーキテクト (SA) の金澤 (@ketancho) です。2022 年になりましたが、皆さまいかがお過ごしでしょうか ? 新年を迎えたので、「今年は○○をやるぞ !」と思われている読者の方も多いのではないでしょうか ? 〇〇に AWS に関わるワードが入っているといいなーと思いながらこれを書いているのですが、私の場合は「今年は AWS を使いはじめたい方々が楽しく学べるコンテンツを作るぞ !」が抱負だったりします。(それと少しでいいから痩せたいです。)
昨年末に子どもにアドベントカレンダー (ブログではなくお菓子とかおもちゃとかが入っている方) を初めて買ってあげたのですが、思っていた以上にウケがよく、お父さんは鼻高々でした。もしかしたらそんな形で、窓を開けると AWS のサービスが毎月ひとつずつ出てきて、それを使って読者の皆さまが楽しく遊びながら学べるようなカレンダーが作れれば、SA としても鼻高々になれるのではないか ! と妄想しています。ということで、今年はそんな新連載をやっていこうと思います。
タイトルの通り、Twitter Bot を開発・運用しながら AWS を学んでいただきます。「個人で Web サイトを開発・運用したい、そしてそれをスキルアップに繋げたい !」という話をよく伺います。それと同時に、インフラからバックエンド、フロントエンドまでを全て自分でやらないといけないので (だからこそエンジニアとしての力が付くとも言えますね)、途中で挫折してしまったという話もよく聞きます。Twitter Bot であれば「見ための部分」は Twitter 側に任せることができるので、インフラ + バックエンドに注力でき、はじめの一歩としての歩幅を小さく確実に刻むことができると思い、Twitter Bot を題材としました。
また、実際に手を動かしていただきたい ! という想いで「ドリル」と名付けています。毎月少しずつ Twitter Bot を育て、時には運用中に起こった思いがけない動作に対応しながら、それらの過程で “手に馴染んだ” AWS サービスを自然に増やしていただくことを狙っています。この連載ドリルを通して、実体験を通した知見をひとつでも多く持ち帰っていただければと思います。
※ Twitter API のアップデート により UI 及び手順に変更がございましたので、1/24 に記事をアップデートしました。
この連載記事のその他の記事はこちら
- 選択
- 第 1 回 おはよう Bot 編
- 第 2 回 昔書いた記事の宣伝 Bot 編
- 第 3 回 リファクタリング & 曜日ごとのツイート 編
- 第 4 回 新章突入 ! 気になるワード検索 & 通知 Bot 編
- 第 5 回 皆さまの代わりに英語でツイートしておくよ Bot 編
- 第 6 回 AWS Step Functions を使って Well-being Bot を作ろう ! (前編)
- 第 7 回 AWS Step Functions を使って Well-being Bot を作ろう ! (後編)
- 第 8 回 - 総集編 & 夏休みの自由研究のすすめ
- 第 9 回 - IaC 入門しながら作るリマインダー Bot (前編)
- 第 10 回 - IaC 入門しながら作るリマインダー Bot (中編)
- 完結回 - IaC & CI/CD 入門しながら作るリマインダー Bot (後編)
目次
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. この記事で作る Bot の機能と、とりあげる AWS サービス・機能
連載初回のこの記事では、
を使って、「おはよう Bot」を作ります。毎日特定の時間になったら、日付とともに「おはよう」と言うだけのシンプルなものです。単純な Bot ですが、今回は Twitter API を使う準備もあるので、連載初回としてはこれくらいに留め、今後少しずつ機能を増やしていこうと思います。
クリックすると拡大します
「窓を開けると AWS のサービスが毎月ひとつずつ出てきて」と書いたのに、いきなり 3 つも AWS サービスを登場させてしまいましたが、逆に言うと 1 つの記事で 3 つもサービスを触ることができるのでかなりお買い得ですね !「軽く触ったことがある」と「全く使ったことがない」は大きな差だと思いますので、この記事でこれらのサービスのはじめの一歩を踏み出していただければと思います (今後も 1 つの記事で AWS サービスを 2 つ 3 つ登場させる予防線です🙏)。
2. Twitter アカウントの取得とドリルを進める上での注意点
それでは始めていきましょう。まず Bot 用の Twitter アカウントを作成します。既にアカウントをお持ちの方はそれを流用していただいても構いません。ただし、プログラムからのツイートする、といった Twitter API 経由の操作をしていきますので、開発段階では思いもよらぬ挙動に繋がるかもしれません。そのため、普段使いのアカウントとは別に開発用のアカウントを作る、アカウントを非公開にする、といった対策をすることをおすすめします。
また、Twitter Bot を作成する上で、こちらの 自動化ルール のページをご一読ください。特に「してはならないところ」の部分はよく読んでいただきたいです。今回の連載では、なにかしら “便利な” 機能を持つ Bot を作っていく予定ですが、それが他の人の迷惑にならないようにしていきます。また、このドリルをベースにして、ぜひ皆さんが作りたい機能をどんどん付け加えていただきたいのですが、その際は他の方の迷惑になりうる通知や DM 送付などがないようご留意いただければと思います。
さて、それではアカウント作成の手順を簡単に紹介します。Twitter の Top ページ にアクセスいただくと、サインアップのための方法が幾つか用意されていますので、お好きな方法でアカウントを作成してください。私はメールアドレスで作成しましたが、どの形でアカウントを作成しても後続の作業に影響はありません。
(ちなみに、私は PC からこの作業を進めたのですが、「電話番号を追加」の画面でスマホに認証コードが届かない事象に陥りました。スマホアプリからアカウントを作成して回避できたのですが、同じ状況になってしまった方は、そちらもお試しいただくか、回避策を検索するなどしていただければと思います。)
その後、幾つか初期設定の画面が続きますが、Bot を開発する上で必須の設定はありませんので、設定を飛ばしていただいて構いません。ただし、後ほど Twitter API を使う上で、電話番号認証がされている必要があります。最初の導線の中で設定いただくか、アカウント作成後に 電話番号の設定画面 から設定をお願いします。また、もしよければ何かしらのアイコン画像だけでも設定いただくと、可視性がよくなり便利です。私はこのようなアカウントを作成しました。
3. Twitter API を使う準備をする
Twitter Bot 用のアカウントの準備ができたら、Twitter API を叩くための準備をしていきます。2021 年 11 月に API v2 が正式な API バージョンとなったとのことですので、この連載では v2 を使っていきます。余談ですが、API v.1.1 ではできる操作のうち、一部が API v2 では未対応になっています (2021 年 12 月現在、公式の参考情報)。まずは現状の v2 でできることを中心に進めつつ、対応が進み次第、それらの機能を使ったドリルを作っていければと考えています。
さて、Twitter API を利用するには、Developer Platform にアクセスし、Sign Up する必要があります。居住国やユースケースを入力したのち、Developer Agreement に許諾します。その後、送られてくるメールを確認することで、Sign Up が完了します。
続いて Developer Portal のダッシュボード にアクセスし、Project と App を作成します。(直前の Sign Up の中で作成している方はスキップしてください。) App の名前を入力すると、API Key, API Key Secret, Bearer Token が払い出されます。これらの情報はこのタイミングでしか確認できないので、手元にメモしておきましょう (もし、メモしそこねてしまった場合は再作成する形になります)。作成後、改めてダッシュボードにアクセスすると、Project の中に App が表示されているはずです。
こちらの画面で App 名の右側にある歯車マークをクリックしてください。App の細かい設定を行う画面に遷移します。
クリックすると拡大します
この画面の下部にある User authentication settings の Set up ボタンをクリックしてください
クリックすると拡大します
User authentication settings 画面に遷移するので、
- OAuth 1.0a を ON に変更
- App permissions は Read and write に変更
してください。そのまま画面を下にスクロールしてください。(まだ Save しないでください)
クリックすると拡大します
続いて、
- Callback URI / Redirect URL
- Website URL
を入力します。こちらは今回のドリルでは何を設定していただいても問題ありません。この記事の URL などを設定いただければと思います。その後、下部の Save ボタンをクリックしてください。
クリックすると拡大します
App の設定ページに戻るので、上部の Keys and tokens をクリックしてください。
クリックすると拡大します
Keys and tokens タブに遷移したら、Access Token and Secret の Generate をクリックします。
クリックすると拡大します
Access Token と Access Token Secret が表示されます。こちらも後ほど利用するので、手元のエディタにメモしておいてください。
メモが終わりましたら、右下のボタンをクリックしましょう。
クリックすると拡大します
以上で Twitter API を利用するための事前作業が完了です。ここまで 5 つの Key あるいはトークンをメモしていただいてますが、このドリルではこのうち
- API Key
- API Key Secret
- Access Token
- Access Token Secret
を使っていきます。
4. AWS Lambda を使っておはよう Bot を作る
さて、下準備が長くなりましたが、ここからが本編です。AWS のサービス・機能を使って Twitter Bot を作成していきます。
4-1. AWS アカウントの準備・IAM の準備など
まず、この連載ドリルで使用する AWS アカウントを用意します。何かしら他の AWS リソースが動いているアカウントですと、今回の作業で影響を与えてしまう可能性があるので、サンドボックス的なアカウントで試していただくことを強くおすすめします。もし、そのような AWS アカウントをお持ちでない方は、アカウント作成ハンズオン をご用意していますので、こちらからアカウント作成をお願いします。
その後、操作に必要な IAM 権限のあるユーザーでログインしていただき、マネジメントコンソールの
- 右上のリージョン選択プルダウンから「アジアパシフィック (東京)」
- 左下の言語選択プルダウンから「日本語」
を選択します。
4-2. AWS Lambda 関数のひな形を作成する
画面上部の検索窓に Lambda と入力し、AWS Lambda のサービス画面に遷移してください。こちらで「関数の作成」を進めていきます。
関数の「基本的な情報」欄には、
- 関数名 : twitter-bot-hello
- ランタイム : Python 3.9
- アーキテクチャ : x86_64
を設定し、Lambda 関数を作成しましょう。
クリックすると拡大します
続いて、今回は requests_oauthlib という Python モジュールを利用するのですが、標準の Lambda 関数には含まれておりません。そのため、requests_oauthlib をインストールし、それを .zip ファイルにまとめ、Lambda 関数にソースコードとしてアップロードする必要があります。
今回は、この作業を AWS CloudShell 上で行います。AWS CloudShell は、マネジメントコンソール右上のコンソールマークから利用できます。
クリックすると拡大します
CloudShell のコンソールが起動しましたら、下記のコマンドを実行してください。requests_oauthlib パッケージをインストール、空の lambda_function.py を作成、.zip 化したのち、最後に AWS CLI を使って .zip ファイルで Lambda 関数のコードを更新しています。
mkdir twitter-bot-hello
cd twitter-bot-hello/
pip3 install -U pip
pip install requests_oauthlib -t ./
touch lambda_function.py
zip -r twitter-bot-hello.zip ./
aws lambda update-function-code --function-name twitter-bot-hello --zip-file fileb://twitter-bot-hello.zip
無事にコマンドが流れ終わったら、先ほど作成した Lambda 関数 twitter-bot-hello を再度表示 (既に表示している人はブラウザをリロード) してください。エディタの左側に依存パッケージ群が配置され、一番下には lambda_function.py があるはずです。この Python ファイルは現時点で空なのですが、それで問題ありません。プログラムからツイートできるように、この Python ファイルを修正するのが今回のドリルのメインワークになります。
(Lambda のサービス画面の「コードソース」部分ですが、今回の記事では黒背景のエディタとなっていますが、背景色やテーマが異なっている方もいると思います。こちらは環境設定によるもので、今回の開発には影響ありません。)
クリックすると拡大します
4-3. Lambda から Hello World ツイートをする
ひな型ができあがったので、まずは固定の文言をツイートできるように実装を進めていきます。今回は manage-tweet API を利用して、ツイートしていきます。実装例を載せていますが、ざっくりとした流れとしては、
- 手元にメモした API Key と Access Token を利用し、OAuth セッションを作る
- ツイートテキストを準備 (現段階では固定テキスト) する
- API Endpoint URL に向けて Post する
となります。Lambda 関数 twitter-bot-hello の lambda_function.py を開き、下記のプログラムに更新してください。API Key や Access Token は皆さまの手元のメモのものに差し替えてください。(コード内のコメントでも触れていますが、本来これらの情報はハードコーディングすべきではありません。この部分の改善は連載の中でやっていきます。)
import json
import os
from requests_oauthlib import OAuth1Session
# API Key, Access Token (本来、ハードコーディングするのは望ましくありません。連載の中で修正していきます。)
consumer_key = '*Input Your API Key*'
client_secret = '*Input Your API Key Secret*'
access_token = '*Input Your Access Token*'
access_token_secret = '*Input Your Access Token Secret*'
oauth = OAuth1Session(consumer_key, client_secret, access_token, access_token_secret)
def lambda_handler(event, context):
text = 'これは Lambda からの自動ツイートテストです。'
payload = {'text': text}
response = oauth.post(
"https://api.twitter.com/2/tweets",
json=payload,
)
if response.status_code != 201:
raise Exception(
"[Error] {} {}".format(response.status_code, response.text)
)
プログラムを修正したら忘れずに Deploy を行いましょう。Deploy 後、Test ボタンを押すと「テストイベントの設定」というポップアップが出てくると思います。Lambda 関数のテスト実行を行う際には、event にどのような情報を入れてテストするかを決めることができます。今回の Lambda 関数は event に格納された情報は使わないので、名前だけ決めていただき (Test で構いません)、内容はそのままでテストイベントを保存してください。
もう一度、Test ボタンを押していただくと Lambda 関数が実行されます。ご自身の Twitter アカウントをご確認いただき、ツイートされていれば成功です🎉
もし、エラーが出る場合は、Lambda のコンソールにエラーが表示されるはずなので、そのエラーメッセージを読みながら修正を試みましょう。Twitter 側の設定 で Permission が Read Only のままになっているとツイートができないので、Lambda 関数だけではなく、Twitter 側の設定もあわせて見直していただくといいかもしれません。
4-4. 朝 8 時に自動投稿するようにする
さて、この記事の最後の実装になります。朝 8 時になったら「今日もがんばるぞ !」というメッセージをつぶやくようにします。先ほどまでの実装で Lambda 関数からツイートできるようになったのですが、試しにもう一度テスト実行をしてみてください。おそらく下記のようなエラーが出ると思います。
Response
{
"errorMessage": "[Error] 403 {\"detail\":\"You are not allowed to create a Tweet with duplicate content.\",\"type\":\"about:blank\",\"title\":\"Forbidden\",\"status\":403}",
"errorType": "Exception",
..
「これは Lambda からの自動ツイートテストです。」という固定文言を再びツイートしようとしたので、同じ内容は続けて投稿できないよ!と怒られているわけですね。ですので、皆さんの Twitter Bot に
- 日付を一緒にツイートするようにプログラムを修正する (これで毎日異なるツイートになります)
- Amazon EventBridge を使って、日本時間の朝 8 時に Lambda 関数を動かすようにする
というふたつのアップデートを加え、毎日朝 8 時に自動投稿されるようにします。
まずは、Lambda 関数を修正していきます。下記のように日付が入る形に変更し、Deploy してください。Deploy 後、再度 Test 実行を行い、まずは修正に問題ないことを確認しましょう。ただし、同日に同じテキストのツイートができなくなるので、このあと EventBridge のテストをするために、Twitter 側でこのテストツイートを削除しておいてください。
import json
import os
from requests_oauthlib import OAuth1Session
from datetime import datetime, timedelta, timezone # 追加
JST = timezone(timedelta(hours=+9), 'JST') # 追加
# API Key, Access Token (本来、ハードコーディングするのは望ましくありません。連載の中で修正していきます。)
consumer_key = '*Input Your API Key*'
client_secret = '*Input Your API Key Secret*'
access_token = '*Input Your Access Token*'
access_token_secret = '*Input Your Access Token Secret*'
oauth = OAuth1Session(consumer_key, client_secret, access_token, access_token_secret)
def lambda_handler(event, context):
now = datetime.now(JST).strftime("%Y年%-m月%-d日") # 追加
text = 'おはようございます!今日は ' + now + 'です。頑張っていきましょう!!' # 修正
payload = {'text': text}
response = oauth.post(
"https://api.twitter.com/2/tweets",
json=payload,
)
if response.status_code != 201:
raise Exception(
"[Error] {} {}".format(response.status_code, response.text)
)
Lambda 関数の修正が終わりましたら、EventBridge の設定をしていきます。
Lambda 関数の画面を上の方にスクロールしていただくと、「トリガーを追加」というボタンがありますので、こちらを押してください。
クリックすると拡大します
プルダウンから EventBridge (CloudWatch Events) を選択していただき、
- 新規ルールの作成
- ルール名 : exec-twitter-bot-hello-8-oclock-every-morning
- ルールタイプ : スケジュール式
- スケジュール式 : cron(0 23 ? * * *)
として、追加してください。
「スケジュール式」の部分が分かりにくいと思われた方向けに少し解説します。cron 式は cron(分 時間 日 月 曜日 年) として表します。今回指定した cron(0 23 ? * * *) は、毎日 23:00 (UTC) に実行することを意味します。
「8時に実行したいのになぜ 23 時としているの ?」と思われた方もいらっしゃるかもしれません。さらっと UTC と書きましたが、EventBridge の cron 式は協定世界時 (UTC) で記述する必要があるんです。builders.flash を読まれている多くの方は、日本標準時 (JST) で生活されていると思います (海外にお住まいの方はタイムゾーンに合わせて設定をお願いします !)。この JST を UTC に変換するには -9 時間すればよいので、 cron(0 23 ? * * *) と設定しています。詳細は こちらのドキュメント も参照してみてください。(今回は、「日」や「曜日」を使っていないため考慮していませんが、例えば「毎月 15 日の朝 8 時に実行したい」としたい場合は、日付も 1 日前にしてあげる必要があることにご注意ください。)
さて、ここまでで自動投稿のための設定が完了しました。朝 8 時を待つと、このようにツイートされるはずです🎉
8 時になるまで待つのは大変だと思うので、適宜 cron 式に手を加え、テストが終わったら元に戻すという流れにすると、開発がスムーズにいくと思います。(このテストをする際も、同一文言のツイートができないことにご注意ください。)
クリックすると拡大します
以上で、今回のドリル終了となります ! 無事に完走できましたでしょうか ?
5. 参考情報
今回利用した AWS サービス群を更に深く学ぶための動画ハンズオンコンテンツを紹介します。どちらも AWS Lambda を中心としたハンズオンで、今回のドリルではソースコードの完成形を提示する形になっていますが、このハンズオンは動画であることを活かし、ライブコーディングする形となっています。あわせてご参考にしていただき、今回のドリルの中心である AWS Lambda を使いこなせるようになっていただければ幸いです。
6. まとめ
「お役立ち Twitter Bot を作りながら学ぶ AWS ドリル」の第 1 弾として、シンプルなおはよう Bot を作成しました。このドリルを通して、
- AWS Lambda
- Amazon EventBridge
- AWS CloudShell
の 3 つのサービスを体験していただくことができました。「シンプルな」と書きましたが、Twitter 側の準備もあり、なかなかの長編となってしまいました。「少しずつ」がテーマなので、次回からはもう少しボリュームを抑えつつ、その分、皆さまに自由に Bot を拡張していただく「遊び」を残せるドリルにしていきたいと思っています。
最後にお願いなのですが、皆さまのご感想・ご要望を #AWSウェブマガジン タグをつけて呟いていただけたら嬉しいです🙏 この記事に +α して、こんなものを作ってみました ! という共有も大歓迎です。今後の連載の参考にさせてもらいたいと思っておりますので、ぜひよろしくお願いしますー !
それでは次回の記事でまたお会いしましょう !
この連載記事のその他の記事はこちら
- 選択
- 第 1 回 おはよう Bot 編
- 第 2 回 昔書いた記事の宣伝 Bot 編
- 第 3 回 リファクタリング & 曜日ごとのツイート 編
- 第 4 回 新章突入 ! 気になるワード検索 & 通知 Bot 編
- 第 5 回 皆さまの代わりに英語でツイートしておくよ Bot 編
- 第 6 回 AWS Step Functions を使って Well-being Bot を作ろう ! (前編)
- 第 7 回 AWS Step Functions を使って Well-being Bot を作ろう ! (後編)
- 第 8 回 - 総集編 & 夏休みの自由研究のすすめ
- 第 9 回 - IaC 入門しながら作るリマインダー Bot (前編)
- 第 10 回 - IaC 入門しながら作るリマインダー Bot (中編)
- 完結回 - IaC & CI/CD 入門しながら作るリマインダー Bot (後編)
筆者プロフィール
金澤 圭 @ketancho
アマゾン ウェブ サービス ジャパン合同会社
技術統括本部 ソリューションアーキテクト
サーバーレスが好きなソリューションアーキテクト。業種業界問わず、お客様のプロダクト開発をサポートさせていただいています。「AWS Hands-on for Beginners」というオンデマンドで視聴できるハンズオンも企画・推進しており、楽しく学べるコンテンツを日々考えています。好きなサービスは AWS Lambda、AWS Step Functions、Amazon Personalize で、好きな休日の過ごし方は娘ふたりと川の字になって昼寝👧👧と赤ん坊を抱っこしながらの散歩です👶
AWS を無料でお試しいただけます