SENAN

4人の仲間が交代で書く雑記

AWS LambdaでTwitter Botを作る Part1

      2016/02/02

AWS LambdaでTwitter Botを作ってみたいと思います。Part1ではLambdaからTwitterでつぶやくところまでを作ります。

事前準備

事前の準備としてAWSアカウント作成とTwitterアカウント作成を行います。
・AWSアカウント作成 ( https://aws.amazon.com
・Twitterアカウント作成( https://twitter.com/signup

ローカル開発環境

・nvm(Node Version Manager)
・npm(Node package Manager)
・Node v0.10.36( https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html
AWSでNodeのバージョンが指定されていますので、ローカルの環境を合わせます。バージョンを合わせるのにはnvmを使用すると簡単に合わせることができます。

手順

・Twitter App登録(API KEY取得)
・Lambdaアプリ開発
・IAM作成
・ソースコードのアップロード
・テスト

Twitter App登録

・登録サイトアクセス
https://dev.twitter.com/

・ページ下部の「Manage Your Apps」をクリック。
01_twitter_api

・「Create New App」をクリック。

・「Name」、「Description」、「Website」を入力して、規約に同意し登録。「Callback URL」は今回は使用しませんので、空欄でOKです。

・「Keys and Access Tokens」のタブをクリック。「Create my access token」をクリックして、アクセストークンを作成。
「Consumer Key(API Key)」、「Consumer Secret(API Secret)」、「Access Token」、「Access Token Secret」をメモ。
02_twitter_api_key

Lambdaアプリ開発

使用するNodeパッケージは以下のものです。
・twitter

今回はデバッグ用に次の2つのパッケージを使ってます。
・utils
・date-utils

パッケージのインストールはnpmを利用して行います。
プロジェクトのディレクトリで以下のコマンドでインストールされます。


$ mkdir node_modules
$ npm install twitter

Lambdaではindex.jsのファイルにexports.handlerにパラメータが引き渡されます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-custom-events.html


  exports.handler = function(event, context) {
  
  };

TwitterへのアクセスはパッケージにTwitterのサイトから取得した「Consumer Key(API Key)」、「Consumer Secret(API Secret)」、「Access Token」、「Access Token Secret」を利用します。
https://www.npmjs.com/package/twitter


var client = new Twitter({
  consumer_key: '',
  consumer_secret: '',
  access_token_key: '',
  access_token_secret: ''
});

TwitterにつぶやきをPostするには、次のように記述します。tweetにはTweetした時のボディ情報が、responseにはTwitterからの応答が入っています。


client.post('statuses/update', {status: 'Hello World.'},  function(error, tweet, response){
  if(error) throw error;
  console.log(tweet);
  console.log(response);
});

全体をまとめたソースコードは以下のようになります。


var util = require('util'),
    date_utils = require('date-utils');
    twitter = require('twitter');

exports.handler = function(event, context) {
    console.log("Lambda started.");

    var client = new twitter({
        consumer_key: 'xxx',
        consumer_secret: 'xxx',
        access_token_key: 'xxx-xxx',
        access_token_secret: 'xxx'
    });

    var dt = new Date();
    var current_datetime = dt.toFormat("YYYY/MM/DD HH24:MI:SS");

    client.post('statuses/update', {status: 'Hello world, ' + current_datetime},  function(error, tweet, response){
        if(error) {
            context.done('error', error);
        }
        console.log(tweet);
        console.log(response);
        context.done(null, "twitter status updated.");
    });
};

date-utilsで時刻を扱っているのは、Twitterでは同じつぶやきを2度連続して行うとエラーとなるためです。

Lambdaに作成したソースコードをアップロードする際には2つポイントがあります。
・パッケージも含めて圧縮する。
・下記の図のようにディレクトリを圧縮するのではなく、ソースコードとパッケージのディレクトリを選択して圧縮します。
03_directory_zip

以上でアップロードするソースコードの完成です。

IAMロール作成

Lambdaを実行するロールをAWSに作成します。
「AWS Management Console」より「Identity & Access Management」(IAM)を選択します。
04_aws_management_console

画面左側の「ロール」をクリックします。「新しいロールの作成」をクリックしウィザードに従ってロールを作成します。
・「ロール名」を入力します。
  自由です。
・ロールタイプの選択を行います。
  「AWS Lambda」を選択します。
・ポリシーのアタッチを行います。
  「AWSLambdaExecute」を選択します。
・確認して「ロールの作成」をクリックします。

ソースコードのアップロード

AWSに作成したソースコードをアップロードします。
「AWS Management Console」より「Lambda」を選択します。
05_aws_mc_lambda

・初めてLambdaを使用する場合はページ真ん中の「Get Started Now」をクリックします。2回目以降の場合は、「Create a Lambda function」をクリックします。
・テンプレート(blueprint)を選択できますが、「Skip」をクリックします。
・「Configure function」では、「Name」を入力し、「Runtime」で「Node.js」を選択します。
・「Lambda function code」では、「Upload a .ZIP file」を選択し、作成した圧縮ファイルをアップロードします。
・「Lambda function handler and role」では、「Handler」はデフォルトのままで、「Role」はIAMロール作成で作ったIAMロールを選択します。
・「Advanced settings」では、「Memory (MB)」、「Timeout」ともにデフォルトのままで大丈夫ですが、メモリ不足や時間切れが発生する場合は、拡大します。
・「Next」を押し、内容を確認したら「Create function」で作成を完了します。

テスト

開発したLambda functionをテストします。
「Lambda」のページから作成した機能をクリックします。画面中央部に実行結果が表示されます。
06_aws_lambda_test

その後、Twitterにアクセスすると投稿されていることが確認できます。
07_twitter_sample

まとめ

今回はLambdaからTwitterへつぶやくプログラムを作成してみました。次回は、これをBotとして機能追加していきたいと思います。
Lambdaには十分な無料使用枠が設定されており、無茶な使い方をしなければ、いろいろと遊べると思います。

 - プログラミング , , , ,