Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

【2】GCP(GCE)で無料のVMインスタンスを作る(Always Free無料枠、外部IPアドレス取得、SSH接続、22番ポート対応)

これはHerokuからGCP無料枠にRailsアプリを引越ししたときにやったことシリーズの【1】の続きです。
GCE に VM インスタンスを作成するところのメモです。

1. 公式サイト

2. 目標

  • Google Compute Engine に無料のインスタンスを作成する
  • 外部に公開する静的 IP アドレスを取得する
  • SSH 接続できるようにする
  • 22 番ポートを閉じて他のポートを開ける

3. 注意点

  • 無料枠を活用しているといっても完全に無料ではありません。ネットワーク流量や SSH ポートに攻撃されることでも課金されます。
  • この先インスタンスを停止・削除した場合、静的 IP を使用していると課金されるので必ず開放しておくのを忘れないようにしましょう。
  • アカウントを有料アカウントにアップグレードしたあと、Google から$0 ~ 1 のトランザクションが発生する場合があります。
  • 無料条件は公式サイトのAlways Freeを見ておくとよいです。https://cloud.google.com/free/docs/gcp-free-tier?hl=ja

4. 参考サイト様

本当に参考になりました。ありがとうございます!

5. 作業手順

  • 事前準備の内容を済ます
  • VM インスタンスを作成する
  • ディスクの設定をする
  • 22 番ポートを閉じて他のポートを開ける
  • SSH 接続できることを確認する
  • その他の設定を行う

5.1. 事前準備

参考サイト様の記事を参考に設定していきます。ここでは割愛させていただきます。

  1. GCP にアクセスする
    https://cloud.google.com/
  2. GCP でアカウントを作成
  3. プロジェクトを作成
  4. アップグレードした請求先アカウントを登録する
    https://cloud.google.com/free/docs/frequently-asked-questions#how-to-upgrade
  5. 課金アラートを設定しておく

5.2. VM インスタンスを作成する

Compute Engine を左側のペインからクリックし、VM インスタンスをクリックします。

f:id:sakura_bird1:20190303160747p:plain:w400

課金を有効にします。

f:id:sakura_bird1:20190303160901p:plain:w400

「アカウントを設定」をクリックします。

f:id:sakura_bird1:20190303161156p:plain:w400

課金情報とプロジェクトを結びつけると GCE が使えるようになります。
VM インスタンスを作成します。

f:id:sakura_bird1:20190303161331p:plain:w400

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アドレスの予約の画面で名前を入力して予約ボタンをクリックする

自分のインスタンスを作ったときのスクリーンショットです。
f:id:sakura_bird1:20190303184819p:plain:w500

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. ファイアウォールルール

f:id:sakura_bird1:20190303185016p:plain:w400

HTTP, HTTPS トラフィックを許可するの両方にチェックを入れます。
80 番と 443 番のポートが開きます。
SSL の設定のところで 80 番と 443 番が公開されている必要があります。

5.3.4. 静的 IP アドレスの予約

f:id:sakura_bird1:20190303185751p:plain:w400

ネットワーキングというタブをクリックしてネットワークインターフェース外部IP
のドロップダウンメニューの中からIPアドレスを作成を選択します。

f:id:sakura_bird1:20190303185859p:plain:w400

新しい静的IPアドレスの予約の画面で名前を入力して予約ボタンをクリックします。
グローバル IP アドレスが取得できます。

入力を終えたら作成ボタンを押します。
インスタンスが作成されます。

f:id:sakura_bird1:20190303190851p:plain:w400

外部 IP のところに取得した固定 IP アドレスが表示されます。
これを使って SSH 接続したり、DNS サーバーの設定をしたりします。
注意点として、VM インスタンスが起動していないと外部 IP アドレスが課金されてしまいます
使っていない IP アドレスは開放するようにしましょう。
ネットワーキング外部IPアドレス→ アドレスを選択 →静的アドレスを開放をクリックで開放出来ます。


6. SSH 接続できるようにする

仮想マシンインスタンス作成後、インスタンスに接続する方法は次のようになります。

ここでは主に 3 番目の公開 SSH 認証鍵をインスタンスに渡して SSH コマンドで接続する方法について書いてみたいと思います。
1 番目と 2 番めも軽く触れますと、

ブラウザからインスタンスを表示して、接続 SSHと書いてあるところをクリックするとブラウザウィンドウで開くとあるのでクリックするとターミナルが起動します。
簡単に接続できました。

