AzureのVMにGolangとMySQLでバックエンドサービスを作る その１

Microsoft AzureのVMにMySQLを入れて、GolangでWebAPIサーバを作りました。
大量リクエストは来ない、データベースの容量も確実に少ない、という要件だったので、一番小さいVMを使いました。

# サーバ構成
* ホストマシン：Microsoft Azure
* OS：Ubuntu 16.04
* データベース：MySQL 5.7.13
* 開発言語：Golang 1.6.2

# サーバ構築手順
Azureの画面で、Virtual Machines > 追加 > 検索ボックスに[ubuntu]と入力。
Ubuntu Server 16.04 LTS を選択。
<img width="916" alt="スクリーンショット 2016-11-29 14.40.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/19f1aa9f-7510-2e07-4acd-26edd4761c69.png">
 
ディスクはHDDを選択、認証はパスワードにしました。
<img width="647" alt="スクリーンショット 2016-11-29 14.45.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/401a040e-c41b-e430-3239-d9e9e0f73822.png">


マシンサイズは「すべて表示」をクリックして、一番小さな「A0 Basic」を選択。
<img width="579" alt="スクリーンショット 2016-11-29 14.48.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/3a833a2d-73a5-058a-ba62-cbfd7bc866f7.png">

VM作った後からでも追加できますが、ネットワークセキュリティグループにFTPとHTTPを許可する設定を追加します。
この設定を行う手順がちょくちょく変わるので、古い記事を参考にしていると迷子になります。
<img width="1047" alt="スクリーンショット 2016-11-29 14.58.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/65a29b8f-a688-3485-ee0e-f9f3dd6242fc.png">

また、IPが動的の場合は、DNSラベル名を設定すると便利です。
（SSHするときは常にDNS名で接続できる。）

VMが起動したら、SSHで接続確認。

```
ssh -l [ユーザ名] [DNS名(例 xxxxxx.japaneast.cloudapp.azure.com)]
```

実行するとパスワードを求められるので、入力してEnter。

# MySQLのインストール
以下のコマンドでインストール。

```
sudo apt-get install mysql-server
```

文字コードをutf-8にそろえるため、設定ファイルを編集。

```
sudo vi /etc/mysql/my.cnf
```

（実はvi使えないのでnanoでやった。）

```
sudo nano /etc/mysql/my.cnf
```

で、以下を追記する。

```
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB


[mysqldump]
default-character-set=utf8


[mysql]
default-character-set=utf8
```

再起動。

```
sudo /etc/init.d/mysql restart
```

接続して、UTF-8になっているか確認。

```
mysql -u root -p
```

```
status;
```

以降は、Sequel ProなどのツールでSSH接続して利用できます。
<img width="440" alt="スクリーンショット 2016-11-29 15.24.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/6399ddcc-bb0f-3191-cee2-a48342a75571.png">




# vsftpdのインストール
FTP用のユーザを作成。

```
sudo adduser ftpuser
```

インストール。

```
sudo apt-get install -y vsftpd
```

設定ファイルを修正します。

```
sudo nano /etc/vsftpd.conf
```

以下の通りに修正。

```
コメント解除( 書き込み許可 )
write_enable=YES


コメント解除( アスキーモード転送許可 )
ascii_upload_enable=YES
ascii_download_enable=YES


コメント解除( chroot 有効 )
chroot_local_user=YES


コメント解除
chroot_list_enable=YES


コメント解除
chroot_list_file=/etc/vsftpd.chroot_list


コメント解除( ディレクトリごと一括での転送有効 )
ls_recurse_enable=YES
```

chroot_list を編集(新規作成)して ftpuser を追加する。

```
sudo nano /etc/vsftpd.chroot_list
```

以下を追加します。

```
ftpuser
```

再起動。

```
sudo service vsftpd restart
```

以降は、Cyberduckなどのツールで接続して利用できます。
※SFTPで接続します。
<img width="474" alt="スクリーンショット 2016-11-30 13.18.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/36786d38-93c6-15c1-54c4-65aaffd6c3bc.png">


# Golangでの開発〜ビルド〜実行
開発は Visual Studio Code で行いました。
開発環境の構築方法は[こちら](http://dev.classmethod.jp/go/visual-studio-code-golang-debug/)の記事を参考にしました。

クロスコンパイルを可能にするため、以下のコマンドでインストール

```
brew install go --cross-compile-all
```

実際に書いたソースなどの説明は[その２](http://qiita.com/naoki_koreeda/items/50081c9f8498f4d48b0c)で行います。

実装が終わったらコンパイルします。
Ubuntu環境で実行するためのビルドコマンドは以下。

```
GOOS=linux GOARCH=amd64 go build main.go
```

ビルドしてできた実行ファイルをFTPでサーバにアップします。
（ここでは例として/usr/local/myproject/bin/にアップします。）

アップしたらSSHで接続して実行権限をつけます。

```
cd /usr/local/myproject/bin/
sudo chmod 755 main
```

実行。

```
sudo ./main &
```

停止。
（裏で起動しているため、プロセスをkillする。）

```
ps aux | grep main
sudo kill -KILL [ps番号]
```

サーバの再起動時に自動で実行するには、以下の手順を実施します。

rc.localファイルを編集。

```
sudo nano /etc/rc.local
```

ファイルを開いたら、exit 0 の前の行に以下を追加。

```
# By default ……
cd /usr/local/myproject/bin		←この行を追加
sudo ./main &					←この行を追加
exit 0
```

以上で、サーバの環境については終了です。
Golangのソースの説明のため、[その２](http://qiita.com/naoki_koreeda/items/50081c9f8498f4d48b0c)に続きます。