LambdaでTwitterを検索!Slackに通知してエゴサの自動化2016年10月21日takuruTweetこんにちは、ポケモントレーナーの浅海です。最近になってようやく「げんきのかたまり」を使える様になりました。Lambdaというサービスの名前を聞く機会が多くあったので、どのようなものなのか調べたいと思っていましたが、ついに機会ができたので実際に使ってみました。LambdaとはLambdaがどのようなサービスなのかどうかは、AWS公式のドキュメントに説明が書かれています。その冒頭部分を引用します。インフラストラクチャを使用してコードの実行を代行するコンピューティングサービスです。コードを実行するサーバーのプロビジョニングおよび管理を行います。次のように使用できます。・・・・?インフラ面で造詣の深い方であればこれを読んで理解できるのだと思いますが、初心者の自分には理解不能でした。なんか全体的にAWSの公式ドキュメントは横文字が多くてクラクラしてしまいます。「自分で書いたコードを実行できる環境だ」というざっくりとしたことはなんとか理解できたので、単純なコードを書いてLambdaで実行してみようと思います。Lambdaのマネジメントコンソールでは「Lambda関数」という単位で物事を定義していくことになります。本記事では、LambdaでTwitterを検索してSlackに通知するLambda関数を実装するのですが、これを作ろうとした動機として、弊社はDocBaseというサービスを開発、運営していることがあります。DocBaseユーザ様の声をいち早く拾うために、Twitterで「DocBase」を検索してサポートに役立てていますが、このTwitterの検索はいつも手動でやっているので手間がかかります。その検索作業を自動化するために、「DocBase」というtweetをTwitterから取得して、Slackに通知するLambda関数をJavaScriptで作りました。Lambdaを触る前に、今回作成するモジュールに必要な次の3つを用意します。専用のIAMロールLambda関数は指定したIAMロールの権限で実行されるため、AWSの他サービスと連携する場合は、その権限があるIAMロールを作成する必要があります。今回はデータの保存場所としてS3を使うので、特定のS3バケットの操作権限のみ持ったIAMロールを作成しました。準備もできたところで、順を追ってLambda関数を作成していきます。function」というボタンがあるので押してみます。blueprintblueprintとは、言い換えるのであればレシピやテンプレート、雛形に相当します。画面には50種以上のblueprintが表示されていますが、今回はnodeモジュールを実行するbrueprintであるnode-execを選択します。triggersこの画面では、何を引き金(trigger)にしてLambda関数が実行されるのかを指定することができます。Schedule」を指定します。trigger」のチェックボックスをチェックしてしまうと定期実行が開始されてしまうので、動作テストが完了するまではチェックしないでおきます。roleだけを設定して完了とします。これで無事にLambda関数の定義が終わりました。Slackに通知まずはLambdaからSlackに単純なメッセージを送信してみます。Lambda関数の設定時にnode-execを選択したことからわかるように、開発にはnodeを使います。initして、そこで開発を始めます。Slack通知にはslack-nodeというモジュールを使うのでインストールします。--saveLambdaの設定では、Handlerという項目の初期値として「index.handler」が設定されています。これは「実行時はindex.jsのmodule.handlerを実行する」という状態で設定されているとういことなので、index.jsを用意し、module.handlerという関数を用意します。World!!」とだけ通知します。ちなみにnode-execを選択時のnode.jsのバーションは初期値でnode.js4.3のため、ES6が割と使えます。URLを直接記述していますが、これを隠したい場合にはKMSを使う方法があります。URLを暗号化したものを記述することになります。LambdaのマネジメントコンソールでFunctionsの画面を見ると、先程作成したLambda関数が追加されています。fileに変えて、ZIPをアップロードするようにします。先程作成したindex.jsと、nodeモジュールのインストール先となっているnode_modulesをまとめてZIPにしてアップロードします。node_modulesをZIPに含めるのを忘れると動きませんので注意してください。test」ボタンを押して実行してみます。Test」を押して実行に進んで問題ありません。World」と通知されたはずです。Twitter検索Twitter検索はtwitterというnodeモジュールをインストールして使うので苦労はありません。--save次のコードは、Twitterの検索結果を単純にSlackに投げるコードです。TwitterのAPIを利用するために用意するキーも、KMSを使用して暗号化したものを使用するのがよいでしょう。})}データの保存ここまででtweetをSlackに通知できるようになりました。このままでは実行する度に同じtweetをSlackに通知してしまう可能性があります。これを解消するために、最後に取得したtweetのIDを保存しておき、そのIDより大きいIDを持つtweetのみをSlackに通知するようにしたいと思います。Lambdaから扱えるデータの保存先としてはRDS、S3、ElasticCache、DynamoDBなどが考えられますが、今回のデータはtweetのidを1つだけ保存できれば良いので、RDSやElasticCacheなどはコストに見合いませんし、DynamoDBは扱ったことがありません。そのため、S3にテキストファイルとして保存するようにします。Lambda関数でs3を扱うために、aws-sdkというnodeモジュールを使用するのでインストールします。実はaws-sdkは標準で入っているため、アップロードするZIPに含めなくても動きますが、手順を揃えるために入れています。aws-sdkLambda関数に紐付けたIAMロールには、指定したバケットに読み書きできる権限を持たせておく必要があります。tweetのIDは、既に普通の整数型が扱いきれるような桁数では無いため文字列のまま比較をしています。ScheduleをEnableにします。すると、指定したcronの間隔で定期実行されるようになります。モジュールのバージョンこれまでに出てきたとおり、slack-node、twitter、aws-sdkの3つのnpmモジュールを使いました。package.jsonのdependenciesは次の状態で実装しています。}}料金体系https://aws.amazon.com/jp/lambda/pricing/今回のLambda関数では、メモリを最小128MB、15分毎の実行で運用しています。メモリが128MBの場合、100万リクエストと320万秒が毎月の無料枠になるため、余裕で無料運用できます。Lambdaの可能性Lambdaでやるようなことは、サーバが1つあれば実現できることが多いかとは思いますが、EC2インスタンスを1つ建てるよりも少ないコードかつ低コストで実現できることができます。Lambda関数に使用できる言語は今回使ったNode.jsの他に、JAVA,Pythonがあります。blueprintは50種以上、トリガーとして指定できるAWSサービスが9種類もあり、さらにこれらはいくらでもカスタマイズできるので、やれることはかなり多いようです。気になるのは、動作確認のためにはいちいちZIPをアップロードする点ですが、codeshipやServerlessのようにそれを改善する方法もあるようなので試してみたいと思います。プログラムが書けない人でも、IFTTTのレシピを使えば本記事で作ったLamda関数を簡単に作ることが出来ます。Lambdaを、ぜひ皆さんも使ってみて下さい。宣伝DocBaseとは情報共有を活発にし、チームを育てるをコンセプトにした情報共有サービスです。柔軟な権限設定と使いやすさ、社内の人も社外の人も全員を招待できるから、￼￼￼さまざまな人やツールに散らばっていた情報を一元化できます。積極的な情報共有と業務の効率化を実現し、チームの成長を促します。「いいね!」で応援よろしくお願いします!このエントリーに対するコメントコメントはまだありません。date*日本語が含まれない投稿は無視されますのでご注意ください。fax.0422-26-9781お問い合わせはこちらからどうぞ。