どうも、AWS勉強中のとがみんです。
AWSアカウントを作成して、いろいろ作って遊んでみようと思うのですが、知らぬ間にコストが多くかかっていて絶望する….ってことが起こらないように、Slackに使用コストが通知される仕組みをまずはつくろうと思いました。
それにあたって、まずはシンプルにSlackにテキストメッセージを送るAppを作って動作確認してみようと思います。
今回作成するもの
今回つくるものは、EventBridgeとLamdaを活用して、Slackに通知を送る仕組みを作ります。
一定時間ごとにLamdaが起動し、Slackにメッセージを送信します。
Serverless Frameworkを活用して作成します。
作業手順概要
今回は以下のような作業手順で作成しました。
- Slackでの事前設定
- Serverless Frameworkプロジェクトの作成とデプロイ
- 作成した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にメッセージを送信するコードを作成していきます。
下記のコマンドを実行しテンプレートを作成します。
Pythonの外部モジュールを読み込むため、そのためのプラグインを追加します。
今回は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.yml、conf.yml、handler.py、requirements.txtです。それぞれのファイルを紹介していきます。
serverless.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | service: aws-cost-alert frameworkVersion: "3" custom: otherfile: conf: ${file(./conf.yml)} provider: name: aws region: ap-northeast-1 runtime: python3.7 environment: SLACK_WEBHOOK_URL: ${self:custom.otherfile.conf.SLACK_WEBHOOK_URL} plugins: - serverless-python-requirements functions: PostSlackFunctions: handler: handler.post_slack events: - eventBridge: schedule: rate(3 minutes) |
Lamda関数と、そのトリガーとしてEvent Brideを指定しています。
また、Slack通知先を指定するWebhookのURLはconf.ymlから呼び出すようにし、環境変数として設定しています。
EventBridgeには3分ごとにLamda関数を呼び出すように設定しています。
conf.yml
1 | SLACK_WEBHOOK_URL: https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxx |
conf.ymlファイルには、Incoming Webhookの設定で取得したWebhook URLを記載しています。
このファイルは.gitignoreに記載し、git管理対象外にしています。
他者に知られると、他者がそのSlackチャンネルに自由にメッセージを送信できるようになってしまうため、GitHub等で管理する場合に公開されないように注意します。
handler.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import os import json import requests #環境変数からSlackに通知するためのURLを取得 SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL'] def post_slack(event, context) -> None: #通知内容の設定 payload = { 'attachments': [ { 'color': '#36a64f', 'pretext': 'Hello Slack!!', 'text': 'LamdaからSlackへ通知テスト' } ] } # Slackへのリクエストの作成と通知 try: response = requests.post(SLACK_WEBHOOK_URL, data=json.dumps(payload)) except requests.exceptions.RequestException as e: print(e) else: print(response.status_code) |
環境変数からSlackのWebhook URLを取得し、Slackへ通知する文章を作成後、通知する処理を行うというコードになります。
requirements.txt
requirements.txtには、外部から読み込むモジュール名を記載します。
今回はrequests
というモジュールを活用するため、requestsと記載します。
これにより、デプロイ時にそのモジュールもデプロイされるようになります。
ソースコードの記載が完了したら、下記コマンドを実行しデプロイします。
下記のようにEventBrigeとLamdaが作成されます。
作成したAppの動作確認
EventBridgeに3分ごとにLamda関数を呼び出すような設定にしているため、3分ごとに下記のようにSlackへ通知が飛んでくることを確認できました。
まとめ
Lamda関数から、Slackへ通知を送る仕組みを構築しました。
次はCost ExplorerからAWSの費用を取得してSlackに通知する仕組みを構築していこうと思います。
これを応用して、AWSの各種サービスのコストをSlackへ通知し、監視できる仕組みを構築していこうと思います。