検索
連載

サーバレス初心者向け「AWS Lambda」「Amazon API Gateway」「Amazon EventBridge」を組み合わせたSlack通知AWSチートシート

AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は「AWS Lambda」と「Amazon API Gateway」を使って、Slackにメッセージを送るAPIを作成する方法、「Amazon EventBridge」を利用して一定間隔でメッセージを自動送信する方法を紹介する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

 「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、サーバレスでコードを実行できる「AWS Lambda」と、APIを作成、公開、管理できる「Amazon API Gateway」を使って、Slackにメッセージを送るAPIを作成する方法を紹介します。

 API GatewayとLambdaを組み合わせて利用するのはとてもよくあるユースケースです。今回の内容はとてもシンプルなので「LambdaやAPI Gatewayは触ったことがないからよく分からない」方も、試しやすい内容になっています。


図1 API GatewayとLambdaを利用したSlack通知

 また、APIとしてのLambdaの実行とは別に「Amazon EventBridge」を利用して一定間隔でメッセージを自動送信する方法についても併せて紹介します。


図2 EventBridgeとLambdaを利用したSlack通知

API GatewayとLambdaを利用したSlack通知

 次の手順で作業します。

  1. SlackへのIncoming Webhookの追加
  2. Lambda関数の構築
  3. API Gatewayを利用したREST APIの作成
  4. REST APIのデプロイ

1.SlackへのIncoming Webhookの追加

 Incoming WebhookはSlackのアプリケーションの一つで、外部のサービスからSlackへのメッセージ送信を簡易化できます。

 Slackワークスペースのサイドバー上部から「Slackをブラウズする」→「App」を選択して、アプリの一覧からIncoming Webhookを探して「追加」をクリックします。


図3 SlackアプリケーションとしてIncoming Webhookを追加

 ブラウザで「Slackapp directory」が開くので「Slackに追加」をクリックします。


図4 Slackapp directory の画面

 Incoming Webhookの設定画面に遷移したら、メッセージを送信する対象のチャンネルを選択して、「Incoming Webhookインテグレーションの追加」をクリックします。


図5 メッセージの送信先となるチャンネルの選択

 以上でIncoming Webhookのセットアップは完了です。遷移先ページで表示された「Webhook URL」を控えておきましょう。


図6 Webhook URLの取得

2.Lambda関数の構築

 AWSにログインし、Lambdaコンソールにアクセスして「関数の作成」をクリックします。

 関数の作成画面では、下記表の項目通りに設定して「関数の作成」をクリックします。なお、記載のない項目についてはデフォルトの設定のままで問題ありません。

設定項目 設定値
オプション 一から作成
関数名 slackPostFunction
ランタイム Python 3.9


図7 Lambda関数の作成画面

 作成したLambda関数の詳細ページが表示されたら、ページの中央にある「コードソース」の欄に記載されているデフォルトのコードを下記のように書き換えて「Deploy」をクリックします。なお、コード内の「https://hooks.slack.com/services/xxx/xxx/xxx」の部分は、前の手順で取得したWebhook URLに修正してください。

import json
import urllib.request
import logging
from collections import OrderedDict
import pprint
 
def lambda_handler(event, context):
    post_slack("Lambdaからメッセージを送信!")
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
 
def post_slack(argStr):
    message = argStr
    send_data = {
        "text": message,
    }
    send_text = json.dumps(send_data)
    request = urllib.request.Request(
        "https://hooks.slack.com/services/xxx/xxx/xxx", 
        data=send_text.encode('utf-8'), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')

 作成したLambda関数をテスト実行します。「テスト」ボタンをクリックして、下記表の通りにテストイベントを設定して「作成」をクリックします。なお今回は、イベントパラメーターは利用しないので、こちらはデフォルトのままで問題ありません。

設定項目 設定値
種別 新しいテストイベントの作成
イベント名 SlackTest
イベントテンプレート hello-world

 テストの作成が完了したら、再度「テスト」ボタンをクリックしてテストを実行します。Lambda関数が問題なく実行され、Slackにメッセージが送られればテストは成功です。


図8 Lambda関数によってSlackにメッセージを送信

3.API Gatewayを利用したREST APIの作成

 手順2.で作成したLambda関数をAPIとして呼び出すAPI Gatewayを設定します。API Gatewayコンソールにアクセスし、「APIを作成」をクリックします。「APIタイプを選択」画面では、「REST API」欄にある「構築」をクリックします。


図9 REST APIの構築

 「プロトコルを選択」画面では、下記表のように選択、入力して「APIの作成」ボタンをクリックします。

設定項目 設定値
プロトコル REST
新しいAPIの作成 新しいAPI
API名 postSlackAPI
説明 postSlackAPI
エンドポイントタイプ リージョン


図10 API Gatewayを利用したAPIの作成

 無事にAPIが作成されたら、エンドポイントとしてLambda関数を設定します。まずは、[アクション]→[リソースの作成]をクリックします。


図11 APIのリソース作成

 「新しい子リソース」画面が表示されたら、下記表の通りに入力して「リソースの作成」をクリックします。

設定項目 設定値
リソース名 postSlack
API Gateway CORSを有効にする チェックを付ける


図12 子リソースの作成

 作成したリソースに、GETメソッドのエンドポイントを作成します。「アクション」→「メソッドの作成」をクリックします。すると、リソースの下にプルダウンが表示されるので、「GET」を選択して横に表示されるチェックマークをクリックします。


図13 メソッドの作成

 画面右側にメソッドのセットアップが表示されたら、GETメソッドのエンドポイントがリクエストを受けた際に、Lambda関数を呼び出せるように、下記表の通りに設定して「保存」をクリックします。

設定項目 設定値
統合タイプ Lambda関数
Lambdaプロキシ統合の使用 チェック
Lambda slackPostFunction

図14 メソッドの設定

 「API Gatewayに、Lambda関数を呼び出す権限を与えようとしています」というメッセージが表示されるので、そのまま「OK」をクリックしてください。

 画面右側にメソッドのリクエストからレスポンスまでの流れが表示されたら「テスト」をクリックし、その後の画面でも続けて「テスト」を押してAPIをテスト実行します。


図15 メソッドのテスト実行

 Slackにメッセージが送られたことを確認できたらテストは成功です。

4.REST APIのデプロイ

 作成したAPI Gatewayを公開し、URL経由でAPIを実行できるようにします。API Gatewayコンソールで作成した「postSlackAPI」をクリックし、「アクション」→「APIのデプロイ」と選択します。「APIのデプロイ」ダイアログが表示されるので、デプロイ設定を選択、入力して「デプロイ」をクリックします。

設定項目 設定値
デプロイされるステージ 新しいステージ
ステージ名 test

 デプロイステージの作成完了後、リソース名の左に表示されているペインメニュー(▼)を開き、「/postSlack」の下の「GET」とメソッド名が表示されている部分をクリックします。


図16 デプロイしたAPIの呼び出しURL

 画面右側に表示された「URLの呼び出し」欄に表示されているURLを別タブで開き、Slackに通知されたらAPIのデプロイは完了です。

EventBridgeとLambdaを利用したSlack通知

 ここまでの手順ではLambda関数をAPI Gateway経由で呼び出していました。しかし、毎日決められた時間に実行したい処理がある場合や定期化したい場合には自動でLambda関数を実行できた方が便利です。

 ここからはEventBridge(CloudWatch Events)を利用して、スケジュールを指定したLambda関数の実行を設定します。


図2 EventBridgeとLambdaを利用したSlack通知(再掲)

 初めに、先ほど作成したLambda関数のコンソールから「トリガーを追加」をクリックします。


図17 Lambda関数にトリガーを追加

 トリガーの追加画面では、プルダウンから「EventBridge(CloudWatch Events)」を選択し、下記表の通りにルールを設定して「追加」をクリックします。

設定項目 設定値
ルール 新規ルールの作成
ルール名 lambda-execute-rule
ルールタイプ スケジュール式
スケジュール式 cron(0/1 * * * ? *)


図18 EventBridgeの設定

 ちなみに、今回指定するスケジュール式は、左から「(分 時 日 月 曜日 年)」の形式で指定する形式になっていて、上記の設定例では1分ごとにイベントをトリガーする指定になっています。以下にスケジュール式の例を幾つか記載しますが、詳しくはAWS公式ドキュメントを確認してください。

スケジュール式の例 意味
cron(0/1 * * * ? *) 1分ごとに実行
cron(0/15 * * * ? *) 15分ごとに実行
cron(0 10 * * ? *) 毎日午前10時(UTC)に実行
cron(0 18 ? * MON-FRI *) 毎週月曜日から金曜日まで午後6時(UTC)に実行

 EventBridgeの追加が完了したら、表示されたLambda関数のコンソール上で、トリガーにEventBridgeが追加されたことを確認します。


図19 Lambda関数コンソールでEventBridgeが追加されていることを確認

 Slackにメッセージが正しく送信されていることも確認します。


図20 EventBridgeによってLambda関数がSlackに送信したメッセージ

 Lambda関数コンソールのタブから「モニタリング」を選択してLambda関数の実行ログを確認すると、こちらからもLambda関数が1分おきに実行されていることを確認できます。


図21 Lambda関数の実行ログ

 最後に、このままだとLambda関数が永遠に実行されてしまうので、EventBridgeトリガーは削除しておきます。Lambdaコンソールの「設定」タブをクリックして、「トリガー」の一覧からEventBridgeを選択して「削除」をクリックします。


図22 「トリガー」の一覧からEventBridgeを選択して「削除」

 EventBridgeトリガー以外のリソースについても適宜削除してください。

おわりに

 今回はLambdaとAPI GatewayやEventBridgeを組み合わせたSlackへのメッセージ送信を紹介しました。これまでLambdaをあまり利用したことがない方も、ちょっとしたところでLambdaを手軽に利用できるイメージをつかめたのではないでしょうか。

 Lambdaに関しては過去にも本連載の以下の記事で取り上げているので、よろしければ今回の内容と併せて参考にしてみてください。

筆者紹介

天野盛介(あまのせいすけ)

株式会社システムシェアード

マルチクラウドへの閉域接続サービスのサービスマネジメント業務に従事した後、AWS案件での基盤構築支援などを担当。社内では、検証・学習用にAWSを完全定額で利用できるサービス「安心サンドボックス」の立ち上げや東京ITスクールのAWS研修におけるコンテンツ開発、Java・AWS研修の講師などを歴任。


Copyright © ITmedia, Inc. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る