f:id:sakura_bird1:20190303233114p:plain:w400

f:id:sakura_bird1:20190303233232p:plain:w400

2 番めの gcloud コマンドライン ツールを使用する場合は Cloud SDK をインストールして使用します。
詳しくは公式サイトをご覧ください。

gcloud compute  |  Compute Engine ドキュメント  |  Google Cloud


それでは、公開 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メタデータを選択します。

f:id:sakura_bird1:20190304001055p:plain:w400

SSH認証鍵のタブを開いて認証鍵全体を入力という欄の中に先程表示した公開認証鍵の内容をコピペします。

f:id:sakura_bird1:20190304001832p:plain:w400

保存後次のようなコマンドで SSH 接続できるようになります。

$ssh [外部IPアドレス] -i ~/.ssh/[KEY_FILENAME]

7. 22 番ポートを閉じて他のポートを開ける

参考サイト様によると、SSH ポートに攻撃されることで数円課金が発生するようです。
これを防ぎたいので参考サイト様の手順に従って 22 番ポートを閉じて他のポートを開けることにします。

7.1. ファイアウォールルールの作成(新ポート)

ナビゲーションメニューから「ネットワーク詳細の表示」を選択します。

f:id:sakura_bird1:20190304004632p:plain:w400

ファイアウォールルール」→「ファイアウォールルールを作成」をクリックします。

f:id:sakura_bird1:20190304005102p:plain:w400

次の項目を設定します。
開けるポート番号は任意の数字です。

入力項目 内容
名前 デフォルトのルールにならって、 allow-XXXX (XXXX はポート番号)にするとよい
ターゲットタグ デフォルトのルールにならって、 allowXXXX-server (XXXX はポート番号)にするとよい
ソース IP の範囲 0.0.0.0/0
プロトコルとポート 指定したプロトコルとポートをクリックし tcp のところにポート番号を入力する

f:id:sakura_bird1:20190304005709p:plain:w500

f:id:sakura_bird1:20190304005728p:plain:w500

入力し終えたら「保存」を押して追加されたのを確認します。 ここで入力したターゲットタグをインスタンスのネットワークタグに追加します。

VM インスタンスの詳細」→「編集」画面でターゲットタグを追加します。

f:id:sakura_bird1:20190304010109p:plain:w400

7.2. sshd_config のポート番号の設定を変更する

以下のコマンドを実行し、設定ファイルをバックアップする

$cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

エディタを起動して設定ファイルを書き換える

$sudo vi /etc/ssh/sshd_config

#Port 22 となっているので Port 40022 のように、先程開けたポート番号に書き換えます。

f:id:sakura_bird1:20190304011635p:plain:w500

保存したら SSH を再起動します。

$sudo service ssh restart

今までデフォルトの 22 番で接続していましたが、新しく開けたポート番号で接続するようになります。

$ssh [外部IPアドレス] -i ~/.ssh/[KEY_FILENAME] -p [ポート番号]

f:id:sakura_bird1:20190304022447p:plain:w500

gcloud コマンドでログインする時も-p [ポート番号]を付けることになります。
ブラウザからログインする時は「ブラウザウィンドウでカスタムポートを開く」を選択してポート番号を入力する必要があります。

ログイン出来たら 22 番のポートを閉じる作業に入ります。

7.3. ファイアウォールルールの作成(22 番ポート)

先程と同じく「ファイアウォールルールを作成」を開きます。
次の項目を設定します。

入力項目 内容
名前 デフォルトのルールにならって、 disallow-22 にするとよい
一致した時のアクション 拒否
ターゲットタグ デフォルトのルールにならって、 disallow22-server にするとよい
ソース IP の範囲 0.0.0.0/0
プロトコルとポート 指定したプロトコルとポートをクリックし tcp のところに 22 を入力する

f:id:sakura_bird1:20190304023921p:plain:w500

f:id:sakura_bird1:20190304023934p:plain:w500

入力し終えたら「保存」を押して追加されたのを確認します。
ここで入力したターゲットタグをインスタンスのネットワークタグに追加します。

VM インスタンスの詳細」→「編集」画面で先程作成した 22 番ポートを閉じるためのターゲットタグを追加します。

f:id:sakura_bird1:20190304024145p:plain:w400

22 番でアクセス出来なくなったと思います。

これで今回の記録は終わりです。

次回は作成したインスタンススワップ領域追加、タイムゾーン設定を行い、DockerとDocker Composeをインストールします。

8. 関連リンク