🛠️

Google Cloud Platform(GCP) 無料枠を活用したサーバ構築

2023/10/16に公開

概要

きっかけ

個人プロダクトを作って公開してみようと思い立ちましたが,
AWSの無料枠はとっくに期限が切れていたので,
この機会にAWS以外のクラウドサービスも使ってみることにしました

今回の記事で扱う範囲

  • Compute Engine インスタンス作成
  • nginxによるWebサーバ構築

今回の記事で扱わない範囲

  • Webアプリケーション構築
  • DB構築

GCP無料枠について

Compute EngineやBig Query,ワークフローなどのサービスには無料枠があり,
1ヶ月ごとに定められたリクエスト回数・稼働時間の範囲で無料でサービスを利用できます.

サーバ構築手順

以下の手順で進めていきます.

  1. (事前準備)アカウント作成
  2. (事前準備)予算アラートの設定
  3. インスタンスの作成
  4. セキュリティ設定
    1. SSHのポート変更
  5. サーバ設定
    1. タイムゾーンをAsia/Tokyoに変更
    2. 言語を日本語に変更
  6. 画面アクセス
    1. nginxのインストール
    2. nginxの設定変更

(事前準備)アカウント作成

  1. Googleアカウントにログインした状態で,
    Google Cloudトップから「無料で開始」をクリック
  2. 自動でログインページに遷移

    アカウント作成はこれで完了です.

(事前準備)予算アラートの設定

設定ミスや漏れによって想定外の請求が来ると大変なので,
一定の金額に達すると通知が飛ぶようにします.
※今回は無料枠を活用することもあり,予算額を100円にしました.

  1. 「お支払い」メニューの『予算とアラート』に遷移し,アラート名と予算額を入力
  2. 設定を保存後,入力したアラート名と予算額が一覧に表示されることを確認

インスタンスの作成

Compute Engineを利用してVMインスタンスを作成します.
「Compute Engine」の『VMインスタンス』タブから作成可能です.


今回はブートディスクにDebian 11を指定しました.

(補足)設定時のコマンド

サイドメニューにはCLIコマンドやTerraformのコードを起こしてくれているので,
同様の環境を再度構築したい場合に活用できます.

gcloud compute instances create zenn --project=XXXXXXXX --zone=us-west1-b --machine-type=e2-micro --network-interface=network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=default \  
--metadata=block-project-ssh-keys=true,ssh-keys=hogefugapiyo --maintenance-policy=MIGRATE --provisioning-model=STANDARD --service-account=xxxxxxxxxxxx-compute@developer.gserviceaccount.com \ 
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \  
--tags=http-server,https-server --create-disk=auto-delete=yes,boot=yes,device-name=zenn,image=projects/debian-cloud/global/images/debian-11-bullseye-v20231010,mode=rw,size=30,type=projects/XXXXXXXX/zones/us-west1-b/diskTypes/pd-standard \  
--shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring --labels=goog-ec-src=vm_add-gcloud --reservation-affinity=any --key-revocation-action-type=stop

セキュリティ設定

VMインスタンスが無事に立ち上がったので,次にサーバへのアクセス制限をかけます.

SSHのポート変更

デフォルトの22番ポートはよく狙われているようなので,10022番に変更します.

  1. 「ファイアウォール ポリシー」から『ファイアウォールルールを作成』を選択
  2. 22番ポートへのアクセスを禁止するファイアウォールルールを作成
  3. 10022ポートへのアクセスを許可するファイアウォールルールを作成
  4. サーバ設定で待ち受けポート番号を10022番に変更
/etc/ssh/sshd_config
< Port 10022
---
> #Port 22
$ sudo systectl restart sshd
  1. ファイアウォールルールをインスタンスに適用

    インスタンスに適用後,10022番ポートでのSSHが可能になります.

サーバ設定

他の設定も変更していきます.
ネットの記事を調べてみると色々なやり方がでてきますが,
今回は*ctl系のコマンドを利用します.

タイムゾーンをAsia/Tokyoに変更

インスタンス起動時点のタイムゾーン設定をtimedatectlコマンドで確認します.

$ sudo timedatectl
               Local time: Fri 2023-10-13 09:10:23 UTC
           Universal time: Fri 2023-10-13 09:10:23 UTC
                 RTC time: Fri 2023-10-13 09:10:24
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

LocalのタイムゾーンがUTCになっているため,下記コマンドでAsia/Tokyoに変更します

sudo timedatectl set-timezone Asia/Tokyo

もう一度確認すると,LocalのタイムゾーンがAsia/Tokyoに変わっています.

$ sudo timedatectl
               Local time: Fri 2023-10-13 18:10:36 JST
           Universal time: Fri 2023-10-13 09:10:36 UTC
                 RTC time: Fri 2023-10-13 09:10:37
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

