Google Cloud Platform(GCP) 無料枠を活用したサーバ構築
概要
きっかけ
個人プロダクトを作って公開してみようと思い立ちましたが,
AWSの無料枠はとっくに期限が切れていたので,
この機会にAWS以外のクラウドサービスも使ってみることにしました
今回の記事で扱う範囲
- Compute Engine インスタンス作成
- nginxによるWebサーバ構築
今回の記事で扱わない範囲
- Webアプリケーション構築
- DB構築
GCP無料枠について
Compute EngineやBig Query,ワークフローなどのサービスには無料枠があり,
1ヶ月ごとに定められたリクエスト回数・稼働時間の範囲で無料でサービスを利用できます.
サーバ構築手順
以下の手順で進めていきます.
- (事前準備)アカウント作成
- (事前準備)予算アラートの設定
- インスタンスの作成
- セキュリティ設定
- SSHのポート変更
- サーバ設定
- タイムゾーンをAsia/Tokyoに変更
- 言語を日本語に変更
- 画面アクセス
- nginxのインストール
- nginxの設定変更
(事前準備)アカウント作成
- Googleアカウントにログインした状態で,
Google Cloudトップから「無料で開始」をクリック
- 自動でログインページに遷移
アカウント作成はこれで完了です.
(事前準備)予算アラートの設定
設定ミスや漏れによって想定外の請求が来ると大変なので,
一定の金額に達すると通知が飛ぶようにします.
※今回は無料枠を活用することもあり,予算額を100円にしました.
- 「お支払い」メニューの『予算とアラート』に遷移し,アラート名と予算額を入力
- 設定を保存後,入力したアラート名と予算額が一覧に表示されることを確認
インスタンスの作成
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番に変更します.
- 「ファイアウォール ポリシー」から『ファイアウォールルールを作成』を選択
- 22番ポートへのアクセスを禁止するファイアウォールルールを作成
- 10022ポートへのアクセスを許可するファイアウォールルールを作成
- サーバ設定で待ち受けポート番号を10022番に変更
< Port 10022
---
> #Port 22
$ sudo systectl restart sshd
- ファイアウォールルールをインスタンスに適用
インスタンスに適用後,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で出力されています.
複数のログをまたいだ場合でも時系列を追いやすくするため,コンソールからインスタンスの再起動を行います.
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.
Oct 13 09:46:17 debian sudo: pam_unix(sudo:session): session closed for user root
インスタンスを再起動したあとは無事にJSTでログが出力されていました.
Oct 13 18:58:26 debian systemd[877]: Startup finished in 58ms.
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
2023年 10月 13日 金曜日 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
どのバージョンを使っているか? という情報は攻撃者にとってヒントになりうるので,
設定を変更してレスポンスに出力されないようにします.
変更手順
-
server_tokens off
を有効にする
http {
(略)
server_tokens off; # コメントインする
- 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
- 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