AWS Lambdaに自作プログラムをアップロード(再)

一つ上のディレクトリに戻って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上でプログラムを動かせました。しかし手元での実行と少し実行結果が異なっていました。次の記事では、ログを見ながらこの差を解決します。

© 2019- estie, inc.