ただし,この時点ではサーバの一部ログはまだUTCで出力されています.
複数のログをまたいだ場合でも時系列を追いやすくするため,コンソールからインスタンスの再起動を行います.

/var/log/syslog
Oct 13 09:39:44 debian systemd[1]: gce-workload-cert-refresh.service: Succeeded.
Oct 13 09:39:44 debian systemd[1]: Finished GCE Workload Certificate refresh.
/var/log/auth.log
Oct 13 09:46:17 debian sudo: pam_unix(sudo:session): session closed for user root

インスタンスを再起動したあとは無事にJSTでログが出力されていました.

/var/log/syslog
Oct 13 18:58:26 debian systemd[877]: Startup finished in 58ms.
/var/log/auth.log
Oct 13 18:57:13 debian sshd[863]: Server listening on 0.0.0.0 port 10022.

言語を日本語に変更

$ sudo apt-get install locales locales-all
$ sudo localectl set-locale ja_JP.UTF-8
$ localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: n/a
      X11 Layout: n/a
$ date
20231013日 金曜日 19:28:38 JST

画面アクセス

nginxのインストール

apt-getでnginxをインストールする.

$ sudo apt-get install -y nginx

サービスの稼働状況を確認すると,すでにactiveになっていました.

$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-16 14:08:40 JST; 28s ago
       Docs: man:nginx(8)
    Process: 23245 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 23246 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 23436 (nginx)
      Tasks: 3 (limit: 1145)
     Memory: 5.2M
        CPU: 22ms
     CGroup: /system.slice/nginx.service
             ├─23436 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─23438 nginx: worker process
             └─23439 nginx: worker process

Oct 16 14:08:40 zenn systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 16 14:08:40 zenn systemd[1]: Started A high performance web server and a reverse proxy server.

インスタンス作成時に割り当てたIPアドレスにブラウザからアクセスすると,
nginxのデフォルト画面が表示されました.

やった!

nginxの設定変更

ところで,nginxをインストールした直後の設定では,レスポンスにバージョンの情報まで出力されてしまいます.

Server: nginx/1.18.0

どのバージョンを使っているか? という情報は攻撃者にとってヒントになりうるので,
設定を変更してレスポンスに出力されないようにします.

変更手順

  1. server_tokens offを有効にする
/etc/nginx/nginx.conf
http {
         (略)
        server_tokens off; # コメントインする
  1. nginxの構文チェック
    実行結果がsyntax is okとなっていれば次の手順に進んで問題ありません.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  1. nginxをリロード
    構文チェックに問題がなかったので,更新したconfファイルの設定をnginxに読み込ませます.
$ sudo systemctl reload nginx
$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-16 14:09:20 JST; 38min ago
       Docs: man:nginx(8)
    Process: 23699 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 23701 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 25344 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
   Main PID: 23702 (nginx)
      Tasks: 3 (limit: 1145)
     Memory: 5.1M
        CPU: 50ms
     CGroup: /system.slice/nginx.service
             ├─23702 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─25345 nginx: worker process
             └─25346 nginx: worker process

Oct 16 14:09:19 zenn systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 16 14:09:20 zenn systemd[1]: Started A high performance web server and a reverse proxy server.
Oct 16 14:48:04 zenn systemd[1]: Reloading A high performance web server and a reverse proxy server.
Oct 16 14:48:04 zenn systemd[1]: Reloaded A high performance web server and a reverse proxy server.

リロード後のステータスもactiveになっているので問題なさそうです.
再度デフォルト画面にアクセスします.

実行結果

変更前のレスポンス

変更後のレスポンス
Server: nginxとなり,バージョン情報の記載がなくなりました.

長くなりそうなので今回はここまで.

今回のまとめ

  • GCPの無料枠を活用して,VMインスタンスを立ち上げました.
  • サーバにnginxをインストールし,ブラウザからアクセスして画面が表示されることを確認しました.
  • セキュリティ向上のためnginxのバージョン情報を非表示にしました.

さいごに

  • (今のところは)ずっと無料で使える枠があるので,お試し環境を用意したい時にも重宝しますね.
  • アプリケーションをデプロイするための下準備もやることが多くて大変です.インフラ部隊に感謝です.
  • UIはどんどん変わっていくと思うのでCLIも使っていきたいですね.

参考リンク

Qiita: GCPで永久無料枠を利用してサービスを立ち上げたときにしたことの備忘録
->こちらの内容を大いに参考にさせていただきました
Publickey: 期限の制約なく無料で使えるクラウド「Free Tier」主要サービスまとめ。2023年版

Discussion