EC2のAmazonLinux2でMinecraftDiscordChatSyncを使ってみた。

# 何の記事？
本記事は、**AmazonLinux2**での**MinecraftDiscordChatSync**の**利用手順**です。
### [MinecraftDiscordChatSync](https://github.com/Gakuto1112/MinecraftDiscordChatSync)とは
Minecraft上のチャットやイベントをDiscordチャンネル上で表示したり、逆にDiscord上のチャットをMinecraft上に表示できます。

こんな感じ
![schstot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457332/c56e7e2a-67ce-2c78-86a7-4e0eb9da7e32.png)

Nodejsとか触ったことがない自分はいくらか時間をかけてしまった箇所があるので共有のために記事に残します。

### 環境
Amazon Linux 2
arn
t4g.small

## 手順
###### 1. gitをインストール
```bash
sudo yum install git
```

###### 2. Minecraftのインストールディレクトリで以下を実行する。
```bash
git clone https://github.com/Gakuto1112/MinecraftDiscordChatSync.git
```

###### 3. [公式手順](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)に則ってnvmをインストールします。
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
. ~/.nvm/nvm.sh
```
パスを通す必要があるので、各自で実施。

###### 4. nvmをインストールします。互換性の関係で16を指定する必要があります。
```bash
nvm install 16
```

##### 5.npm installを実行しようとすると・・・・
```bash
npm install
```
うわあああああああああああああああああああああ
```
npm notice
npm notice New major version of npm available! 8.19.4 -> 9.6.7
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.7
npm notice Run npm install -g npm@9.6.7 to update!
npm notice
npm ERR! code 1
npm ERR! path /home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv
npm ERR! command failed
npm ERR! command sh -c -- node-gyp rebuild
npm ERR! make: Entering directory `/home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv/build'
npm ERR!   CC(target) Release/obj.target/iconv/binding.o
npm ERR! make: Leaving directory `/home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv/build'
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@9.1.0
npm ERR! gyp info using node@16.20.0 | linux | arm64
npm ERR! gyp info find Python using Python version 3.7.16 found at "/usr/bin/python3"
npm ERR! gyp http GET https://nodejs.org/download/release/v16.20.0/node-v16.20.0-headers.tar.gz
npm ERR! gyp http 200 https://nodejs.org/download/release/v16.20.0/node-v16.20.0-headers.tar.gz
npm ERR! gyp http GET https://nodejs.org/download/release/v16.20.0/SHASUMS256.txt
npm ERR! gyp http 200 https://nodejs.org/download/release/v16.20.0/SHASUMS256.txt
npm ERR! gyp info spawn /usr/bin/python3
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   '/home/ec2-user/.nvm/versions/node/v16.20.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'make',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv/build/config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/home/ec2-user/.nvm/versions/node/v16.20.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/home/ec2-user/.cache/node-gyp/16.20.0/include/node/common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=/home/ec2-user/.cache/node-gyp/16.20.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=/home/ec2-user/.nvm/versions/node/v16.20.0/lib/node_modules/npm/node_modules/node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=/home/ec2-user/.cache/node-gyp/16.20.0/<(target_arch)/node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=/home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp info spawn make
npm ERR! gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
npm ERR! make: cc: Command not found
npm ERR! make: *** [Release/obj.target/iconv/binding.o] Error 127
npm ERR! gyp ERR! build error
npm ERR! gyp ERR! stack Error: `make` failed with exit code: 2
npm ERR! gyp ERR! stack     at ChildProcess.onExit (/home/ec2-user/.nvm/versions/node/v16.20.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:201:23)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:513:28)
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:293:12)
npm ERR! gyp ERR! System Linux 5.10.179-166.674.amzn2.aarch64
npm ERR! gyp ERR! command "/home/ec2-user/.nvm/versions/node/v16.20.0/bin/node" "/home/ec2-user/.nvm/versions/node/v16.20.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
npm ERR! gyp ERR! cwd /home/ec2-user/minecraft/MinecraftDiscordChatSync/node_modules/iconv
npm ERR! gyp ERR! node -v v16.20.0
npm ERR! gyp ERR! node-gyp -v v9.1.0
npm ERR! gyp ERR! not ok

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ec2-user/.npm/_logs/2023-05-25T13_34_24_785Z-debug-0.log
```

###### 6. c++のコンパイラが無いことが原因らしいので、インストール
```bash
sudo yum install gcc-c++
```

###### 7. ts-nodeもインストールしないと怒られる。ちなみにグローバルオプションつけないと失敗する。何故かは知らん。
```bash
npm install -g ts-node
```

###### 8. 二度目の正直・・・
```bash
npm install
```
よっしゃ！あとは手順通りに設定するだけ。
```bash
ts-node MinecraftDiscordChatSync.ts
```
```
プラグインを読み込んでいます...
読み込まれたプラグイン
  - [正常] -> Advancements.ts
  - [正常] -> Death.ts
  - [正常] -> DiscordMessage.ts
  - [正常] -> PlayerJoin.ts
  - [正常] -> PlayerLeave.ts
  - [正常] -> PlayerMessage.ts
  - [正常] -> RconStart.ts
  - [正常] -> ServerStart.ts
  - [正常] -> ServerStop.ts
全てのプラグインが正常に読み込まれました。
設定ファイル検証をしています...
設定ファイル「Settings.json」が存在しません。
「Settings.json」を生成しました。ファイルを開いて必要な情報を入力して下さい。
```

# まとめ
以上がAmazonLinux2でMinecraftDiscordChatSyncを使う方法です。
nodejs知ってる人なら詰まることはないでしょうけど、何も知らない人は結構詰まるんじゃ・・・？

# おまけ
### 自動起動シェル
実行シェルを作ります。実行ユーザーはec2-userの想定。
```bash
sudo vi /home/ec2-user/discord_script.sh
```
シェル内容(stopは予備で置いてあるだけ)
```
#!/bin/bash

start() {
    if [ -f ~/.bash_profile ]; then
        . ~/.bash_profile
    fi
    cd /home/ec2-user/minecraft/MinecraftDiscordChatSync
    screen -AmdS discord ts-node MinecraftDiscordChatSync.ts -r
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
esac
```
ここでbash_profileの読み込みしないとシェルが実行できないんだけど、詳しいこと書こうとすると長くなっちゃうから・・・[ここ](https://dakensuk.com/2020/10/15/crontab.html)読んで・・・
要はコマンドラインから実行するときとcron/systemctlから実行するときとでいろいろ設定が違うって話・・・


もう一つ、サービスユニットを設定します。
```bash
sudo vi /etc/systemd/system/discord.service
```
内容はこう！
```
[Unit]
Description=Discord
After=network.target local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
User=ec2-user
WorkingDirectory=/home/ec2-user/
ExecStart=/home/ec2-user/discord_script.sh start

[Install]
WantedBy=multi-user.target
```
systemctlの有効化を行えば、自動起動設定は完了です。
```bash
sudo systemctl enable discord.service
sudo systemctl daemon-reload
```
次回起動時に自動で立ち上がってくれます。Minecraft側も自動起動しておけば、運用量がグッと減りますね！