はじめに
こんにちは~!
今日は、Node.jsを使ってアプリケーションを作りたいと思いまして、サーバーの準備などをした話をしたいと思います。
もともと、本ブログを運用している「さくらのレンタルサーバー」で、運用しようと思ったのですが、PythonやRubyは対応している物の、JavaScriptでのサーバーには対応していないんですよね。というわけで別の方法をとることにしました。
それは、Google Cloud Platform(GCP)のCompute Engineを利用するという方法です。しかもAlways Free プログラムというものがありまして、指定した範囲内であれば無料でサーバーを建てることができるんですよね。というわけで、サーバーを準備していった話をまとめ行きたいと思います。
用語集
Google Cloud Platform
Googleが提供しているクラウドコンピューティングサービス。他の企業もクラウド用のサービスを展開しており、有名なところとして以下のようなものがあります。
企業名 | サービス名 | 開始日 |
Amazon | Amazon Web Services (AWS) | 2004年 |
Google Cloud Platform (GCP) | 2008年 | |
Microsoft | Microsoft Azure (Azure) | 2010年 |
Compute Engine
GCPのクラウドサービスは複数あり、その中の1つがCompute Engineと呼ばれるものであり2012年から提供を開始しています。Compute Engineの特徴は、コンピュータをインターネット経由でレンタルすることができるというものです。このようなサービス形態はIaaSと呼ばれています。
Always Free
Always Freeは、特定の条件下で無料で利用できるというものです。GCPのクラウドサービスは複数あるのですが、それぞれにAlways Freeが設定されている場合があります。
今回は、GCPの中でも自由にLinux等のサーバーをいじれるCompute Engineというクラウドサービスを利用するのですが、これに対しても無料枠が存在し、Always Freeの使用量上限に記載されています。
以下は2021年11月17日現在のCompute Engineの無料枠の条件を抜粋したものです。(一部更新)
種類 | 無料枠の条件 |
マシンタイプ |
|
リージョン |
|
容量 |
|
スナップショットストレージ |
|
スナップショットストレージのリージョン |
|
ネットワーク |
|
外部IPアドレス |
|
GCPで無料サーバーを建てよう
前提条件
すみません。無料と記載していますが、事前条件として、すでにダイナミックDNSに対応しているVALUE-DOMAINなど、ドメインを取得しているということを前提にお話しします。
レンタルする
Googleのアカウントの設定及び、GCPの利用をしておきましょう。
あとは、Compute Engineの利用手続きを行います。利用手続きの際は、上で説明したAlways Freeの条件に合うように設定しておきましょう。
GCPを新規で設定した場合は、1年間、300ドル分利用できる無料トライアルというサービスに入ることが出来ます。このトライアルに入っている場合は、1年間の終わりの30日前に利用しているサービスについてどうするか設定する必要があり、この設定を無視するとサービスが停止してしまうので注意してください。
今回、OSにはUbuntuを選択しています。
以下のサイトのスライド1ページ目~15ページ目までで登録方法が図を用いてわかりやすく記載されており、見ながら設定するとよいと思います。
スライドには、静的IPアドレスを利用するまで話がありますが、設定しないでください。2020年1月1日から、規約変更があり、1時間あたり0.01ドル(1か月300円ほど)かかってしまうためです。詳細は、利用規約の外部IPアドレスに記載されています。
外部からSSHを接続できるようにする
TeraTermや、WinSCPなどでSSHでログインできるように設定します。
- PuTTYgenのサイトから「
puttygen.exe
」を直接ダウンロードして起動する - 「Generate」を押して、マウスをぐりぐり動かす
- 「key_comment」に自分のユーザーIDを入力する
- 上で表示されている公開鍵のテキストをCompute Engineの「メタデータ」という箇所から登録する
- 「Save private key」で保存したファイル(
id_private_key.ppk
)を大切に保管する
詳細は以下のサイトが図を使って説明しており大変参考になります。
基本設定をしよう
今回、Ubuntuをインストールしたという前提で、便利な設定を行っておきましょう。
bashを使いやすくする
以下の記事を参考に使いやすくしていきます。
タイムゾーンを設定する
デフォルトはアメリカになっていると思うので、日本のタイムゾーンに変更します。
sudo apt-get install dbus sudo timedatectl set-timezone Asia/Tokyo
DDNSの設定をする
可変IPアドレスのためダイナミックDNSの設定を行います。
VALUE-DOMAINを利用している場合は、以下の記事を参考にしてみて下さい。流れとしては、DNSサーバー側の設定と、crontabを利用して定期的にIPアドレスを更新するように設定します。
テキストエディタをインストールする
デフォルトだと何も入っておらず、crontab -e
をやろうにもエラーが返ります。適当にnano
でも入れておきましょう。
sudo apt install -y nano
ファイアーウォールの設定をしよう
特に設定をしていないと、SSHですごい勢いでログインされます。
ログインを試みるログは以下で確認できます。多分見てると1分に1回何かがログインしようと試みるのが見えます。
tail -F /var/log/auth.log
こんな感じに。
18:24:33 sshd[13189]: Invalid user Administrator from 92.63.194.25 port 34057 18:24:34 sshd[13189]: Connection closed by invalid user Administrator 92.63.194.25 port 34057 [preauth] 18:24:44 sshd[13192]: Connection closed by authenticating user root 92.63.194.32 port 39183 [preauth] 18:24:54 sshd[13195]: Invalid user admin from 92.63.194.59 port 34697 18:24:55 sshd[13195]: Connection closed by invalid user admin 92.63.194.59 port 34697 [preauth] 18:25:05 sshd[13197]: Invalid user 1234 from 92.63.194.90 port 48132 18:25:05 sshd[13197]: Connection closed by invalid user 1234 92.63.194.90 port 48132 [preauth] 18:25:16 sshd[13199]: Invalid user guest from 92.63.194.11 port 36241 18:25:16 sshd[13199]: Connection closed by invalid user guest 92.63.194.11 port 36241 [preauth] 18:25:26 sshd[13201]: Invalid user Admin from 92.63.194.22 port 38389 18:25:26 sshd[13201]: Connection closed by invalid user Admin 92.63.194.22 port 38389 [preauth] 18:25:37 sshd[13204]: Connection closed by authenticating user root 92.63.194.25 port 36427 [preauth] 18:25:47 sshd[13219]: Invalid user admin from 92.63.194.32 port 36505 18:25:48 sshd[13219]: Connection closed by invalid user admin 92.63.194.32 port 36505 [preauth] 18:25:58 sshd[13221]: Invalid user admin from 92.63.194.59 port 36937 18:25:58 sshd[13221]: Connection closed by invalid user admin 92.63.194.59 port 36937 [preauth] 18:26:08 sshd[13223]: Invalid user user from 92.63.194.90 port 46898 18:26:08 sshd[13223]: Connection closed by invalid user user 92.63.194.90 port 46898 [preauth]
上のIPアドレスを確認すると、オーストラリアからのアクセスのようです。中国とオーストラリアからのアクセスは無料ではないため、遮断するようにファイアーウォールの設定(Googleのドキュメント)してみたいと思います。
ただファイアーウォールから設定すると時間がかかるため、gcloud
コマンドを利用します。このコマンドを利用することで、CUIで大量の設定を流し込むことが可能となります。
CGPのWebページ上でCUIによる設定が実行可能になる「Cloud Shell」を有効化します。「ここ」をクリックするか、右上の自分のアカウントの画像がある箇所の、左側に「>_」というアイコンがあるので、これをクリックすれば有効化できます。
ファイアーウォールのルールの追加には以下のコマンドを利用します。
gcloud compute firewall-rules \ create hogehoge-firewall \ --network default \ --action deny \ --rules all \ --priority 100 \ --source-ranges 0.0.0.0/0 \
コマンドを1つ1つ書くのは大変のため、コマンドを並べたファイアーウォール用の設定スクリプトを使用します。以下のファイルを展開して中のファイルをアップロードして下さい。アップロードも「Cloud Shell」から利用できます。
あとは、実行権限をchmod
で付与し、スクリプトを実行すればファイアーウォールのルールが追加されます。ルール数が多いため登録には数分かかります。
ファイアーウォールに登録されていれば成功です。
ファイアーウォールのルールについて
上で置いたルールファイルは、「Block Visitors by Country Using Firewall」で中国とオーストラリアのCIDR形式で出力したファイルを以下で置換しつつ作ったファイルです。
置換前 (^[^\n]+$)\n(^[^\n]+$)\n 置換後 $1,$2\n
1ルール当たり最大256個のIPアドレスを設定できます。超えると以下のようなエラーが出ます。
Creating firewall...failed. ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource: - Value for field 'resource.sourceRanges' is too large: maximum size 256 element(s); actual xxx.
また、ルールは最大100個まで登録できます。超えると以下のようなエラーが出ます。
Creating firewall...failed. ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource: - Quota 'FIREWALLS' exceeded. Limit: 100.0 globally.
参考までに、2020年3月末時点で各国の禁止IPリスト数は以下のようになっています。ルールの数が上限に達しないように注意しましょう。
CIDR記法の数 | denyする際に必要なルール数 | |
中国 | 6606個 | 26ルール |
オーストラリア | 12639個 | 50ルール |
Cloud Shell
Cloud Shellというのは、Googleが用意したクラウドで動作するOSです。Debian上でGoogle向けのコマンドを実行することが可能です。ホームディレクトリにはなんと無料で5GBまでファイルを置くことが可能です。
参考
- gza.jp – GCPでfirewall-rules作成し国単位で接続拒否を行う
- ハルパス – 国別のIPアドレス一覧を出力「Block Visitors by Country」
- Block Visitors by Country Using Firewall
アプリケーションを動かすための準備をしよう
HTTPサーバーとSSL設定を行う
以下のサイトを参考に、nginxとSSLの設定と行います。
まず、nginxをインストールします。
sudo apt -y install nginx sudo service nginx start sudo service nginx stop
※後のcertbotの設定のために念のため一旦起動して、停止しておきます。(いるかどうか未確認)
cerbotは次のようにインストールして設定します。
sudo apt -y install git git clone https://github.com/certbot/certbot cd ./certbot/ sudo ./certbot-auto certonly --standalone -d hoge.natade.net -m moge@gmail.com --agree-tos -n
以下を実行して自分のサイトのファイルが出来ていたら成功です。
sudo ls /etc/letsencrypt/archive/ -l
/etc/nginx/sites-available/default
を編集すると紹介の記事にありましたが、自動的にCertbotによって編集されたようで特に何もせずに、HTTPSに対応できていました。
以下でWebサーバーが起動させましょう。
sudo service nginx start
最後に、定期的に証明書を更新するようにcrontabを利用して設定しておきましょう。
sudo service nginx stop sudo ~/certbot/certbot-auto renew sudo service nginx start
注意点としては、Webサーバーの停止中にcertbot-auto renew
を実行する必要があります。Webサーバーを停止せずに実行すると、以下のようにエラーが発生します。
$ sudo ~/certbot/certbot-auto renew /home/*/certbot/certbot-auto has insecure permissions! To learn how to fix them, visit https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979/ Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/hoge.natade.net.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert is due for renewal, auto-renewing... Plugins selected: Authenticator standalone, Installer None Renewing an existing certificate Performing the following challenges: http-01 challenge for hoge.natade.net Cleaning up challenges Attempting to renew cert (hoge.natade.net) from /etc/letsencrypt/renewal/hoge.natade.net.conf produced an unexpected error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping. All renewal attempts failed. The following certs could not be renewed: /etc/letsencrypt/live/hoge.natade.net/fullchain.pem (failure) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - All renewal attempts failed. The following certs could not be renewed: /etc/letsencrypt/live/hoge.natade.net/fullchain.pem (failure) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 renew failure(s), 0 parse failure(s)
Node.jsの最新版をインストールする
sudo apt install -y nodejs npm sudo npm install n -g sudo n stable sudo apt purge -y nodejs npm
あとは、nginxと連携するように設定していきます。
トラブルシューティング
費用が発生してしまった
- GCPの左枠の「お支払い」を押す
- 左枠の「価格表」を押す
- プロジェクト名の左の□のチェックボックスをオンにする
すると、SKU列に費用の発生原因が分かるようになる。
上記だと「Micro Instance with burstable CPU running in Americas」というのが原因なので、この文字列でググると原因がわかったりする。
おわりに
お疲れ様です。
とりあえずできたところまでを記事に書いてみました。今後アプリケーション開発を行う予定なので、また調べたことがあったら追記していきたいと思います。
コメント