AWS Lambdaを触りたい。
どうせなら何かと連携させて、ちょっと面白いことがしたい。
ってことで今回は、AWS Lambda×Slackで夕会をアナウンス通知するBotを作ってみました。
僕のプロフィールはこちら
前提
・AWSアカウントがあること
・Slackを利用していること
参考記事
URL:「https://qiita.com/yokoc1322/items/553ad147b82277b2beca」
今回作成したソースコード
URL:「https://github.com/izumin0401/aws-lambda-slack」
※GitHub上にプッシュしています。
Slackの準備
まずはSlackの準備をします。
「App」から「Incoming Webhook」を追加します。
「Slackに追加」をクリックします。
「Incoming Webhookインテグレーションの追加」をクリックします。
追加できました。
Webhook URLは控えておいてください。
AWS Lambdaの設定
「関数の作成」をクリックします。
上記のように入力し、「関数の作成」をクリックします。
今回、ソースコードはPythonで書きます。
また、ロールはデフォルトです。
次に、CloudWatch Eventをトリガーに設定します。
上記のように設定し、「追加」をクリックします。
スケジュールは夕方17時55分にSlack通知をしたいので、「cron(55 8 ? * MON-FRI *)」としています。
Lambdaのソースコードは関数コードから設定します。
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 26 27 28 29 30 31 32 33 34 35 |
import json import urllib.request def lambda_handler(event, context): post_slack() return fetch_response() def post_slack(): request = urllib.request.Request( {WebhookのURL}, data=fetch_post_data().encode("utf-8"), method="POST" ) with urllib.request.urlopen(request) as response: response_body = response.read().decode("utf-8") def fetch_post_data(): return "payload=" + json.dumps(fetch_payload()) def fetch_payload(): return { "username": "最強ずみちゃんBot", "icon_emoji": ":loudspeaker:", "text": fetch_text(), } def fetch_text(): return "そろそろ夕会始まりまっせ~" def fetch_response(): return { 'statusCode': 200, 'body': json.dumps('最強ずみちゃんBot') } |
↑がソースになります。
設定したら「保存」を忘れずに。
次にテストを設定します。
イベント名は適当でOKなので、設定したら「作成」をクリックします。
「テスト」をクリックするとテストが実行されます。
成功しました。
Slack通知が来ました!!
Lambdaに環境変数を設定してみる
さっきのソースコードは1個問題があります。
それは、「WebhookのURLをソースにべた書きしてしまっていること」です。
これはソース的にも考え方的にもいけてないので、URL等の情報は環境変数に設定することにします。
環境変数の設定
環境変数の「編集」をクリックし、上記のように設定します。
ソースの修正
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 26 27 28 29 30 31 32 33 34 35 36 |
import json import os import urllib.request def lambda_handler(event, context): post_slack() return fetch_response() def post_slack(): request = urllib.request.Request( os.environ['WEB_HOOK_URL'], data=fetch_post_data().encode("utf-8"), method="POST" ) with urllib.request.urlopen(request) as response: response_body = response.read().decode("utf-8") def fetch_post_data(): return "payload=" + json.dumps(fetch_payload()) def fetch_payload(): return { "username": "最強ずみちゃんBot", "icon_emoji": ":loudspeaker:", "text": fetch_text(), } def fetch_text(): return "そろそろ夕会始まりまっせ~" def fetch_response(): return { 'statusCode': 200, 'body': json.dumps('最強ずみちゃんBot') } |
osをインポートし、環境変数の値を使用するように修正しました。
環境変数に値を設定すればソースコードは使いまわすことができるので、いちいちソースを修正したりする必要もありません。
念のためテストを実行し、テストが成功することを確認しておきましょう!
まとめ
AWS Lambdaってサーバレスで色々できるので最高に便利っすね。
あとはもう少し実用的なBotを作れればいいんですがね。。
ではさいなら。