目次
はじめに
皆さんはBotシステムを作るときどのような構成にしていますか?
自前でサーバ起ち上げてcron動かして運用するのがオーソドックスだと思いますが、Botの性質上サーバを起動しっぱなしににする必要があるので少々面倒です。(電気代もかかります)
また、クラウドサービスを利用するという手もありますが、EC2などを使ったとしても一日中起動しなければならないのでやはりコストがかかります。
そこでおすすめなのがAWS Lambdaを使ったBotシステムです!
Lambdaは分かりやすくいうと関数ベースのスクリプトを登録して、処理実行毎に課金されるクラウドサービスです。
おすすめする理由は大きく2つです。
* コストが安い
関数実行ごとに課金されるため、定期的に実行するBotのようなシステムに向いています。
* 運用が楽
関数実行の成功と失敗のみ管理すればいいのでより機能に集中できます。ログはCloudWatchで管理できます。
Lambda初体験ですが、今回はLambdaを使ってTwitter Botを開発してみます!
動作環境
- Mac Sierra Version 10.12.6
事前準備
- AWSアカウント
- Twitterアカウント(Bot用)
Twitter Apps登録
Twitter Botの開発には登録したアプリの以下のKeyが必要です。
- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Key
- Access Key Secret
今からTwitterデベロッパーサイトからアプリを登録し、アクセストークンを取得します。
Twitter Appsの登録
開発用のTwitterアカウントでログインしてからTwitterデベロッパーサイトへアクセスします。
メニューの[My apps]からアプリ管理画面にアクセスし、[Create New App]をクリックして下さい。
作成したアプリが無ければ何も表示されません。
アプリ情報を登録します。
- Name
Twitterアプリの名前を入力します。サービスにおいて一意の値でなければ弾かれるので注意して下さい。 - Description
アプリの詳細です。10文字以下だと怒られます。アプリによってはユーザに見える部分なので注意して設定しましょう。 - Website
ここは必須項目ですが適当でも大丈夫です。僕はブログのURLにしました。 - Callback URL
Bot開発では必要ないので無記入で大丈夫です。
上記が記入できたら
Developer Agreementをチェックして、[Create your twitter applications]クリックします。
登録情報に問題なければ、即時にアプリが作成されます。
(アカウントに電話番号が設定されていなければエラーになるので、もしエラーが出るようであれば設定して下さい)
Key情報の取得
[Keys and Access Tokens]を開いて、[Create my access token]をクリックしてキーを生成します。
Access TokenとAccess Token Secretが取得できました。
Twitter APIを叩くLambda Functionの作成
Twitterアプリのアクセストークンが取得できたので、次はTwitterのAPIを叩く関数をAWS Lambdaを使って構築します。
AWS Lambdaサービスで関数の登録
まずAWSサービスの中からLambdaを選択します。
[関数の作成]から設定を行います。
設計図(テンプレートのようなもの)を聞かれますが、今回は[一からの作成]で作っていきます。
次にトリガーの設定画面が表示されますが、定期実行の設定は後でするので[次へ]で進みます。
基本的な情報では関数名やランタイムを設定します。ランタイムは今回は’Node.js 6.10’にしてください。
Lambdaではコードの登録方法は3種類あり、「インラインで編集」「ZIPでアップロード」「S3からアップロード」です。今回は外部のライブラリを使用することもあり、ZIP形式でコードを登録します。
Lambda Functionの実行ロールを設定します。
ロールで「テンプレートから新しいロールを作成」を選択し、ロール名、ポリシーテンプレートを設定します。ポリシーテンプレートは「基本的なエッジLambdaのアクセス権限」を選択して下さい。
入力が完了したら[関数の作成]を実行します。
Twitter APIを叩くコードの作成
関数用のディレクトリを作成し初期化します。
関数モジュールを定義するファイル(index.js)を作成します。
1 2 3 4 |
$ mkdir TwitterBotTest $ npm init -f $ touch index.js |
Twitter APIを叩くパッケージをインストールします。
1 2 |
$ npm install twitter --save |
Lambda Functionではindex.jsファイルのexports.handlerにパラメータが引き渡されて処理が実行されます。index.jsにTwitter APIを呼び出すコードを記述していきます。
1 2 3 4 |
exports.handler = (event, context, callback) => { // ここに処理を記述する。 callback(null, 'Hello from Lambda'); }; |
まずは、Twitter APIを扱うパッケージをインポートします。
1 2 |
const twitter = require('twitter'); |
APIにアクセスするために、Twitterアカウントと登録したアプリ情報を紐付けるKeyを設定します。
1 2 3 4 5 6 7 |
const twitter_client = new twitter({ consumer_key: 'XXXXXX', consumer_secret: 'XXXXXX', access_token_key: 'XXXXXX-XXXXXX', access_token_secret: 'XXXXXX' }); |
Twitterに投稿する処理は以下の通り記述します。
callbackメソッドで処理結果を返します。
1 2 3 4 5 6 7 |
twitter_client.post('statuses/update', {status: 'Twitterはじめました。' + date}, function(error, tweet, response){ if(error) { callback(null, 'Twitter bot error.'); } callback(null, 'Twitter bot end.'); }); |
以下が全文です。Twitter APIでは同じ内容の投稿はエラーとなるため日付を入れています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const twitter = require('twitter'); const twitter_client = new twitter({ consumer_key: 'XXXXXX', consumer_secret: 'XXXXXX', access_token_key: 'XXXXXX-XXXXXX', access_token_secret: 'XXXXXX' }); exports.handler = (event, context, callback) => { let date = new Date(); twitter_client.post('statuses/update', {status: 'Twitterはじめました。' + date}, function(error, tweet, response){ if(error) { callback(null, 'Twitter bot error.'); } callback(null, 'Twitter bot end.'); }); }; |
Lambda Functionとして登録するためにZIPファイルにします。
以下のコマンドでindex.jsファイルと使用したパッケージ群をZipファイルに圧縮します。
1 2 |
$ zip -r lambdaupload.zip ./index.js ./node_modules/ |
[コード]タブの[コードエントリタイプ]から[.ZIPファイルをアップロード]を選択し、作成したZipファイルをアップロードします。
[保存してテスト]を実行すると関数が実行され、処理が成功するとTwitterに投稿されます。
[実行結果]からログを確認することが出来ます。console.logもここで確認できます。
Twitterへの投稿が成功しました!
タイムゾーンがUTCになっているので、環境変数にタイムゾーンを設定します。
キー | 値 |
---|---|
TZ | Asia/Tokyo |
これでTwitterに投稿する関数が出来ました!
CloudWatchで定期的につぶやく
CloudWatchを使えば、cron感覚で定期的に関数を実行させることが出来ます。
[トリガー]タブから[トリガーを追加]をクリックしてトリガータイプを選択します。
CloudWatch Eventsを選択します。
ルールで[新規ルールの作成]を選択し、ルール名および説明を入力します。
今回作成するのはBotなのでルールタイプは[スケジュール式]にします。
Lambdaのスケジューリングはcron式で指定できます。
10分おきに実行する場合は以下の通り設定します。
1 2 |
cron(0/10 * * * ? *) |
これで10分おきにTwitterに投稿するBotが完成しました!
Lambda良いですね!
アップできるコード量に制限がありますが、使い方次第では色々なアイデアが試せそうです。
Botを作るのであればぜひ検討してみてはどうでしょう。