LoginSignup
64
43

More than 3 years have passed since last update.

【初心者向け】AWS Lambda(Python) + API Gatewayで運行情報をお知らせしてくれるSlackAppを作るハンズオン!

Last updated at Posted at 2020-12-01

はじめに

こんにちは!DMM WEBCAMPでメンターをしています@piyorです。

通学・出勤の時に電車が遅延しているかの確認をSlackで出来たら
チームメンバーなどで共有ができて便利ですよね

という訳で、運行状況をPythonでスクレイピングしてその結果をSlackに送信するものを作成しました。

対象者

  • サーバレス(AWS Lambda)に興味がある方
  • Webスクレイピングに興味がある方
  • SlackAppに興味がある方

※今回Pythonのコードについては基本的には説明しません
※スクレイピングとはなに?って方はこちらの記事などを参考にしてください
※スクレイピングを禁止しているサイトも存在します。こちらの記事などを参考にしましょう

作るもの

👇こんな感じに、遅延・運休してる路線を通知してくれます
スクリーンショット 2020-12-01 10.09.21.png

👇この画像の部分を引っ張って来て、それをSlackに通知をするという流れになります
スクリーンショット 2020-12-01 10.02.16.png

目次

目次
構成
Lambda関数作成
API Gateway作成
SlackApp作成
Lambda関数の環境変数を設定する
朝の9時にSlackAppがPOSTしてくれるように設定する
終わりに
参考

構成

構成は、朝の通知以外にもSlackからコマンドを叩いたら結果が帰ってくるようにしました

Untitled (6).png

Lambda関数作成

Lambdaはサーバレスでコードを実行するためのサービスです
今回は、スクレイピング処理・Slackにスクレイピングの結果を送信するために使用します

Lambda関数を作成する

関数名:好きな関数名
ランタイム:Python3.8
他はデフォルト値で大丈夫です

スクリーンショット 2020-11-26 10.56.49.png

外部ライブラリ・関数コードを用意する

使用ライブラリの説明

  • os
    • 標準ライブラリの1つでOS依存の機能使用するためのライブラリです
    • 今回は環境変数を利用するために使用します
  • requests
    • HTTP通信のためのライブラリです
    • Webページを取得するために使用します
  • bs4 (beautifulsoup4)
    • Webページから情報を取得するためのライブラリです
    • スクレイピングを行うために使用します
  • slackweb
    • WebHookでSlackにPOSTするためのライブラリです

外部ライブラリ・関数コードの用意をする

Lambdaで外部ライブラリを使用する場合、別途用意する必要があります
詳細はAWS公式ドキュメントのPython の AWS Lambda デプロイパッケージなどを参考にしてください

今回は、使用する外部ライブラリ・関数コードを用意しているので次のコマンドを実行してください
※githubからクローンし、クローンしたファイル群をzip化するものです

コンソール
$ git clone https://github.com/piyoraik/delay_bot.git
$ cd delay_bot
$ zip -r delay_bot.zip ./

※コードだけ見たい方※

lambda_function.py
import requests, bs4, slackweb, os

# URL・トークンの定義
url = "https://transit.yahoo.co.jp/traininfo/area/6/"
slack = slackweb.Slack(url=os.environ['SLACK_URL'])

def lambda_handler(event, context):

    response = {
        'statusCode': 200,
        'isBase64Encoded': False,
        'headers': {'Content-Type': 'application/json'},
        'body': 'done'
    }

    fetch_result = data_fetch(url)

    # 取得先のタイトルを取得
    title = fetch_result.title.get_text()


    # 遅延情報の取得
    delay_info = fetch_result.find(id='mdStatusTroubleLine').find_all('a')
    delay_info_text = ''
    for info in delay_info:
        delay_info_text += "\n" + info.get_text() + "\n" + info.get('href')

    slack_send(slack, title, delay_info_text)

    return response

# slackに情報の送信
def slack_send(slack, title , text):
    attachments = []
    attachment = {
        "color":"#D00000",
        "title": title,
        "text": text,
        "mrkdwn_in": ["text", "pretext"]
    }
    attachments.append(attachment)
    slack.notify(attachments=attachments)

    return

# requestsでデータをスクレイピング   
def data_fetch(url):
    get_url = requests.get(url)
    bs4_obj = bs4.BeautifulSoup(get_url.text, 'html.parser')

    return bs4_obj

Lambdaにアップロードする

.zipファイルを選択して、zipファイル化したdelay_bot.zipを選択しアップロードします
スクリーンショット 2020-12-01 10.19.23.png

👇アップロードをしてこのようになっていればOKです
スクリーンショット 2020-11-26 1.24.05.png

※取得URLの変更を行う場合※

lambda_function.py
url = "https://transit.yahoo.co.jp/traininfo/area/6/"

現状ではlambda_function.py4行目のこの記述により
https://transit.yahoo.co.jp/traininfo/area/6/
このURLの情報を取得しています
例えば、関東エリアの運行情報を取得したい場合は、4行目の記述を以下のように修正します

lambda_function.py
url = "https://transit.yahoo.co.jp/traininfo/area/4/"

修正後に最新としてデプロイをクリックし、変更を反映させましょう

API Gateway作成

API GatewayはAPIの作成を行うサービスです
今回は、API Gatewayで作成したURLを呼び出すと先程作成したLambda関数を実行させるために使用します

API Gatewayの作成をする

APIタイプはREST APIで構築を行います
スクリーンショット 2020-11-26 11.10.44.png

