Blog記事を書いたら非同期で自動的にAmazon Chime Roomにwebhookで投稿する
実現したいこと
構成イメージ
手順
1. Amazon ChimeでChime Roomを作成する
今回は事前にAmazon Chimeは利用済みで、Amazon Chime ApplicationもPCにインストール済み、すでにChimeにログイン、チャットが可能なものとします。まず最初にChime roomを作成します。
Chimeアプリ上で「File」→「New Chat Room」を選択します。
Nameを記入後に、Createをクリックします。
2. webhookの設定をする
作成したChime Room右上にある設定ボタンをクリックして、「Manage Webhook」を選択します。「New」を選択してwebhook名を記入してcreateを選択すると以下が表示されます。
こちらにあるCopy Webhook URLを選択して、URLをメモしておきます。後程使います。
3. RSS Read用のLambda Functionを作成する
今回はPython 2.7を使用します。
lambda_function.pyというファイルを作成します。中身は下記です。
import feedparser import requests import json import datetime from time import mktime def lambda_handler(event, context): NewsFeed = feedparser.parse("http://[Blog SiteのRSSのURL]") print 'Number of RSS posts :', len(NewsFeed.entries) entry = NewsFeed.entries[0] print 'Post Title :',entry.title time = entry.published_parsed result = datetime.datetime.now() - datetime.datetime.fromtimestamp(mktime(time)) s = result.total_seconds() if s < 3600: message = 'Title: ' + entry.title + '\r\n' + 'URL: ' + entry.link url = 'https://hooks.chime.aws/incomingwebhooks/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' payload = {"Content": message} headers = {'content-type': 'application/json'} response = requests.post(url, data=json.dumps(payload), headers=headers) return 'updated' else: return 'no updated' return { 'message' : message }
こちらのファイルを作成後、必要なライブラリをpipでインストールします。
$ pip install feedparser -t . $ pip install requests -t .
その後、先ほどのpythonのファイルを含めてzipで固めます。
$ zip -r lambda_function.zip ./*
AWS CLIで、このzipをアップします。(AWS CLIの設定は事前に設定済みとします。)
$ aws lambda update-function-code --function-name RSSReaderFunction --zip-file fileb://lambda_function.zip
aws configureコマンドを実行して、default regionは指定済みとします。
Lambda functionのアップデートが完了したら、AWS LambdaのManagement Consoleを見てみます。(事前にブログサイト側でもテスト記事の投稿をしておきます。今回のLambda functionは、BlogサイトのRSSを読み込んで、直近1時間以内に記事がpublishされれば、それをChime roomに投稿するため)
ここではLambdaを実行するための"myEvent"を既に定義してありますが、以下のようにmyEventを作成しておきます。
作成したLambda functionとイベントを使ってテストしてみます。
無事テストが成功し、Chime roomにもwebhookで書き込まれたことが確認できました。
あとは、このLambda FunctionをCloudWatch Eventで1時間に1回定期実行させます。
4. CloudWatch Eventで1時間に1回Lambda Functionをinvokeする
Amazon CloudWatchのManagement Consoleを開いて、CloudWatch Eventのルールを作成します。イベントソースにて「スケジュール」を選択し、1時間おきに動作する設定にします。ターゲットはLambda 関数で、作成したLambda Functionを選択します。
その次の画面でルール名を入力して、「ルールの作成」をクリックします。
作成したルールの状態が有効になっていることを確認できれば、1時間おきに、先ほどのRSSReaderFunctionが呼ばれ、1時間以内に記事がpublishされていれば、RSS Feedにより最新の記事のタイトルとリンクがChime roomにpostされます。
以上で完了です!