【2】GCP(GCE)で無料のVMインスタンスを作る(Always Free無料枠、外部IPアドレス取得、SSH接続、22番ポート対応)
これはHerokuからGCP無料枠にRailsアプリを引越ししたときにやったことシリーズの【1】の続きです。
GCE に VM インスタンスを作成するところのメモです。
1. 公式サイト
- GCP の無料枠 - 無料の長期トライアル、Always Free | Google Cloud
- よくある質問 | Google Cloud Platform の無料枠 | Google Cloud
- イメージ | Compute Engine ドキュメント | Google Cloud
- インスタンスへの接続 | Compute Engine ドキュメント | Google Cloud
2. 目標
3. 注意点
- 無料枠を活用しているといっても完全に無料ではありません。ネットワーク流量や SSH ポートに攻撃されることでも課金されます。
- この先インスタンスを停止・削除した場合、静的 IP を使用していると課金されるので必ず開放しておくのを忘れないようにしましょう。
- アカウントを有料アカウントにアップグレードしたあと、Google から$0 ~ 1 のトランザクションが発生する場合があります。
- 無料条件は公式サイトの
Always Free
を見ておくとよいです。https://cloud.google.com/free/docs/gcp-free-tier?hl=ja
4. 参考サイト様
本当に参考になりました。ありがとうございます!
5. 作業手順
5.1. 事前準備
参考サイト様の記事を参考に設定していきます。ここでは割愛させていただきます。
- GCP にアクセスする
https://cloud.google.com/ - GCP でアカウントを作成
- プロジェクトを作成
アップグレードした請求先アカウント
を登録する
https://cloud.google.com/free/docs/frequently-asked-questions#how-to-upgrade- 課金アラートを設定しておく
5.2. VM インスタンスを作成する
Compute Engine を左側のペインからクリックし、VM インスタンスをクリックします。
課金を有効にします。
「アカウントを設定」をクリックします。
課金情報とプロジェクトを結びつけると GCE が使えるようになります。
VM インスタンスを作成します。
5.3. ディスクの設定をする
次の項目を設定します。間違えると課金対象になってしまうので慎重にやります。
作業項目 | 内容 |
---|---|
名前 | インスタンスの名前を入力する |
リージョンとゾーン | us-west1 , us-central1 , us-east1 の中から選択する |
マシンタイプ | micro (共有 vCPU x 1 メモリ 0.6 GB f1-micro)を選択する |
ディスクサイズ | 10GB となっているので 30GB に変更する |
ブートディスクの種類 | 標準 の永続ディスクを選択する |
OS イメージの選択 | どれか OS を選択する |
ファイアウォールルール | HTTP, HTTPSトラフィックを許可する の両方にチェックを入れる |
ネットワーキング | 外部 IP のIPアドレスを作成 →新しい静的IPアドレスの予約 の画面で名前を入力して予約 ボタンをクリックする |
5.3.1. リージョンとゾーン
無料対象のリージョンは次の3つです。米国でもこれ以外は有料になります。
5.3.2. OS イメージ
公式サイトを参考に選択します。
イメージ | Compute Engine ドキュメント | Google Cloud
私は OS はデフォルトの Debian 9 stretch にしました。
今のところ特に困ったことは起きていません。
Docker をガッツリ使うのに適したContainer-Optimized OS なども用意されています。
しかし実は一度 OOM で Docker のビルドが失敗した時に swap 領域を設定して事なきを得たのですが、Container-Optimized OS ではやり方がわからなかったので避けときました。私がわかっていないだけかもしれませんが。
docker - How to enable Google Container Optimized OS swap limit support - Stack Overflow
5.3.3. ファイアウォールルール
HTTP, HTTPS トラフィックを許可するの両方にチェックを入れます。
80 番と 443 番のポートが開きます。
SSL の設定のところで 80 番と 443 番が公開されている必要があります。
5.3.4. 静的 IP アドレスの予約
ネットワーキング
というタブをクリックしてネットワークインターフェース
の外部IP
のドロップダウンメニューの中からIPアドレスを作成
を選択します。
新しい静的IPアドレスの予約
の画面で名前
を入力して予約
ボタンをクリックします。
グローバル IP アドレスが取得できます。
入力を終えたら作成
ボタンを押します。
インスタンスが作成されます。
外部 IP のところに取得した固定 IP アドレスが表示されます。
これを使って SSH 接続したり、DNS サーバーの設定をしたりします。
注意点として、VM インスタンスが起動していないと外部 IP アドレスが課金されてしまいます。
使っていない IP アドレスは開放するようにしましょう。
ネットワーキング
→外部IPアドレス
→ アドレスを選択 →静的アドレスを開放
をクリックで開放出来ます。
6. SSH 接続できるようにする
仮想マシンインスタンス作成後、インスタンスに接続する方法は次のようになります。
- Google Cloud Platform Console からブラウザで接続する
- gcloud コマンドライン ツールを使用して接続する
- 公開 SSH 認証鍵をインスタンスに渡して SSH コマンドで接続する
ここでは主に 3 番目の公開 SSH 認証鍵をインスタンスに渡して SSH コマンドで接続する方法について書いてみたいと思います。
1 番目と 2 番めも軽く触れますと、
ブラウザからインスタンスを表示して、接続 SSH
と書いてあるところをクリックするとブラウザウィンドウで開く
とあるのでクリックするとターミナルが起動します。
簡単に接続できました。
2 番めの gcloud コマンドライン ツールを使用する場合は Cloud SDK をインストールして使用します。
詳しくは公式サイトをご覧ください。
それでは、公開 SSH 認証鍵をインスタンスに渡してSSHコマンドで接続する方法について書いてみたいと思います。
なお接続の際にIPアドレスを指定するので、外部IPアドレスを取得している必要があります。
6.1. SSH 認証鍵を新規作成する
Linux / MacOS でコマンドを説明させていただきます。Windows をお使いの方は別途検索等で調べてください。
ssh-keygen コマンドを使用して新しい認証鍵を生成します。ユーザー名をコメントに追加するには、-C フラグを指定します。
$ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]
秘密鍵へのアクセスを制限し、鍵の管理者だけが読み取れ、他の誰も書き込めないようにします。
$chmod 400 ~/.ssh/[KEY_FILENAME]
公開認証鍵を表示します
$cat ~/.ssh/[KEY_FILENAME].pub
6.2. SSH 公開鍵を登録する
メニューからCompute Engine
→メタデータ
を選択します。
SSH認証鍵
のタブを開いて認証鍵全体を入力という欄の中に先程表示した公開認証鍵の内容をコピペします。
保存後次のようなコマンドで SSH 接続できるようになります。
$ssh [外部IPアドレス] -i ~/.ssh/[KEY_FILENAME]
7. 22 番ポートを閉じて他のポートを開ける
参考サイト様によると、SSH ポートに攻撃されることで数円課金が発生するようです。
これを防ぎたいので参考サイト様の手順に従って 22 番ポートを閉じて他のポートを開けることにします。
7.1. ファイアウォールルールの作成(新ポート)
ナビゲーションメニューから「ネットワーク詳細の表示」を選択します。
「ファイアウォールルール」→「ファイアウォールルールを作成」をクリックします。
次の項目を設定します。
開けるポート番号は任意の数字です。
入力項目 | 内容 |
---|---|
名前 | デフォルトのルールにならって、 allow-XXXX (XXXX はポート番号)にするとよい |
ターゲットタグ | デフォルトのルールにならって、 allowXXXX-server (XXXX はポート番号)にするとよい |
ソース IP の範囲 | 0.0.0.0/0 |
プロトコルとポート | 指定したプロトコルとポートをクリックし tcp のところにポート番号を入力する |
入力し終えたら「保存」を押して追加されたのを確認します。 ここで入力したターゲットタグをインスタンスのネットワークタグに追加します。
「VM インスタンスの詳細」→「編集」画面でターゲットタグを追加します。
7.2. sshd_config のポート番号の設定を変更する
以下のコマンドを実行し、設定ファイルをバックアップする
$cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
エディタを起動して設定ファイルを書き換える
$sudo vi /etc/ssh/sshd_config
#Port 22
となっているので
Port 40022
のように、先程開けたポート番号に書き換えます。
保存したら SSH を再起動します。
$sudo service ssh restart
今までデフォルトの 22 番で接続していましたが、新しく開けたポート番号で接続するようになります。
$ssh [外部IPアドレス] -i ~/.ssh/[KEY_FILENAME] -p [ポート番号]
gcloud コマンドでログインする時も-p [ポート番号]
を付けることになります。
ブラウザからログインする時は「ブラウザウィンドウでカスタムポートを開く」を選択してポート番号を入力する必要があります。
ログイン出来たら 22 番のポートを閉じる作業に入ります。
7.3. ファイアウォールルールの作成(22 番ポート)
先程と同じく「ファイアウォールルールを作成」を開きます。
次の項目を設定します。
入力項目 | 内容 |
---|---|
名前 | デフォルトのルールにならって、 disallow-22 にするとよい |
一致した時のアクション | 拒否 |
ターゲットタグ | デフォルトのルールにならって、 disallow22-server にするとよい |
ソース IP の範囲 | 0.0.0.0/0 |
プロトコルとポート | 指定したプロトコルとポートをクリックし tcp のところに 22 を入力する |
入力し終えたら「保存」を押して追加されたのを確認します。
ここで入力したターゲットタグをインスタンスのネットワークタグに追加します。
「VM インスタンスの詳細」→「編集」画面で先程作成した 22 番ポートを閉じるためのターゲットタグを追加します。
22 番でアクセス出来なくなったと思います。
これで今回の記録は終わりです。
次回は作成したインスタンスにスワップ領域追加、タイムゾーン設定を行い、DockerとDocker Composeをインストールします。
8. 関連リンク
- 【1】HerokuからGCP無料枠にRailsアプリを引越ししたときにやったこと(GCE+Docker+Rails+Puma+PostgreSQL+Nginx+Let's Encrypt)
- 【2】GCP(GCE)で無料のVMインスタンスを作る(Always Free無料枠、外部IPアドレス取得、SSH接続、22番ポート対応)
- 【3】GCEのVMインスタンスにDockerとDocker Composeをインストールする。他設定(スワップ領域追加、タイムゾーン設定)
- 【4】GCP(GCE)のVMインスタンスにファイルを転送する(Cyberduck, scpコマンド)
- 【5】GCP(GCE)でRailsアプリを外部IPアドレス+3000番ポートで動かしてみる(環境変数COMPOSE_FILE、GCE+Docker+Rails+Puma+PostgreSQL)
- 【6】DNSテスト用に無料の独自ドメインを取得してGoogle Cloud DNSでネームサーバの設定をする(GCE,freenom,http+独自ドメイン+ポート3000でアクセスする)
- 【7】SteveLTN/HTTPS-PORTALを使ってLet's Encryptで全自動SSL対応を行う(GCP(GCE),Rails,Nginxリバースプロキシ,Docker)