AWS Lambdaにいじめられたssul(feat.cold start)


              

KakaoTalkチャットロボットSandori


kakao i builderで微信ロボットを運転し、現在はすべてのスキル発火(apiの発火が必要)がaws lambdaを使用してサーバレス開発されている.自慢ではなく自慢なら今のプレイヤーは3500名を超える!!
韓国工学大学サンタクロースロボット

サーバなしとは?


サーバリースはクラウドネイティブ開発モデルであり、開発者がサーバを管理することなくアプリケーションを構築および実行できるようにします.
つまり、クラウドプロバイダがサーバインフラストラクチャの構成、メンテナンスなどを処理するため、開発者はビジネスロジックの作成にもっと力を入れることができます.

AWS Lambdaとは?


Lambdaは、サーバの構成や管理を必要とせずにコードを実行できるコンピューティングサービスです.Lambdaは、高可用性コンピューティングインフラストラクチャでコードを実行し、サーバとオペレーティングシステムのメンテナンス、容量構成と自動調整、コードとセキュリティパッチの配布、コードの監視と記録などのすべてのコンピューティングリソース管理を実行します.Lambdaでは、ほとんどのタイプのアプリケーションまたはバックエンドサービスのコードを実行できます.Lambdaでサポートされている言語の1つにコードを提供するだけです.
aws Lambdaソース

どうして私にこんなことをしたの?


しかし問題が発生した.
現在発生している天気イベント

NAVERの天気ページから、私はずっと鄭王東の天気をスクロールしていて、時にはページのラベル構造が変化したときに修正する必要があります.
すると、修正後のアプリケーションコードは、上図に示すようにerror code : 'NoneType' object is not subscriptablでエラーが発生しました.
kakao i builderには複数の戻りタイプがあり、オブジェクトを適切なjsonフォーマットに変換する必要があります.

天気はsimpleTextの形式で私たちのグループの履歴をjsonフォーマットに生成します.
コードはモジュール化されているため、いくつかの必要なコードは以下の通りです.
result = f"{dates}기준 정왕 날씨입니다\n현재날씨는 {today[0]}이고, {today[1]}"
return settings.GEN.set_text(result)
        
...
        
GEN = ReturnType()  # kakao-i type json generator
...
        
def init_json():
    return {
        "version": "2.0",
        "template": {
            "outputs": [
            ],
            "quickReplies": [
                {
                    "messageText": "도움말",
                    "action": "message",
                    "label": "도움말"
                }
            ]
        }
    }

...

class ReturnType:  # 리턴 타입별 JSON 형식을 만드는 곳 입니다.
    def __init__(self, reply_json: dict = None):
        self.return_json = init_json()
        if reply_json is not None:
            self.return_json['template']['quickReplies'].append(reply_json)

    def set_text(self, text, is_init=True):  # 텍스트 형식
        if is_init:
            self.return_json = init_json()  # 이전에 들어간 텍스트가 유지될건지 여부
        basic_text = {
            "simpleText": {
                "text": str(text)
            }
        }
        self.return_json["template"]["outputs"].append(basic_text)
        return self.return_json
コードに問題はないのでJSONマーシャルプロセスに問題があると考え,Json形式で生成されたReturnTypeに問題があると考えた.

kakao答えを教えてください


とりあえずコカソ側に問い合わせてみました.
スキルの接続は正常ですが、さまざまな理由でロボットが動作しない可能性があります.
1.botスタッフのスキルサーバがローカル(ローカル)環境
2.スキル機能は起動したが、出力値がない
3.JSONフォーマットが正しくない
4.BOTサーバーに問題が発生した場合など
うん.なるほど、まず1番がawslambdaで起動するので問題ないと思いますが、2番と3番の4番に問題があると思います.
そして、時間が遅すぎて、翌日やろうと思って寝てしまいました.

AWSの億カードはこのように始まったのです



急に一晩中寝て起きて、いい光景が見えました.

問題の原因




コールドスタートとは...
ランダ共有インスタンスプール.ramdaが実行されている場合は、インスタンスを受信した後に関数を設定して実行する必要があります(コードのロード、初期化など).これらの理由により、冷却始動と呼ばれる予想よりも長い時間が必要となる.1つの関数を5~7分実行してインスタンスを初期化するという.
aws lambdaには冷たい時間と暖かい時間があります.Lambdaは高いので、リクエストが少なければ寒い時間に入ってapi呼び出しに予熱するので、時間がかかりました.
そのため、実行時にエラーが発生し、関数がタイムアウトしたり、構文エラーが検出されたり、応答オブジェクトをJSONとマークできなかったりして、実行時に関数を終了します.
そこで、私たちのクリスマスツリーはコードに異常が発生し、昨日と同じエラーコード「NoneType」objectis not subscripableが発生し、データはありませんが、処理しようとしたときに問題が発生しました.

解決策


1.ランダを呼び続けます.
実際には、コンテナを常に準備するようにランダを呼び出し続けたほうがいいです.ただし、コールのたびにコスト計算が行われるため、コストが高くなる可能性があります.
2.Ramdaのメモリを増やし、specを向上させる.
メモリ割り当てが多ければ多いほど計算能力が高くなるため、処理速度が速いほど遅延が小さくなります.
3.構成された同期の有効化
2019年のコールドスタートの問題を解決するためのオプションで、関数の呼び出しにすぐに応答できるように事前に準備できるオプションです.この機能を有効にすると、関数の環境が事前に設定され、遅延は減少しますが、追加のコストがかかります.

整理する


とにかく、問題はお金をたくさん使うことです.ううう
お金があれば、このような部分も解決できます...ますます多くのプレイヤーが指導者や射手がこれらの問題を解決することを望んでいる.