funasaki memo

このブログ上の投稿は個人のものであり、所属する企業を代表する投稿ではありません。所属:AWSのSolutions Architect

Blog記事を書いたら非同期で自動的にAmazon Chime Roomにwebhookで投稿する

実現したいこと

  • Blogの記事を投稿したら、その内容がAmazon Chime Roomに自動で投稿されること
    • Amazon CloudWatch Eventを使って1時間に1回Lambdaを起動
    • LambdaがBlogのRSS Feedを取得して、最新の記事があれば、それをChime Roomに投稿する
    • Chime Roomには事前にinboundのwebhookを設定しておき、LambdaからHTTPでPOSTできるようにする

構成イメージ

f:id:kenjifunasaki:20181206205412p:plain

手順

1. Amazon ChimeでChime Roomを作成する

今回は事前にAmazon Chimeは利用済みで、Amazon Chime ApplicationもPCにインストール済み、すでにChimeにログイン、チャットが可能なものとします。まず最初にChime roomを作成します。
Chimeアプリ上で「File」→「New Chat Room」を選択します。

f:id:kenjifunasaki:20181206195310p:plain

Nameを記入後に、Createをクリックします。

f:id:kenjifunasaki:20181206195659p:plain

2. webhookの設定をする

作成したChime Room右上にある設定ボタンをクリックして、「Manage Webhook」を選択します。「New」を選択してwebhook名を記入してcreateを選択すると以下が表示されます。
f:id:kenjifunasaki:20181206200002p:plain

こちらにあるCopy Webhook URLを選択して、URLをメモしておきます。後程使います。

3. RSS Read用のLambda Functionを作成する

今回はPython 2.7を使用します。
f:id:kenjifunasaki:20181206200650p:plain

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に投稿するため)
f:id:kenjifunasaki:20181206202434p:plain

ここではLambdaを実行するための"myEvent"を既に定義してありますが、以下のようにmyEventを作成しておきます。

f:id:kenjifunasaki:20181206202747p:plain

作成したLambda functionとイベントを使ってテストしてみます。
f:id:kenjifunasaki:20181206210209p:plain

無事テストが成功し、Chime roomにもwebhookで書き込まれたことが確認できました。
f:id:kenjifunasaki:20181206203432p:plain

あとは、このLambda FunctionをCloudWatch Eventで1時間に1回定期実行させます。

4. CloudWatch Eventで1時間に1回Lambda Functionをinvokeする

Amazon CloudWatchのManagement Consoleを開いて、CloudWatch Eventのルールを作成します。イベントソースにて「スケジュール」を選択し、1時間おきに動作する設定にします。ターゲットはLambda 関数で、作成したLambda Functionを選択します。
f:id:kenjifunasaki:20181206203901p:plain
その次の画面でルール名を入力して、「ルールの作成」をクリックします。
f:id:kenjifunasaki:20181206204144p:plain

作成したルールの状態が有効になっていることを確認できれば、1時間おきに、先ほどのRSSReaderFunctionが呼ばれ、1時間以内に記事がpublishされていれば、RSS Feedにより最新の記事のタイトルとリンクがChime roomにpostされます。

以上で完了です!