Python、Slack、Lambda、DynamoDBを使って簡単勤怠管理システムを作ってみた①

Python、Slack、Lambda、DynamoDBを使って簡単勤怠管理システムを作ってみた①:


はじめに

SlackとAWSを使用して、勤怠管理システムを作成してみました!

使用したサービスは、Slack、API Gateway、Lambda、DyanmoDBの4つです。

システム構成図は以下です。

(新しいAWSアイコン使ってみました!)



system.png



目次

1.IAMロールを作る

2.Lambdaを作る

3.LambdaからSlackに投稿する

4.API Gatewayを作る

5.SlackからLambdaに通知する

6.DynamoDBを作る

7.SlackからDynamoDBに書き込む

8.DynamoDBの情報をSlackで確認する


1.IAMロールを作る

Lambdaで使用するIAMロールを作成しておきます。

今回は、LambdaとDynamoDBのフルアクセス権限を付けておきます。

ロール名は、LambdaDynamoAccessRoleとします。


2.Lambdaを作る

WorkTimeManagementという名前で、Lambda関数を作成します。

ランタイムは、Python3.6です。

IAMロールには、先程作成したLambdaDynamoAccessRoleを利用します。


1.png


Lambda関数には、デフォルトでPython標準外のモジュールが含まれていないので、ZIPファイルにしてアップロードする必要があります。

ローカル環境で下記のコードを実行し、ZIPファイルを作成します。

terminal
$ mkdir environment 
$ cd environment 
$ pip install requests -t . 
$ zip -r environment.zip * 
コードエントリタイプの「.ZIPファイルをアップロード」を選択し、先程作成したenvironment.zipをアップロードします。


2.png


ここまでで、Lambda関数の作成は完了です。
3.png



3.LambdaからSlackに投稿する

SlackのIncoming Webhooksページに移動します。


4.png


ポストするチャンネルを指定すると、Webhook URLを取得することができます。
5_edit.png


このURLを利用して、LambdaからSlackにリクエストを投げます。

続いて、左上のFileタブから新規ファイルを作成し、ファイル名をlambda_function.pyとして保存します。
6_edit.png


lambda_function.pyのコードは、以下のように記述します。

lambda_function.py
import os 
import json 
import requests 
import boto3 
 
# Slack Incomming Webhooks URL 
SLACK_POST_URL = "https://hooks.slack.com/services/~" 
 
# Post to Slack 
def PostSlack(message, icon=':smile:', username='user', channel="#worktime"): 
 
    Dict_Payload = { 
    "text": message, 
    "username": username, 
    "icon_emoji": icon, 
    "channel": channel, 
    } 
 
    return requests.post(SLACK_POST_URL, data=json.dumps(Dict_Payload)) 
 
# Main Function 
def lambda_handler(event, context): 
 
    PostSlack(message="This is a 1st test!") 
 
    return "success!" 
プログラムを実行すると、Slackに「This is a 1st test!」とポストすることができます。


7.png


PostSlack関数の引数で指定するiconで、Slackポスト時のアイコンを指定することができます。

以下のURLにて、Slackの絵文字チートシートを確認できます。
https://www.webpagefx.com/tools/emoji-cheat-sheet/


4.API Gatewayを作る

Lambda→Slackはできましたが、Slack→Lambdaも必要です。

具体的には、Slackに書いた情報をLambdaで受け取り、データベースに書き込む必要があります。

上記操作を実現するため、今回はAPI Gatewayを使用します。

まずは、「WorkTimeAPI」という名前で、新たなAPIを作成します。


8.png


次に、アクションタブからリソースの作成を選択し、all-actionというリソースを作成します。
9.png


リソースを作成しましたら、再びアクションタブを選択し、次はメソッドの作成をクリックします。
10.png


メソッドの種類は、一先ずANYとしておきます。

先程作成したLambdaと連携したいので、Lambda関数名を「WorkTimeManagement」としておきます。
11.png


リソース、メソッドの作成が完了しましたら、いよいよAPIをデプロイします。

アクションタブから、APIのデプロイを選択します。
12_edit.png


ステージについて情報を記載し、右下の完了ボタンを押すと、APIのデプロイが完了します。
13.png


APIのデプロイが完了すると、ページ上部にURLが自動的に作成されます。

このURLを使用することで、APIの呼び出しが可能になります。
14_edit.png


続いて、API GatewayとSlackを連携します。

SlackのOutgoing Webhooksページに移動し、Add Outgoing WebHooks integretionを選択します。
15.png


チャンネルは#worktime、APIを呼び出すトリガーワードは、workとします。

URLには「~/dev/all-action」を記載し、下部のSave Settingsをクリックすると、SlackとAPI Gatewayの連携は完了です。
16_edit.png



5.SlackからLambdaに通知する

Outgoing Webhooks URLを作成する際、トリガーワードをworkと設定しました。

従って「work (message)」とSlackにポストすれば、Lambdaへその内容が届きます。

今回はテストとして、「work test」とSlackにポストし、そのユーザー名、メッセージ、日付、時刻を表示します。

lambda_function.pyは下記の通り更新します。

lambda_function.py
import os 
import json 
import requests 
import boto3 
from datetime import datetime, timedelta, timezone 
 
# Slack Incomming Webhooks URL 
SLACK_POST_URL = "https://hooks.slack.com/services/~" 
 
#KEYWORD 
USER_KEY = 'user_name=' 
TEXT_KEY = 'text=' 
TRIG_KEY = 'trigger_word=' 
 
# Post to Slack 
def PostSlack(message, icon=':smile:', username='manager', channel="#worktime"): 
 
    Dict_Payload = { 
    "text": message, 
    "username": username, 
    "icon_emoji": icon, 
    "channel": channel, 
    } 
 
    return requests.post(SLACK_POST_URL, data=json.dumps(Dict_Payload)) 
 
# Get body from event 
def __getBody(event): 
    body = event['body'] 
    return body 
 
# Get user name who posted on Slack   
def GetUserName(event, user_key, text_key): 
    body = __getBody(event) 
    user = body[body.find(user_key)+len(user_key):body.find(text_key)-1] 
    return user 
 
# Get posted message on Slack 
def GetMessage(event, text_key, trig_key): 
    body = __getBody(event) 
    text = body[body.find(text_key)+len(text_key):body.find(trig_key)-1] 
    word_list = text.split("+") 
    message = word_list[1] 
    return message 
 
# Get posted time on Slack 
def GetDateTime(): 
    JST = timezone(timedelta(hours=+9), 'JST') 
    now = str(datetime.now(JST)) 
    date = now[:now.find(" ")] 
    time = now[now.find(" "):now.find(".")] 
    return date, time 
 
# Main Function 
def lambda_handler(event, context): 
 
    user = GetUserName(event, USER_KEY, TEXT_KEY) 
    message = GetMessage(event, TEXT_KEY, TRIG_KEY) 
    date, time = GetDateTime() 
 
    PostSlack(message="User : "+str(user)) 
    PostSlack(message="Message : "+str(message)) 
    PostSlack(message="Date : "+str(date)) 
    PostSlack(message="Time : "+str(time)) 
 
    return "success!" 
Slackで「work test」と投稿したところ、Lambdaから投稿者のユーザー名、メッセージ、日付、時刻が返ってきました。


image.png



6.DynamoDBを作る


7.SlackからDynamoDBに書き込む


8.DynamoDBの情報をSlackで確認する


おわりに

Chapter6のDynamoDB以降は、別記事にまとめようと思いますので、乞うご期待!

参考になった方は、是非いいね!をお願いします。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)