一つ上のディレクトリに戻ってzipを作ります。
cd ../ zip -r9 layer.zip python
そしてそのzipファイルを、lambdaのレイヤーに登録し、
実行できているのかを細かく確認するために、kanehosi_tukeai.pyを
import ipadic import jaconv import MeCab import re import requests import time get_url = "https://slack.com/api/conversations.history" post_url = "https://slack.com/api/chat.postMessage" token = "xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxx..."# tokenを入れてください m = MeCab.Tagger(ipadic.MECAB_ARGS) #形態素解析用objectの宣言 def post_message(thread_ts): data["thread_ts"] = thread_ts requests.post(post_url, headers=header, data=data) def extract_hiragana(text): return "".join(re.findall(r'[ぁ-ゔー]', text)) def get_pronunciation_list(text): m_result = m.parse(text).splitlines() #mecabの解析結果の取得 m_result = m_result[:-1] #最後の1行は不要な行なので除く pro = [] #いい感じに切った読み全体を格納する変数 for v in m_result: if '\t' not in v: continue if v.split('\t')[1].split(",")[0] in ["記号"]: continue surface = v.split('\t')[0] #表層形 p = v.split('\t')[1].split(",") [7] #読みを取得, 8は発音 if p == '*':#発音が取得できていないときsurfaceで代用 p = surface if v.split('\t')[1].split(",")[0] in ["助詞", "助動詞"] and pro: pro[-1] += p else: pro.append(p) pro = [jaconv.kata2hira(p) for p in pro] #ひらがなをカタカナに変換 pro = [extract_hiragana(p) for p in pro if p] #余計な記号を削除 return pro def is_575(text: str) -> bool: words = get_pronunciation_list(text) length = 0 reversed_expected_length_list = [5, 7, 5] for word in words: if not reversed_expected_length_list: # 575が終わったのにまだ続く return False length += len(re.sub(r'[ぁぃぅぇぉゃゅょ]', '', word)) # 1音を構成しない文字 if length == reversed_expected_length_list[-1]: length = 0 reversed_expected_length_list.pop() if reversed_expected_length_list: # 575と切り取れなかった return False return True header={ "Authorization": "Bearer {}".format(token) } payload = { "channel" : "C0123456789",# Conversation IDを入れてください "oldest" : (time.time() - 60) } res = requests.get(get_url, headers=header, params=payload) data = { "channel" : "C0123456789",# Conversation IDを入れてください "text" : "それにつけても金の欲しさよ" } def post_77_to_575(event, context): print("A") json_channel_history = res.json() print("json_channel_history", json_channel_history) if "messages" not in json_channel_history: print("no message recentry, check token and channel ID") return for message in json_channel_history["messages"]: print("message: ", message["text"]) if is_575(message["text"]): post_message(message["ts"]) print("kanehosi-!") return if __name__ == "__main__": post_77_to_575("", "")
と、79行目と81行目に少し表示を増やしておきます。
このPythonファイルもLambdaのアップロード元ボタンからアップロードし、Slackに「古池や蛙飛びこむ水の音」と投稿誌、橙色のTestボタンを押すと…
Test Event Name test Response null Function Logs START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST A json_channel_history {'ok': True, 'oldest': 'xxxxxxxxxx.xxxxxx', 'messages': [{'client_msg_id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'type': 'message', 'text': '古池や蛙飛びこむ水の音', 'user': 'xxxxxxxxxxx', 'ts': 'xxxxxxxxxx.xxxxxx', 'team': 'xxxxxxxxxxx', 'blocks': [{'type': 'rich_text', 'block_id': 'z=KP', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': '古池や蛙飛びこむ水の音'}]}]}]}], 'has_more': False, 'pin_count': 0, 'channel_actions_ts': None, 'channel_actions_count': 0} message: 古池や蛙飛びこむ水の音 kanehosi-! END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx Duration: 204.84 ms Billed Duration: 205 ms Memory Size: 128 MB Max Memory Used: 64 MB Request ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx
Slack「スッコココ!」
おめでとうございます。200 ms 128MBなので0.001円くらいで575が判定され、「それにつけても金の欲しさよ」とリプライが来ました。
Q. ついに、終わったんですか? A. 定期実行されてる? LogStreamでLogを確認してみよう
じゃあ毎分この調子で来るかな?と新しく俳句をチャンネルに書き込みます。
判定されません。
テスト時と違って、printされたものがExecution resultsに出ていません。またLambdaのページをうろうろしていると、[モニタリング]タブにLogStreamというものがあり、Logが貯まっていそうです。リンクになっているのでここをクリックしてみると、print文の結果が出ています。
そしてここを見ると、最新のメッセージが取得できていないことがわかります。もしかしてhttps://slack.com/api/conversations.history
のせい? と疑って手元で実行しても、コンテナから実行してもうまく取得できます。AWSからの取得だけうまくいかないんでしょうか。仮説としてはUTCとの時差である9時間差が考えられましたが、デプロイ直後には動いていたのでこれは無さそうです。
この記事では、Lambda上でプログラムを動かせました。しかし手元での実行と少し実行結果が異なっていました。次の記事では、ログを見ながらこの差を解決します。