API名を入力しましょう、他はデフォルト値で問題ありません
スクリーンショット 2020-11-26 11.21.07.png

メソッドを作成し設定を行う

アクションからメソッドの作成をクリックし、POSTを選択します
※メソッドについてはこちらの記事などを参考にしましょう

選択後、セットアップを行います。
Lambdaプロキシ結合の使用Lambda関数を選択しましょう、選択後に保存をクリックします
スクリーンショット 2020-11-26 11.39.39.png

APIのデプロイを行う

アクションからAPIのデプロイを選択しデプロイをしましょう

スクリーンショット 2020-11-30 14.34.40.png

スクリーンショット 2020-11-26 11.54.21.png

URLを確認する

デプロイをクリック後、URLが生成されます。
このURLは後で使用するのでいつでも確認できるようにしておきましょう

スクリーンショット 2020-11-26 11.58.16.png

ここまでで作成したLambda関数を上のURLから呼び出す設定が完了しました
※今回POSTメソッドで作成しているのでブラウザでそのままURLを開いてもLambda関数は実行されません※

SlackApp作成

SlackAppを作成する

まず、SlackAppを作成するために下記URLにアクセスします
https://api.slack.com/apps

アクセスしたらCreate New Appをクリックします
スクリーンショット 2020-11-26 12.49.05.png

SlackAppを作成するウィンドウが出てくるので、アプリ名とインストールをするワークスペースを選択します
選択後、Create Appをクリックし作成を行いましょう
スクリーンショット 2020-11-26 12.51.40.png

Slash Commandsを作成する

SlackからAPI Gateway経由でLambda関数を呼び出すためにこちらを使用します
SlashCommandsからCreate New Commandを選択します

スクリーンショット 2020-11-26 14.06.31.png

Slash Commandsを作成ページに遷移するのでコマンドの作成を行っていきましょう

次のように記述します

  • Command: 呼び出すコマンドを入力
  • RequestURL: API Gatewayのアドレスを入力
  • Short Description: コマンドの説明を入力
  • Usage Hint: 使い方のヒントを入力

入力が終わったらsaveをクリックし保存をしましょう

スクリーンショット 2020-11-26 14.16.03.png

Incoming Webhooksの設定を行う

Incoming Webhooksのページに遷移し有効にしましょう
有効にしたらAdd New Webhook to Workspaceという項目が現れるのでここをクリックします

スクリーンショット 2020-11-26 22.28.13.png

クリック後、SlackAppが投稿をするチャンネルを選択する画面が出てくるので選択し許可をします
選択後Webhook URLが発行されているので控えておきましょう、後で使用します

ワークスペースにSlackAppにインストール

一通りの作業が終了したので、ワークスペースにSlackAppをインストールしていきます
黄色に表示されている部分をreinstall your appを選択し、インストールを行います

スクリーンショット 2020-11-26 22.51.52.png

これでSlackAppの設定が完了です

Lambda関数の環境変数を設定する

環境変数の設定

Lambda関数からSlackに投稿するために環境変数の設定を行います
環境変数についてはこちらの記事などを参考にしてください

lambda_function.py
slack = slackweb.Slack(url=os.environ['SLACK_URL'])

PythonではLambda関数5行目のos.environ['SLACK_URL']が環境変数の部分になります

Lambdaの環境変数設定で設定を行います

次のように記述します
キー:「SLACK_URL」と入力
:Webhook URLをペースト

記述が出来たら保存を行います、これで環境変数の設定が完了です
スクリーンショット 2020-11-27 16.17.23.png

動作確認

ここまで終わったらSLACKからLambda関数を呼び出すための設定が完了です!
実際にSlackから動作を確認してみましょう

Slackから/commandと入力すると次のように出てくるので選択して投稿してみましょう
スクリーンショット 2020-11-27 16.31.07.png

POST後、このようにSlackAppから投稿されたら成功です!
スクリーンショット 2020-12-01 10.14.08.png

朝の9時にSlackAppがPOSTしてくれるように設定する

SlackのSlash Commandから要求することは出来たので毎朝9時に投稿してくれるように設定をしていきます

Lambda関数を開きトリガーを追加をクリックします

スクリーンショット 2020-12-01 10.16.45.png
クリックをすると、トリガー追加画面に遷移するのでEventBridge(CloudWatch Events)を選択します
今回はこのEventBridgeという機能を用いて毎朝9時に実行させます

それでは設定していきます、次のように入力しましょう
ルール:「新規ルールの作成」を選択
ルール名:ルール名を入力
ルールタイプ「スケジュール式」を選択
スケジュール式:cron(00 00 * * ? *)と入力

スケジュール式のcronの設定は、AWSのページにも記載されていますがUTC時間で設定をします
設定はcron(分 時 日 月 曜日)という記載方法になります
cronの設定については、AWS公式ドキュメントのルールのスケジュール式を参考にしてください

入力が出来たら追加をクリックしトリガーを有効化しましょう

スクリーンショット 2020-11-28 1.17.20.png
これで毎朝9時にSlackAppが9時になると遅延情報をお知らせしてくれるようになります!

終わりに

お疲れ様でした!
今回のハンズオンで少しでもAWSやPythonに興味を持っていただいたら幸いです!

明日は@yoshimurayoshikiの番です!引き続き楽しんでいってください!

参考

Slackにincoming webhook経由でpythonからメッセージをPOSTする
Python Webスクレイピング 実践入門
API Gateway + LambdaでREST API開発を体験しよう [10分で完成編]

64
43
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
43