lambda関数をEventbridgeで実行し、slackに通知してみた【Python】

IT

概要

lambda関数をEventbridgeで定期実行したい場合があるかと思います。

このとき、「lambda関数ちゃんと実行完了したっけ…」となって心配な皆様(筆者)、slackに完了通知を送ってスマホから確認できるようにしましょう。

lambda関数の準備

単純な関数を用意しました。
「notify_slack」がslackに通知を送る関数です。
「lambda_handler」関数内にある、「slack_url」という変数に環境変数を設定し、通知を送るようにします。

lambda_function.py

import urllib.request
import json
import os

def notify_slack(message, url):

   content = json.dumps(
           {"text": message}
       )
   try:
       request = urllib.request.Request(
           url,
           data=content.encode('utf-8'),
           method="POST"
       )
       with urllib.request.urlopen(request) as response:
           response_body = response.read().decode('utf-8')


   except Exception as e:
       print('error', e)

def lambda_handler(event, context):

   slack_url = os.environ['slack_url']

   try:
       text = 'Complete task, congratulation!!'
       notify_slack(text, slack_url)
       result = {
           "isBase64Encoded": False,
           'statusCode': 200,
           'headers': {
                   'Content-Type': 'application/json',
                   "Access-Control-Allow-Origin": '*'
               },
           'body': ""
       }
       return result
   except Exception as e:
       print(e)
       text = f'Failed: {e}'
       notify_slack(text, slack_url)
       result = {
           "isBase64Encoded": False,
           'statusCode': 500,
           'headers': {
                   'Content-Type': 'application/json',
                   "Access-Control-Allow-Origin": '*',
               },
           'body': "Internal Server Error"
       }
       return result

この関数をlambdaにデプロイします。
デプロイの方法が不明な場合、以下記事の「関数の準備」〜「関数の作成」を参考にしてください。

slackの設定

以下の手順で作成します。

  1. 通知を送りたいチャンネルを追加する(slack上で)
  2. 通知用のappを作成し、slackに追加する(web上で)
  3. 通知を送りたいチャンネルと紐づける(slack上で)
1. 通知を送りたいチャンネルを追加する。

slackアプリを開き、「チャンネルを追加する」から、通知を送りたいチャンネルを追加してください。今回は「通知テスト」というチャンネルを作成します。

(既に作成済みのチャンネルに通知を送りたい方は、次に進んでいただいて構いません)

作成できました!

2. 通知用のappを作成する

slackのワークスペースにログインし、以下のページにアクセスします。

Slack API: Applications | Slack

「Create New App」をクリックします。

「From scratch」をクリックします。

App nameを入力し、自身のワークスペースを選択します。
Create Appをクリックします。

左カラムの「Incoming Webhooks」を選択します。

右上の「Off」を「On」にし、下部の「Add New Webhook to Workspace」をクリックします。

1.で作成したチャンネルを選択し、アプリに権限を追加します。

Webhook URLが追加されたかと思います。このURLを後ほど、環境変数として使用します。
ひとまずアプリの設定は完了です。

3. slackに2で作成したappを追加する

slackに移動し、「App」の中に作成したappが存在すると思います。
それをクリックします。

「チャンネルにこのアプリを追加する」をクリックします。

通知を送りたいチャンネルを選択します。

チャンネルに、「<アプリ名>が参加しました。」とのチャットが送られているはずです。

これでslack側の設定は完了です!

lambda関数の環境変数の設定&通知テスト

デプロイした関数の、以下の「slack_url」の環境変数を設定します。

「設定」→「環境変数」→「編集」をクリックします。

「キー」に「slack_url」、「値」に、「2. 通知用のappを作成する」で作成したWebhook URLをコピペします。これで設定は完了です。

(「値」のページ参考)


では、実際にslackに通知が送信されるかテストしてみます。
「テスト」タブのテストをクリックします。


成功しました!slackも確認してみましょう。

作成したAppが実行され、無事に通知が送信されました!
これで、lambda関数の実行完了をslack通知で確認することができました。

lambda関数をEventbridgeで実行してみる

最後に、lambda関数の実行をEventbridgeから行いたいと思います。
今回は、毎日23時に実行するように設定します。

Eventbridgeの「スケジュール」をクリックしてください。

「スケジュールを作成」をクリックします。

スケジュール名を設定します。
定期的に(毎日)実行したいので、頻度は「定期的なスケジュール」を選択します。
タイムゾーンは、理解しやすいようにAsia/Tokyoにします。

スケジュールの種類は、今回は「cronベース」にします。
以下の設定で「毎日23時に実行」となります。設定すると、実際に起動する時間が一覧で表示されるので便利ですね..!
cronベースの設定の仕方は、以下を参考にしてください。

EventBridge スケジューラのスケジュールタイプ - EventBridge スケジューラ
cron ベース、レートベース、1 回限りのスケジュールタイプのほか、EventBridge スケジューラが夏時間やさまざまなタイムゾーンでのスケジューリングを管理する方法について説明します。

また、フレックスタイムウィンドウはオフで構いません。
ここまで設定が終わったら、「次へ」をクリックします。


ターゲットを選択します。今回はlambda関数の実行なので、AWS LambdaのInvokeを選択します。


作成したlambda関数を選択し、「次へ」をクリックします。


スケジュール完了後のアクションは「NONE」にします。
再試行ポリシーとデッドレターキューは特にこだわりがなければそのままでOKです。


アクセス許可は、もし既存のロールがある場合は設定いただいて構いません。
今回は、新規に作成し、そのロールを利用します。

実行ロールで「このスケジュールの新しいロールを作成」をクリックします。ロール名は自動で作成されます。ロール名は変更できますが、そのままでもよければ「次へ」をクリックします。

最後に、確認して問題がなければ「スケジュールを保存」をクリックします。

スケジュールが作成できました!

23時にslackに通知できています。
これで、lambda関数をEventbridgeで定期実行し、slackに通知する機能が実装できました。

最後に

ここまでお読みいただきありがとうございます。今回はEventbridge+slackで、lambda関数を定期実行してslackに通知する機能に関して紹介しました。slackに通知しておけば、スマホで簡単に確認できるので便利かなと思います!

みなさまのお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました