サーバレス初心者向け「AWS Lambda」「Amazon API Gateway」「Amazon EventBridge」を組み合わせたSlack通知:AWSチートシート
AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は「AWS Lambda」と「Amazon API Gateway」を使って、Slackにメッセージを送るAPIを作成する方法、「Amazon EventBridge」を利用して一定間隔でメッセージを自動送信する方法を紹介する。
「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、サーバレスでコードを実行できる「AWS Lambda」と、APIを作成、公開、管理できる「Amazon API Gateway」を使って、Slackにメッセージを送るAPIを作成する方法を紹介します。
API GatewayとLambdaを組み合わせて利用するのはとてもよくあるユースケースです。今回の内容はとてもシンプルなので「LambdaやAPI Gatewayは触ったことがないからよく分からない」方も、試しやすい内容になっています。
また、APIとしてのLambdaの実行とは別に「Amazon EventBridge」を利用して一定間隔でメッセージを自動送信する方法についても併せて紹介します。
API GatewayとLambdaを利用したSlack通知
次の手順で作業します。
- SlackへのIncoming Webhookの追加
- Lambda関数の構築
- API Gatewayを利用したREST APIの作成
- REST APIのデプロイ
1.SlackへのIncoming Webhookの追加
Incoming WebhookはSlackのアプリケーションの一つで、外部のサービスからSlackへのメッセージ送信を簡易化できます。
Slackワークスペースのサイドバー上部から「Slackをブラウズする」→「App」を選択して、アプリの一覧からIncoming Webhookを探して「追加」をクリックします。
ブラウザで「Slackapp directory」が開くので「Slackに追加」をクリックします。
Incoming Webhookの設定画面に遷移したら、メッセージを送信する対象のチャンネルを選択して、「Incoming Webhookインテグレーションの追加」をクリックします。
以上でIncoming Webhookのセットアップは完了です。遷移先ページで表示された「Webhook URL」を控えておきましょう。
2.Lambda関数の構築
AWSにログインし、Lambdaコンソールにアクセスして「関数の作成」をクリックします。
関数の作成画面では、下記表の項目通りに設定して「関数の作成」をクリックします。なお、記載のない項目についてはデフォルトの設定のままで問題ありません。
設定項目 | 設定値 |
---|---|
オプション | 一から作成 |
関数名 | slackPostFunction |
ランタイム | Python 3.9 |
作成した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にメッセージが送られればテストは成功です。
3.API Gatewayを利用したREST APIの作成
手順2.で作成したLambda関数をAPIとして呼び出すAPI Gatewayを設定します。API Gatewayコンソールにアクセスし、「APIを作成」をクリックします。「APIタイプを選択」画面では、「REST API」欄にある「構築」をクリックします。
「プロトコルを選択」画面では、下記表のように選択、入力して「APIの作成」ボタンをクリックします。
設定項目 | 設定値 |
---|---|
プロトコル | REST |
新しいAPIの作成 | 新しいAPI |
API名 | postSlackAPI |
説明 | postSlackAPI |
エンドポイントタイプ | リージョン |
無事にAPIが作成されたら、エンドポイントとしてLambda関数を設定します。まずは、[アクション]→[リソースの作成]をクリックします。
「新しい子リソース」画面が表示されたら、下記表の通りに入力して「リソースの作成」をクリックします。
設定項目 | 設定値 |
---|---|
リソース名 | postSlack |
API Gateway CORSを有効にする | チェックを付ける |
作成したリソースに、GETメソッドのエンドポイントを作成します。「アクション」→「メソッドの作成」をクリックします。すると、リソースの下にプルダウンが表示されるので、「GET」を選択して横に表示されるチェックマークをクリックします。
画面右側にメソッドのセットアップが表示されたら、GETメソッドのエンドポイントがリクエストを受けた際に、Lambda関数を呼び出せるように、下記表の通りに設定して「保存」をクリックします。
設定項目 | 設定値 |
---|---|
統合タイプ | Lambda関数 |
Lambdaプロキシ統合の使用 | チェック |
Lambda | slackPostFunction |
「API Gatewayに、Lambda関数を呼び出す権限を与えようとしています」というメッセージが表示されるので、そのまま「OK」をクリックしてください。
画面右側にメソッドのリクエストからレスポンスまでの流れが表示されたら「テスト」をクリックし、その後の画面でも続けて「テスト」を押してAPIをテスト実行します。
Slackにメッセージが送られたことを確認できたらテストは成功です。
4.REST APIのデプロイ
作成したAPI Gatewayを公開し、URL経由でAPIを実行できるようにします。API Gatewayコンソールで作成した「postSlackAPI」をクリックし、「アクション」→「APIのデプロイ」と選択します。「APIのデプロイ」ダイアログが表示されるので、デプロイ設定を選択、入力して「デプロイ」をクリックします。
設定項目 | 設定値 |
---|---|
デプロイされるステージ | 新しいステージ |
ステージ名 | test |
デプロイステージの作成完了後、リソース名の左に表示されているペインメニュー(▼)を開き、「/postSlack」の下の「GET」とメソッド名が表示されている部分をクリックします。
画面右側に表示された「URLの呼び出し」欄に表示されているURLを別タブで開き、Slackに通知されたらAPIのデプロイは完了です。
EventBridgeとLambdaを利用したSlack通知
ここまでの手順ではLambda関数をAPI Gateway経由で呼び出していました。しかし、毎日決められた時間に実行したい処理がある場合や定期化したい場合には自動でLambda関数を実行できた方が便利です。
ここからはEventBridge(CloudWatch Events)を利用して、スケジュールを指定したLambda関数の実行を設定します。
初めに、先ほど作成したLambda関数のコンソールから「トリガーを追加」をクリックします。
トリガーの追加画面では、プルダウンから「EventBridge(CloudWatch Events)」を選択し、下記表の通りにルールを設定して「追加」をクリックします。
設定項目 | 設定値 |
---|---|
ルール | 新規ルールの作成 |
ルール名 | lambda-execute-rule |
ルールタイプ | スケジュール式 |
スケジュール式 | cron(0/1 * * * ? *) |
ちなみに、今回指定するスケジュール式は、左から「(分 時 日 月 曜日 年)」の形式で指定する形式になっていて、上記の設定例では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が追加されたことを確認します。
Slackにメッセージが正しく送信されていることも確認します。
Lambda関数コンソールのタブから「モニタリング」を選択してLambda関数の実行ログを確認すると、こちらからもLambda関数が1分おきに実行されていることを確認できます。
最後に、このままだとLambda関数が永遠に実行されてしまうので、EventBridgeトリガーは削除しておきます。Lambdaコンソールの「設定」タブをクリックして、「トリガー」の一覧からEventBridgeを選択して「削除」をクリックします。
EventBridgeトリガー以外のリソースについても適宜削除してください。
おわりに
今回はLambdaとAPI GatewayやEventBridgeを組み合わせたSlackへのメッセージ送信を紹介しました。これまでLambdaをあまり利用したことがない方も、ちょっとしたところでLambdaを手軽に利用できるイメージをつかめたのではないでしょうか。
Lambdaに関しては過去にも本連載の以下の記事で取り上げているので、よろしければ今回の内容と併せて参考にしてみてください。
- 「AWS Lambda」とPython Boto3を使ってEC2インスタンスを操作する「AWS SDK」入門
- 「AWS Lambda」の基礎中の基礎、「Amazon S3」にアップロードした画像の自動補正――Lambda関数を「AWS Cloud9」で実装する
- 「Amazon S3」にアップロードしたCSVファイルを「Amazon DynamoDB」に自動登録する「AWS Lambda」関数の作り方
筆者紹介
天野盛介(あまのせいすけ)
マルチクラウドへの閉域接続サービスのサービスマネジメント業務に従事した後、AWS案件での基盤構築支援などを担当。社内では、検証・学習用にAWSを完全定額で利用できるサービス「安心サンドボックス」の立ち上げや東京ITスクールのAWS研修におけるコンテンツ開発、Java・AWS研修の講師などを歴任。
- 著書『AWSを好きになる本 ゼロから始めるクラウドジャーニー』(インプレスR&D)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「AWS Lambda」が拡張機能を介して各種運用ツールと統合可能に
サーバのプロビジョニングや管理をすることなくコードを実行できる「AWS Lambda」サービスが利用しやすくなった。AWS Lambda拡張機能を使うことでモニタリングや可観測性、セキュリティ、ガバナンスのための運用ツールをAWS Lambdaと統合して利用できる。 - 新社会人も必見、AWSを題材にクラウドセキュリティの基礎が親子で学べる無料の電子書籍
人気過去連載を電子書籍化し、無料ダウンロード提供する@IT eBookシリーズ。第90弾は、親子の会話で出てくるような素朴な疑問点から、クラウド環境における情報セキュリティの技術を学習する連載「親子の会話から学ぶクラウドセキュリティ」です。新社会人はもちろん、クラウドを扱う全ての人に身に付けてほしいセキュリティの知識を、AWSを題材に学習します。 - セキュリティログ分析基盤におけるクラウド活用、組織体制、メンバー育成のポイント
セキュリティ業務における「ログ」と、その分析基盤の活用について解説する連載。最終回は、クラウド活用、組織体制、メンバー育成のポイントを紹介します。