ChatGPT APIを用いたSlack botをAWSに移してみた。

少し前に作成した[ChatGPT APIを用いたSlack bot](https://qiita.com/katsuki_ono/items/5ba8d6b541bcbc633f56)をAWSに移してみました。

サーバー周りの設定は難しいので、他の方の記事を参考にして頂いた方が良いと思いますが、この記事では、
・常にChatGPT APIを用いたSlack botを使えるようにする方法
・iPadからインスタンスのコンソールを操作する方法
を記載します。

手順としては、
⒈AWSのEC2インスタンスを起動する
⒉Termiusからインスタンスにアクセスする
⒊インスタンスにコードを置き実行中にする
です。

# ⒈AWSのEC2インスタンスを起動する
まず、[AWS](https://aws.amazon.com/jp/)にアクセスして、アカウントを作成します。

アカウントを作成したら、検索するか、すべてのサービスを表示を押して、EC2 を選択して、ダッシュボードを開きます。※インスタンス作成は、アカウント作成時のルートユーザーで行うより、IAM ユーザーを作成して、IAM ユーザーでインスタンスを作成した方がセキュリティとしては、望ましいです。

EC2のダッシュボードが開いたら、ページの真ん中くらいにあるインスタンスを起動を押しインスタンスを作成します。

今回は、アプリケーションおよび OS イメージ (Amazon マシンイメージ)はubuntu、
インスタンスタイプは無料で使えるt2.micro、
にします。
あとは、キーペアを作成して、後ほど使うので、ダウンロードしてください。
他は好きなように設定して頂き、インスタンスを起動を押します。

インスタンスを起動を押して出てきたページの設定は任意で大丈夫です。

これで⒈AWSのEC2インスタンスを起動するは完了です。

# ⒉Termiusからインスタンスにアクセスする
作成したインスタンスにアクセスするため、[Termius](https://apps.apple.com/jp/app/termius-terminal-ssh-client/id549039908)をダウンロードして、Termiusを開きます。※この記事ではiPadからインスタンスにアクセスする方法を記載しています。

Termiusが開いたらアカウントを作成します。

アカウントを作成したら、左のメニューから、Hostsを押してNew Hostを作成します。

New Hostの設定では、以下のようにして、Save します。
・Aliasは好きな名前
・Hostnameは作成したインスタンスのパブリック IP アドレス(パブリック IP アドレスの取り方：AWSのEC2のダッシュボードから「実行中のインスタンス」を押す→作成したインスタンスを選択する→上のメニューの「接続」を押す→開かれたページからパブリック IP アドレスをコピーする)
・Use SSHをオンにする
・Usernameはubuntu(もし変更していたら変更したユーザー名)
・Key はダウンロードしたキーペアを設定

作成したHostをタップして、インスタンスに接続します。黒い背景に緑文字のコンソールが開かれたら成功です。
※初回、起動に時間がかかったり、アプリの再起動が必要な場合があります。

# ⒊インスタンスにコードを置き実行中にする
Termiusからインスタンスに接続します。

インスタンスに接続したら、ChatGPT APIを用いたSlack botに必要なインストールを下記のコマンドで行います。

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

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

slack boltのインストール
```
sudo pip install slack-bolt
```

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

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

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

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

作成したファイルの中に下記のbotのコードを入れて、ctrl oでファイルを保存して、ctrl xでファイルを閉じます。
※Slackとopenaiのキーやトークンをあらかじめ入れておいてください。
※このSlack botにはSlack APIの設定も必要になります。
※詳しくは[こちら](https://qiita.com/katsuki_ono/items/5ba8d6b541bcbc633f56)をご覧ください。
``` python
import openai
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os

os.environ["SLACK_BOT_TOKEN"] =  ""
os.environ["SLACK_SIGNING_SECRET"] = ""
os.environ["SLACK_APP_TOKEN"] =  ""

openai_api_key = ""

app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

openai.api_key = openai_api_key
assist1 = ""

@app.event("message")
def handle_message(event, say):
    global assist1
    text = event["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を更新
    say(assist1)

if __name__ == "__main__":
    handler = SocketModeHandler(app,app_token=os.environ.get("SLACK_APP_TOKEN"))
    handler.start()

```

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

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

screen内でpythonで作成したファイルを実行します。
```
python3 ファイル名.py
```

bolt run！的なやつが出力されたら上手くファイルを実行できています。

実行できていたらSlackにいるbotに話しかけてみてください。
下記のようになったら成功です！もうインスタンスから接続を切って大丈夫です。![A231A74E-C151-43F2-A1B6-58C73F8ECA5F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/d83f94c4-2ea3-e6c0-e839-41da615bdde8.jpeg)


補足
⒈screenを切るには、下記のコマンドを使います。

実行中のscreenを表示
```
screen -ls
```

screenを切る
```
screen -X -S <セッションID> quit
```

⒉ファイルを削除するには、ファイルのあるディレクトリで下記のコマンドを使います。
```
rm ファイル名
```

# 最後に
これでいつでも[ChatGPT APIを用いたSlack bot](https://qiita.com/katsuki_ono/items/5ba8d6b541bcbc633f56)と話せるようになりました。

やっぱりチャットbotは常に起動している方が楽しいですね。
また何か作ってみます。