ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

AWS Lambdaを利用してpythonでslack通知を実装する

こんにちは。takapy(@takapy0210)です。

本記事は、転職カウントダウンカレンダー 4日目の記事です。リフレッシュを兼ねてDocker以外の記事を挟みます。

www.takapy.work

はじめに

AWS Lambdaというサービスを学ぶために、超簡易的な固定メッセージslack通知を作りました。最終的には、毎日定刻に固定のメッセージをslackへ通知できるようになりました。

SlackのWorkspaceにIncoming Webhookを登録

多くの記事が出回っているので、こちらは割愛させていただきます。

AWS Simple Queue Serviceの作成

Lambda起動用のSQSを作成します。(作成方法は他記事にお任せします)このSQSにメッセージが送信されたら、Lambdaが起動してslack通知が行われるようにします。

Lambda関数の作成

マネジメントコンソールからlambdaを検索し、関数の作成を実行します。

f:id:taxa_program:20190219164415p:plain
Lambda関数の設定

上記のように、左側からSQSを選択してトリガーへ追加します。

追加すると、下部にどのSQSをトリガーとするか指定する画面が表示されるため、冒頭で作成したSQSを指定します。

f:id:taxa_program:20190219174904p:plain
SQS設定後の画面イメージ

python3でlambda関数を作成する

lambdaを選択すると(上図でいうところのlambda_slackbot)、下記のような簡易エディタが表示されます。

f:id:taxa_program:20190220140536p:plain
Lambdaの簡易エディタ

今回はslack通知するので、下記のようなコードをここに記述します。

import json
import urllib.request

def lambda_handler(event, context):
    response = post_slack()
    return response

def post_slack():

    # 設定
    SLACK_POST_URL = "https://hooks.slack.com/XXXXXXXXXXXXX"
    username = "takapyBot"
    icom = ":sunglasses:"
    channnel = '#aws'
    method = "POST"

    # メッセージの内容
    message = "Lambdaから定期botです!!!!"
    send_data = {
        "username": username,
        "icon_emoji": icom,
        "text": message,
        "channel": channnel
    }

    send_text = ("payload=" + json.dumps(send_data)).encode('utf-8')

    request = urllib.request.Request(
        SLACK_POST_URL,
        data=send_text,
        method=method
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')

    return response_body

テスト実行してみる

Lambda関数はテスト実行することができます。

f:id:taxa_program:20190219175541p:plain
右上からテストを作成できる

画面右上のテストボタンからテストを行うことができます。

f:id:taxa_program:20190219175708p:plain
テストイベント例

テストイベントを作成しイベントの中身を記述します。 補足ですが、ココに記述されたjsonがlambda_handler(event, context)関数の引数eventの内容となります。 今回は引数eventを使用していないためどのような内容でも問題ありません。 (例としてtakapyTestEventsというテストを作成してみました。)

テスト実行してみた結果、正しくslack通知されました!!

f:id:taxa_program:20190219180155p:plain:w450
テスト結果

この後、実際にSQSにメッセージを送信して動作確認しましたが、テスト実行時と同じく想定通りの動作をしてくれました。

毎日定刻につぶやくように設定してみる

ここまででslack通知は実装できたのですが、今のままだと誰かがSQSオジサンになって、手動でメッセージの送信をしなくてはなりません。

このSQSオジサンの存在を消すが休暇をとっても、自動的にslack通知できるようにしてみます。

新しくLambdaを作成し、下記のようにトリガーにを設定します。

f:id:taxa_program:20190219182526p:plain

ルールのスケジュール式などはこちらを参照下さい。

今回は日本標準時刻の11時に通知するようにしたいので、スケジュール式をcron(0 2 * * ? *)と設定しました。

協定世界時と日本の時差は下記をご参照下さい。

www.jisakeisan.com

上記設定で、毎日11時にslack通知されるようになります!

感想

思っていた以上に手軽に使えるサービスという印象でした。PythonでコーディングできるのでいろんなAPIと絡めた機能を実装できそうです。(どこかのAPIから取得したデータを毎日定刻にslack通知する、といったようなこともできそうです)

以上。