awsのec2サーバーを使用してクラウド上のデータベースからUnityに値を取得したお話

# はじめに
お久しぶりです。
今回は前回の記事(https://qiita.com/komugikoShimizu/items/ff3bc3a2d9b3c62700d2 )でローカルのデータベースから値を取得していたものを、AWSでEC2サーバーを使用してクラウド上に設置した　というお話です。
ちょっとややこしい話が多くなりますが、最後までお話しします。
詰まったところも覚えているところは対処法を踏まえて解説していきます。
今回もまだまだ初心者である自分の理解をさらに深めるための記事でもありますので、まちがいもあるかとはおもいますがご了承ください。

# 環境
Unity(多分バージョンは何でも)
AWS EC2サーバー
・MySQL
・PHP

## AWS EC2サーバーについて
AWSが提供しているクラウド内の仮想サーバー。
LinuxなどOSを使用してAWS上にパソコンをもう一つ作るイメージ。
今回はそのパソコンにデータベースを作成して、そこにアクセスするよー　ってことです。

# AWSの環境構築について
0.AWSのアカウントを作成しよう(クレカ情報がいるよ)

1.最初のコンソール画面の検索から「EC2」を選択 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/4a3b324b-7a2c-9e4a-0ff9-9a43180036cc.png)


2.「インスタンスを起動」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/104382ac-48b1-a1f6-c981-8eb0f936b34d.png)

3.各種設定を行う(今回はテストするためなのでほぼすべて初期設定で可)
 ### キーペアについて
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/3de330a1-a3a1-61c6-6371-156db24d4905.png)
この画面で新規作成しましょう。
なおこうして作成したときにキーペアがダウンロードされますのでその場所も確認しておこう。(のちに利用します)

4.インスタンスの設定について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/87cb95f3-0dea-1f71-28f4-43a7ceb5d9b3.png)
この画面から「セキュリティ」を選択して「インバウンドルール」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/38da8e88-9b6b-b515-943e-e8d32b022dd0.png)
この画面の「セキュリティグループID」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/ad93b01a-1d3c-7321-298c-c1234b0e6c97.png)
ここでタイプが「SSH」のものと「HTTP」のものを設定します。
困ったら画像の通りなったらOK。

5.設定環境準備
AWS上から行いたい人はインスタンス画面の「接続」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/36f498cd-b1c4-b7c7-f036-1e01e11683f1.png)
自分のコマンドプロンプトから実行したい人は
ssh -i <キーペアのパス> ec2-user@<パブリックIPv4DNS>でアクセスする。
選択肢が出るかもしれないが yes でOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236298/cb050363-7e95-fd73-88af-de65aa54792d.png)
こんな感じの画面が出ればどちらでやってもOK。

6.必要環境のインストール
https://zenn.dev/joo_hashi/articles/ff27ba2c0c3cb0
https://tcd-theme.com/2021/08/aws-ec2-php.html
参考にさせていただきました。

これらの記事を参考にしながら
PHP
MySQL
をEC2サーバーにインストールします。

7.MySQLパスワードの確認
https://qiita.com/miriwo/items/457d6dbf02864f3bf296
参考にさせていただきました。

EC2サーバーでMySQLをインストールするとき、パスワードが自動設定されますので、記事の手順を踏んで確認してください。
そのままパスワードを使用しても構いませんが
``` bash
sudo mysql_secure_installation
```
このコマンドで再設定も可能です。

8.データベース、テーブル作成
``` bash
mysql> CREATE DATABASE testdatabase;
mysql> CREATE TABLE userdata(
    -> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    -> name TEXT ,
    -> state INT ,
    -> text TEXT);
```

このようにしてデータベースとテーブルの作成を行いましょう。
IDのようなものはAUTO_INCREMENTにすると楽だよ。

9.PHPファイル作成
``` bash
# cd /var/www/html
# sudo touch index.php
# sudo vi index.php
```
このようなコマンドを打ち込み、必要なデータベース作成を行います。
私は前回の記事から流用したものを使用しました。
viコマンドでファイル内容を変更できますので、そこでphpファイルを編集します。
なおEC2サーバーで利用するデータベースやテーブル名は大文字小文字を識別するため、命名には気を付けましょう。

10.いざアクセス
``` C#
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class DataSender : MonoBehaviour
{
    IEnumerator Start()
    {
        string url = "http://<パブリックIPv4DNS>/add_user.php"; // PHPスクリプトのURL
        WWWForm form = new WWWForm();
        form.AddField("name", "name");
        form.AddField("state", 1);
        form.AddField("text", "text");

        UnityWebRequest request = UnityWebRequest.Post(url, form);
        yield return request.SendWebRequest();

        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.Log("Error: " + request.error);
        }
        else
        {
            Debug.Log("Response: " + request.downloadHandler.text);
        }
    }
}
```
``` C#
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class DataFetcher : MonoBehaviour
{
    IEnumerator Start()
    {
        string url = "http://<パブリックIPv4DNS>/get_user.php"; // PHPスクリプトのURL
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.Log("Error: " + request.error);
        }
        else
        {
            Debug.Log("Received: " + request.downloadHandler.text);
        }
    }
}
```
これらのようなアクセス方法を確認し、アクセスできたら終了です。
お疲れ様でした。

# その他注意点について
MySQLのパスワード設定にはある程度の制限がありますので、下記記事を参照してください。
https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273
mysqliが入っていないかもしれないので、解消するかまではわかりませんが参照した記事を一応提示しておきます。
(筆者は再度インスタンスを作成したら例外が消えました)
https://qiita.com/kajitack/items/1cc0075af808b6703691
MySQLへのアクセス権がない例外も発生しえますので下記記事で解決してみてください。
https://zenn.dev/ryo_kawamata/articles/mysql-connect-error

# おわりに
今回はクラウドでサーバーを使用したデータベースのやり取りを行いました。
なかなか詰まるところも多く休日を返上して調査を繰り返してました...
各参考にした記事の作成者様方には頭が上がりません...
また抜けが内容に記述したとは思いますが、何か抜けていたら申し訳ないです。

次はもう少し複雑な構造にしてちゃんとしたゲームに落とし込んだり、WebSocketを触ってゲーム内チャットの作成をしたりしたいなー　と思います。
また投稿するかもなので、よければまた見てください。