LoginSignup
22
23

More than 5 years have passed since last update.

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

Posted at

はじめに

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以降は、別記事にまとめようと思いますので、乞うご期待!
参考になった方は、是非いいね!をお願いします。

22
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
23