TwitterのbotをAWS Lightsailで稼働させてみる【Python】

# やりたいこと
文章を自動生成するTwitterのbotを自作して公開したい。
自動生成するプログラムとTwitterに投稿するプログラムは前回までで出来たので、今回はAWSを使って公開するところまでをやる。

https://qiita.com/fujii_273/items/bed7bf7b34fa0bb515c9

https://qiita.com/fujii_273/items/9bb05b3dfcd79d391ff7

# 環境
Windowsで開発したプログラムをAWSに上げる。

## 開発環境
・Windows 10
・Python 3.10.7

## 本番環境
・AWS Lightsail（Amazon Linux 2）
・Python 3.7.10

# やったこと
１．AWSのアカウント作成
２．AWS Lightsailのインスタンス作成
３．サーバに各種インストール
４．LightsailサーバーへSFTP接続
５．cronの設定

## １．AWSのアカウント作成
まず、botを載せるサーバを用意する。
今回は勉強も兼ねてAWSにします。
アカウントの作成時に、英語で住所を入力するように求められたので、以下のサイトを参考にしました。

https://kacfg.com/aws-account-create/#i-2

https://kimini.jp/

## ２．AWS Lightsailのインスタンス作成
botの公開先はいくつか候補があるようです。
・EC2
・Lightsail
・Lambda
今回作成したbotはSQLiteを含むのでLambdaは除外、EC2は設定が大変らしいので、Laightsailを使ってみます。

まず、インスタンス作成画面を開きます。
ロケーションは東京、プラットフォームはLinux/Unixを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/74c12190-ef3f-0454-492f-b3e67ef6557f.png)

次に設計図？の選択。\
今回はbotを定期的に動作させるだけなんで、”OSのみ”を選択、OSは``Amazon Linux 2``を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/9486cffe-71aa-6487-38bd-52c411a18082.png)

オプションについてはデフォルトのまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/c64aaa02-6264-3565-f396-7dab2cafdfad.png)

料金プランは一番安いやつで大丈夫でしょう。
この料金体系がわかりやすいのはLightsailの利点ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/4c69a6c6-62b9-0fe9-5336-ab0d545fd421.png)

任意でリソース名を入力します。
キーについての設定はそのままにしました。
最後に「インスタンス作成」ボタンをクリックして完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/5b7dc872-0dca-df35-3a5f-8b79ba194ea5.png)

すると、ホームに作成したインスタンスが表示されます。
（黒く塗りつぶしたところはIPアドレスです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/c6d0e953-40d3-6e1f-3fe4-959a804512a5.png)

## ３．サーバに各種インストール
インスタンス作成に成功したらサーバに接続してみましょう。
表示されているインスタンス右上のオレンジの四角マークをクリックするとLinuxのターミナルが開きます。
そしたらbotに必要な以下のものをインストールしました。

・MeCab
・unidic-lite
・mokrovify
・tweepy

このとき、ハマったのが、まずPythonのコマンド。
```
[ec2-user@ip-xxxx ~]$ python --version
Python 2.7.18
[ec2-user@ip-xxxx ~]$ python3 --version
Python 3.7.10
```

最初、``python --verserion``とうって、バージョンが2系なのに戸惑いました。
3系を使うなら``python3``とうてばいいんですね……。

これは``pip``コマンドも同様で、python3のpipを使うなら``pip3``とうちます。
```
[ec2-user@ip-xxxx ~]$ pip --version
pip 20.2.2 from /usr/lib/python2.7/site-packages/pip (python 2.7)
[ec2-user@ip-xxxx ~]$ pip3 --version
pip 20.2.2 from /usr/lib/python3.7/site-packages/pip (python 3.7)
```

それで次に以下のライブラリをインストールしたのですが、
・MeCab
・mokrovify
・tweepy
どうやらこれだけではMeCabが動かないようです。
後の工程でpyプログラムを実行して発覚したのですが、``MeCab.Tagger("-Owakati")``の記述のある個所でRuntimeErrorが発生します。
以下のサイトを参考にして``unidic-lite``というものもインストールします。

http://arduinopid.web.fc2.com/Q4-4.html

これで必要なもののインストールが完了しました。

## ４．LightsailサーバーへSFTP接続
サーバの準備は出来たのでいよいよbotをアップロードします。
使うのは``FileZilla``です。
LightsailのFTP接続の方法については公式ドキュメントを参考にしました。

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-connecting-to-linux-unix-instance-using-sftp

接続できたらファイルをアップロードします。
試しにターミナルから直接プログラムを叩いてみて動作することを確認しました。

## ５．cronの設定
あとは、cronを設定してbotを定期的に起動させるだけです。
今回のbotは自動生成した文章をツイート機能と、僕のアカウントからツイートを取得してDBに格納する機能の２つあります。
ファイルもそれぞれで２つあるのでcronも２つ設定します。

```crontab
50 * * * * /bin/python3 /home/ec2-user/hern/learn.py > /home/ec2-user/log/cron.log 2>&1
00 * * * * /bin/python3 /home/ec2-user/hern/post.py /home/ec2-user/log/cron.log 2>&1
```

上記の``50 * * * *``や``00 * * * *``は、それぞれ、毎時50分に実行する。毎時00分に実行する。です。
以下のサイトを参考にしました。

https://www.server-memo.net/tips/crontab.html

https://ex1.m-yabe.com/archives/3113

python3の場所は
```
sudo which python3
```
で調べました。
また、末尾の``> /home/ec2-user/log/cron.log 2>&1``は、エラーが発生した際にログに出すための記述です。

ともかく、これで設定は完了。

botのアカウントを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821521/15a58155-95af-8121-ed35-1767ff536c31.png)


うん。ちゃんとツイートしてます。いいですね！

今後はフォローバック機能や、リプライに反応する機能、生成する文章のブラッシュアップなどを目指したいと思います。

# 参考資料

https://qiita.com/fujii_273/items/bed7bf7b34fa0bb515c9

https://qiita.com/fujii_273/items/9bb05b3dfcd79d391ff7

https://kacfg.com/aws-account-create/#i-2

https://kimini.jp/

http://arduinopid.web.fc2.com/Q4-4.html

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-connecting-to-linux-unix-instance-using-sftp

https://www.server-memo.net/tips/crontab.html

https://ex1.m-yabe.com/archives/3113