LoginSignup
0
5

More than 5 years have passed since last update.

プログラミング初心者が Python で Slack bot 作成 [ 本番編 ]

Last updated at Posted at 2019-04-10

はじめに

プログラミング初心者が Python で Slack bot 作成 [ 実践編 ] の続きとなります。
前回作成したものを AWS Lambda にデプロイ ( 本番環境で使えるようにすること ) していきます。
Lambda の設定が終わっていない方は こちら を参考にアカウントの作成をしてください。

開発環境

環境

  • Python
  • Docker
  • Make

ツール

  • Atom Editor
  • iTerm 2

本番環境

  • AWS Lambda

実践

IAM ロールの作成

ロールとは、複数の権限をひとまとめにしたもののことをいいます。
複数人で開発する際、誰に対してどの程度の権限を与えるかを設定するものになります。

まずは AWS にログインし、トップページの AWS のサービス から IAM を検索してください。

スクリーンショット 2019-04-10 15.05.11.png

左側の ロール から ロールの作成 をクリックしてください。

スクリーンショット 2019-04-10 15.10.03.png

このロールを使用するサービスを選択Lambda を選択して、 次のステップ : アクセス権限 をクリックします。

スクリーンショット 2019-04-02 16.04.47.png

特にアクセス権限は必要ないので、そのまま 次のステップ : タグ をクリックします。

スクリーンショット 2019-04-10 15.14.36.png

タグの追加も必要ないので、そのまま 次のステップ : 確認 をクリックします。

スクリーンショット 2019-04-10 15.16.50.png

最後に任意のロール名を付けて ロールの作成 をクリックして完了です!

スクリーンショット 2019-03-24 21.29.40.png

関数の作成

続いて実際にプログラムを動かす設定を行います。

トップページの AWS のサービス から Lambda を検索してください。

スクリーンショット 2019-04-10 15.29.09.png

続いて右上の 関数の作成 をクリックしてください。

スクリーンショット 2019-04-02 15.07.10.png

ここで Lambda で実行したいプログラムを登録することができます。
具体的なプログラムの設定を行います。

スクリーンショット 2019-04-02 15.19.48(1).png

  • 一から作成 を選択してください。
  • 基本的な情報関数名 は皆さんの自由で大丈夫です ( 降水強度の通知をしたいので rainfall_notification にしました ) 。
  • ランタイム は実行する言語を選択するので Python 3.6 にします。
  • アクセス権限実行ロール既存のロールを使用する を選択します。
  • 既存のロール で先程作成したロールを選択してください。

右下の 関数の作成 をクリックすると、次のような画面に移ります。

スクリーンショット 2019-04-04 22.24.55.png

まずはトリガーの設定を行います。
左側の トリガーの追加 から、 CloudWatch Events を選択してください。
これで設定した時間にプログラムを発火させることができます。
では画面下にある トリガーの設定 を説明していきます。

スクリーンショット 2019-04-04 23.05.21.png

  • ルール新規ルールの作成 を選択してください。
  • ルール名 は皆さんの自由で大丈夫です。
  • ルールの説明 は特に記入するする必要はありません。
  • ルールタイプスケジュール式 を選択してください。
  • スケジュール式 は cron を使用して設定していきます。 cron についてはこちらを参考にしてください。今回は 1 日に 4 回 ( 6時間に 1 回 ) 通知したいので cron(0 0/6 * * ? *) とします ( ただしこれは日本標準時ではなく、協定世界時なので注意してください ) 。
  • トリガーの有効化 にチェックを入れてください。

以上の設定が終わったら右下の 追加 をクリックしてください。

続いて関数の設定を行います。
先程設定した CloudWatch Events の右上の rainfall_notification をクリックしてください。

スクリーンショット 2019-04-04 22.29.29.png

画面下の 関数コード に作成したプログラムを書き込みます。
すでに記載してあるコードの下に追記してください。。

スクリーンショット 2019-04-05 12.45.16.png

まず urllib をインポートしましょう。

lambda_function
import json
import urllib.request # 追記

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

次に新たに関数を定義します ( 関数名は任意で ) 。

lambda_function
import json
import urllib.request

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def rainfall_notification(): # 追記

では定義した関数の中に作成したプログラムをまるっと移しましょう。

lambda_function
import json
import urllib.request

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def rainfall_notification():
    REQUEST_URL = '作成したリクエスト URL'

    WEB_HOOK_URL = '取得した Web hook URL'

    reqg = urllib.request.Request(REQUEST_URL)
        with urllib.request.urlopen(reqg) as res:
            response = res.read()

    response = response.decode()

    d = json.loads(response)

    rainfall = d['Feature'][0]['Property']['WeatherList']['Weather'][0]['Rainfall']

    payload_d = {
        'text': '現在の赤羽駅の降水強度は {} mm/h です。'.format(rainfall)
    }

    data = json.dumps(payload_d).encode('utf-8')

    reqp = urllib.request.Request(WEB_HOOK_URL, data, method='POST')
    with urllib.request.urlopen(reqp) as res:
        body = res.read().decode('utf-8')

ここで注意しなければいけないのが、 Python はインデント ( 段落 ) で関数の終わりを判断しているので、必ず def weather_notification の中に入るように書き込んでください。

では続いて発火するように設定してみましょう。

lambda_function
import json
import urllib.request

def lambda_handler(event, context):
    # TODO implement
    rainfall_notification() # 追記
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def rainfall_notification():
    REQUEST_URL = '作成したリクエスト URL'

    WEB_HOOK_URL = '取得した Web hook URL'

    reqg = urllib.request.Request(REQUEST_URL)
        with urllib.request.urlopen(reqg) as res:
            response = res.read()

    response = response.decode()

    d = json.loads(response)

    rainfall = d['Feature'][0]['Property']['WeatherList']['Weather'][0]['Rainfall']

    payload_d = {
        'text': '現在の赤羽駅の降水強度は {} mm/h です。'.format(rainfall)
    }

    data = json.dumps(payload_d).encode('utf-8')

    reqp = urllib.request.Request(WEB_HOOK_URL, data, method='POST')
    with urllib.request.urlopen(reqp) as res:
        body = res.read().decode('utf-8')

# TODO implementreturn の間に定義した関数を追記してください。

以上で関数の作成は完了です!
右上の 保存 をクリックして保存してください。

スクリーンショット 2019-04-10 17.43.02.png

テスト

ではテストをしてみましょう。
右上の テストイベントの選択 から テストイベントの設定 を選択してください。

スクリーンショット 2019-04-10 17.53.16.png

スクリーンショット 2019-04-05 14.14.12.png

イベント名 に任意の名前をつけてください。
それ以外は特に何も設定する必要はないので、そのまま 作成 をクリックしてください。

では実際にテストしてみましょう。
先程作成したテストイベントを選択して、 テスト をクリックしてください。

スクリーンショット 2019-04-05 14.20.11.png

Slack に通知が来れば成功です!

スクリーンショット 2019-04-05 15.21.37.png

最後に

とても長くなってしまいましたが、いかがだったでしょうか?
今回はエラー処理 ( リクエストが帰ってこなかったときの処理 ) は実装しなかったので、次に Bot を作るときに実装したいと思います。

0
5
0

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
0
5