ChatGPT APIを用いたLINE botをAWSのインスタンスに移してみた。

私がChatGPTを用いた開発を始めて、最初に作成した[ChatGPT APIを用いたLINE bot](https://qiita.com/katsuki_ono/items/df8830c8b07e3a59f354)をAWSのインスタンスに移してみました、

自己署名だとLINEがwebhook URLを認めてくれないので、今回もngrockを使用しました。

使用しているAWSのインスタンスのインスタンスイメージはubuntuです。

手順は、インスタンス上でChatGPT APIを用いたLINE botを実行中にするだけです。

# インスタンス上でChatGPT APIを用いたLINE botを実行中にする

まず、インスタンスにSSH接続します。

インスタンスのコンソールが開いたら以下をインストールします。

aptのアップデート
```
sudo apt update
```

pipのインストール
```
sudo apt install python3-pip
```

LINEのインストール
```
sudo pip install line-bot-sdk
```

ngrokのインストール
```
sudo pip install pyngrok
```

flaskのインストール
```
sudo pip install flask
```

openaiのインストール
```
sudo pip install openai
```

次にpythonのファイルを保存するディレクトリを作成します。
```
mkdir ディレクトリ名
```

作成したディレクトリに移動します。
```
cd ディレクトリ名
```

作成したディレクトリでファイルを作成します。
```
nano ファイル名
```

作成したファイルの中に下記のbotのコードを入れて、ctrl oでファイルを保存して、ctrl xでファイルを閉じます。
※LINE、ngrok、openaiのキーやトークンをコードに入れてください。これらの取得については、[こちら](https://qiita.com/katsuki_ono/items/df8830c8b07e3a59f354)を参考にしてください。

``` python
from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)
import os
from pyngrok import ngrok
from pyngrok.conf import PyngrokConfig
import openai


# LINEのチャネルシークレット
LINE_CHANNEL_SECRET = ''
# LINEのチャネルアクセストークン
LINE_ACCESS_TOKEN = ''
# ngrokのAuthtoken
NGROK_AUTHTOKEN = ''
# openaiのキー
openai.api_key = "" 

# URLの生成
ngrok.set_auth_token(NGROK_AUTHTOKEN)
os.system('kill -9 $(pgrep ngrok)')
https_tunnel = ngrok.connect(addr='127.0.0.1:5000',bind_tls=True)
print(https_tunnel)


app = Flask(__name__)

line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

@app.route("/test")
def test():
    return "TEST OK"

@app.route("/", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


assist1 = ""  # 初期化

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global assist1  # assist1をグローバル変数にする

    text = event.message.text
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "任意の設定"},
            {"role": "assistant", "content": assist1},
            {"role": "user", "content": text},
        ]
    )
    assist1 = response["choices"][0]["message"]["content"]  # assist1を更新
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response["choices"][0]["message"]["content"]),
    )


if __name__ == '__main__':
    app.run()
```

一度、上手くファイルが作成されているか下記のコマンドで確認します。
```
find ~
```

上手くファイルが作成されていたら、screenを作成します。
```
screen -S スクリーン名
```

ルート権限で、screen内でpythonで作成したファイルを実行します。
```
sudo python3 ファイル名.py
```

実行したら、生成されたURLを取得して、LINE Developers のダッシュボードにwebhook URLを設定します。(詳しくは、[こちら](https://qiita.com/katsuki_ono/items/df8830c8b07e3a59f354)を参考にしてください。)

※稀にエラーが発生します。エラーが発生した場合、エラー処理して頂くか、インスタンスを再起動してください。

webhook URLを設定後、LINE Developersで検証を押します。
成功と表示されたら、上手く接続出来ています。

ここまで出来たら、LINE  botを友達登録して話しかけてみてください。
 botから返答があれば、成功です！

# 最後に
慣れてくるとこの手のAWSインスタンスへの移行も簡単に行えますね。
ただ、screenだとインスタンスを再起動すると停止してしまうので、他のやり方に変更してみようかなと最近思っています。
また何か作ってみます。