AWS

【AWS】LamdaからSlackに通知する仕組みをServerless Frameworkで構築する

どうも、AWS勉強中のとがみんです。

AWSアカウントを作成して、いろいろ作って遊んでみようと思うのですが、知らぬ間にコストが多くかかっていて絶望する….ってことが起こらないように、Slackに使用コストが通知される仕組みをまずはつくろうと思いました。

それにあたって、まずはシンプルにSlackにテキストメッセージを送るAppを作って動作確認してみようと思います。

今回作成するもの

今回つくるものは、EventBridgeとLamdaを活用して、Slackに通知を送る仕組みを作ります。

一定時間ごとにLamdaが起動し、Slackにメッセージを送信します。

Serverless Frameworkを活用して作成します。

作業手順概要

今回は以下のような作業手順で作成しました。

  1. Slackでの事前設定
  2. Serverless Frameworkプロジェクトの作成とデプロイ
  3. 作成したAppの動作確認

作業手順詳細

Slackでの事前設定

まずは、今回通知を飛ばす対象のチャンネルを作成します。今回は「aws-billing」というチャンネルを作成しています。

その後、「Incoming Webhook」というアプリケーションをSlackに導入し、外部サービスからSlackにメッセージを送信できるようにします。

今回はAWSのLamdaからSlackのチャンネルに投稿できるようにしていきます。

Slackの「アプリを追加する」から「Incoming Webhook」を検索し、設定を選択します。

Webブラウザに移行するので、新たに出てきたページでSlackに追加を選択します。

通知を飛ばすチャンネルを選択し、「Incoming Webhook インテグレーションの追加」を選択します。

WebhookのURLが発行されるので、このURLをAWSのLamdaで活用していきます。

Serverless Frameworkプロジェクトの作成とデプロイ

Serverless Frameworkを活用して、Slackにメッセージを送信するコードを作成していきます。

下記のコマンドを実行しテンプレートを作成します。

serverless create -t aws-python3

Pythonの外部モジュールを読み込むため、そのためのプラグインを追加します。

sls plugin install -n serverless-python-requirements

今回はPythonを用いてコードを記載しますが、AWSのLamdaに標準搭載されないライブラリを使用する際は、外部モジュールもデプロイする必要があります。

今回は、Slackへ通知を行うにあたって、Pythonのrequestsという外部モジュールを活用するため、serverless-python-requirementsライブラリをインストールします。

serverless frameworkで外部モジュールを利用したPythonのlambdaをデプロイする時は..

今回作成したAppのディレクトリ構造は下記のようになっています。

.
├── README.md
├── conf.yml
├── handler.py
├── node_modules
├── package-lock.json
├── requirements.txt
└── serverless.yml

編集するのはserverless.ymlconf.ymlhandler.pyrequirements.txtです。それぞれのファイルを紹介していきます。

serverless.yml

Lamda関数と、そのトリガーとしてEvent Brideを指定しています。
また、Slack通知先を指定するWebhookのURLはconf.ymlから呼び出すようにし、環境変数として設定しています。

EventBridgeには3分ごとにLamda関数を呼び出すように設定しています。

conf.yml

conf.ymlファイルには、Incoming Webhookの設定で取得したWebhook URLを記載しています。

このファイルは.gitignoreに記載し、git管理対象外にしています。

他者に知られると、他者がそのSlackチャンネルに自由にメッセージを送信できるようになってしまうため、GitHub等で管理する場合に公開されないように注意します。

handler.py

環境変数からSlackのWebhook URLを取得し、Slackへ通知する文章を作成後、通知する処理を行うというコードになります。

requirements.txt

requests

requirements.txtには、外部から読み込むモジュール名を記載します。
今回はrequestsというモジュールを活用するため、requestsと記載します。

これにより、デプロイ時にそのモジュールもデプロイされるようになります。

ソースコードの記載が完了したら、下記コマンドを実行しデプロイします。

sls deploy

下記のようにEventBrigeとLamdaが作成されます。

作成したAppの動作確認

EventBridgeに3分ごとにLamda関数を呼び出すような設定にしているため、3分ごとに下記のようにSlackへ通知が飛んでくることを確認できました。

まとめ

Lamda関数から、Slackへ通知を送る仕組みを構築しました。
次はCost ExplorerからAWSの費用を取得してSlackに通知する仕組みを構築していこうと思います。

これを応用して、AWSの各種サービスのコストをSlackへ通知し、監視できる仕組みを構築していこうと思います。