Golang on さくらVPS


株式会社アクシスのアドベントカレンダー5日目担当のヤマウチです!
さくらVPSを契約して遊んでみたので、それを記事にしました!

ということでさっそく本題。


先日作成した記事「【Go】標準入力から受け取ったポケモンの種族値を返すツールを作成」のAPI部分をさくらVPSに乗せました。

いつでもどこからでもAPIを叩きたい衝動に駆られて、VPS契約しました。
固定IP最高\(^o^)/
まあ、一番安いプランですが。

ということで、今回はさくらVPSにOSをインストールした直後から、GoのAPIを叩ける状態にする、という部分の記事です。

前提条件

  • centos8
  • rootユーザーにSSH接続ができる
  • xxx.xxx.xxx.xxx はIPアドレスを意味する
  • wsl2

さて、始めます。

ユーザー作成

VPSにSSH接続を行い、keisukeという一般ユーザーを作成する。

# ユーザー作成
$ adduser keisuke

# パスワード設定
$ passwd keisuke

sudo権限を付与

作成したユーザーにsudo権限を付与する。

$ visudo

以下の2行のコメントアウトを外す。

  • %wheel ALL=(ALL) ALL
  • %wheel ALL=(ALL) NOPASSWD: ALL

ユーザーをwheelグループに追加する。

$ usermod -aG wheel keisuke

wheelに追加されたか確認する。

# 作成したユーザーにログイン
$ su keisuke

# 所属しているグループを確認
$ groups
# wheelと表示されればOK

もしwheelと表示されない場合は、ターミナルを再起動して、再度groupsを実行。

ユーザーでSSH接続

続いて作成したユーザーでSSH接続できるようにする。
(必要あるかわかんないけど)一般ユーザーに切り替える。

$ su keisuke

.sshを作成

ユーザーを作成したばかりで.sshディレクトリが存在しないので、作成する。

# ホームディレクトリに移動
$ cd ~

# .sshを作成
$ mkdir .ssh

# パーミッションを700に変更
$ chmod 700 .ssh

SSHするためには.sshディレクトリのパーミッションを700にする必要がある。

公開鍵を登録する

一旦exitでSSH接続から抜け、scpを使って公開鍵をVPSにコピーする。
※事前に各自、公開鍵を置いているディレクトリに移動

$ scp id_rsa.pub xxx.xxx.xxx.xxx:~/.ssh

scpで公開鍵をコピーしたらSSH接続をする。

# 作成したkeisukeでSSH接続
$ ssh [email protected]

# .sshに移動
$ cd .ssh

# id_rsa.pubがあるか確認
$ ls

# 公開鍵を登録
$ cat id_rsa.pub >> authorized_keys

# パーミッションを変更
$ chmod 600 authorized_keys

公開鍵の登録が完了したら、一度exitでSSHから抜け、再度SSH接続をする。
その際にパスワードを求められなければ、公開鍵でのSSH接続が成功している。

SSH接続の設定を変更する

設定ファイルをいじるので、rootユーザーでログインする。

$ su -

SSH接続のパスワード認証を禁止

/etc/ssh/sshd_configを編集する。

#PasswordAuthentication yes
↓
PasswordAuthentication no

rootユーザーでのSSH接続を禁止

引き続き/etc/ssh/sshd_configを編集する。

PermitRootLogin yes
↓
PermitRootLogin no

sshdを再起動

設定ファイルを反映させるため、sshdを再起動する。

$ systemctl restart sshd

GoのバイナリファイルをSCP

ここまでで基本的な設定は完了したので、次にGoのバイナリファイルをさくらVPSに置く。
まずはローカルのプロジェクト配下に移動する。

$ cd project

バイナリファイルを作成

まずはgo buildを行い、バイナリファイルを作成する。
普通にgo buildをすると自分の開発環境にあったバイナリファイルが作成されるため、実行環境に合わせたバイナリファイルを生成する必要がある。
今回の僕のパターンだと、windows端末で開発をして、実行する環境はさくらVPSのCentOSなので、CentOSで動くバイナリファイルを生成する。
とはいえ、WSL2を使用しているので今回は気にしなくて良さげ。

一応現状を確認

$ go env GOOS
# linux

$ go env GOARCH
# amd64

うむ、そのままbuildする。

$ go build main.go

# mainというファイルが生成されていることを確認する
$ ls

scpでファイルをサーバーにコピー

どこに置くのが正解かわかってないので、とりあえず今回はユーザーのディレクトリにコピーする。

# vpsはssh_configで設定している
$ scp main vps:~

# これも必要なのでscp
$ scp pokedex.json vps:~

バイナリファイルを実行する

ファイルのコピーが完了したので、実行する。
まずはSSH接続。

$ ssh vps

mainがコピーされていることを確認する。

$ ls

確認ができたらmainを実行する。

$ ./main&

実行状態をlsofコマンドで確認する。
今回のアプリがLISTENしているのは18888なので、そのポートを確認する。
※lsofのインストール手順等は省略

# ポート18888をLISTENしていることを確認する
$ lsof -i:18888

# こんな表示が出る
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
main    22373 keisuke    3u  IPv6 135702      0t0  TCP *:apc-necmp (LISTEN)

問題なさそう。
ということでxxx.xxx.xxx.xxx:18888にアクセスしてみる。

このサイトにアクセスできません

ここがハマりポイント。

今回書いてはいないがfirewallの設定もしており、そこに原因があると思って一生懸命調べていたが、
原因はさくらVPSのパケットフィルタの設定だった。。。

ということでさくらVPSのコンソールへGO!
パケットフィルタの設定を追加する。


これ↑をこう↓

これで再度APIを叩いてみる。
xxx.xxx.xxx.xxx:18888にアクセス。

よし、返ってきてる。

まとめ

ということで無事さくらVPSにGoのバイナリファイルを置いて、APIを叩くことができました。
バイナリファイルを置くだけでAPIを叩けるってのがすごい。
nginxとか、webサーバーがなくてもいいってのが、その辺の知識が弱いせいで「マジかよ」ってなってます。

firewallの設定を間違ったせいでSSH接続が一切できなくなるというのも経験しました。。。w
それを自分のVPSで経験できただけでも、良かったかなぁって感じです。
github actionsを使用して、自動デプロイもできるようにしたので、気が向けば記事にしますw

おしまい。