外部IPを持たないGCEインスタンスでweb開発

Posted by rhoboro on 2019-09-06

先日、GCPからGCEインスタンスに付与した外部IPを有料化するという連絡がきました。
現在はGCEの料金表にも次の記載があります。

gce_pricing

月額300円程度ですが、月々かかってくる費用なので少しでも安いほうが嬉しいです。
そこで、外部IPを持たないGCEインスタンスでWEBサービスの開発を行う方法を試してみました。

GCEインスタンスの作成

まずは、外部IPを持たないGCEインスタンス instance-1 を作成します。
ここでは80番ポートで開発用webサーバを起動するために、「Allow HTTP traffic」にチェックをつけました。 もし他のポートを利用する場合は、そのポートで通信できるようにFirewallルールを設定してください。

create_gce

少し待つとインスタンスが作成され、外部IP(External IP)が付与されていないことが確認できます。

instance

SSHによる接続とwebサーバの起動

作成した外部IPを持たないインスタンスにSSHでログインし、webサーバを起動します。
gcloud compute sshコマンドは、外部IPを持たないGCEインスタンスへのSSHログインも可能です。 ドキュメントはUsing Cloud IAP for TCP forwardingにあります。

$ gcloud compute ssh instance-1 --zone us-central1-a
External IP address was not found; defaulting to using IAP tunneling.
Linux instance-2 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u5 (2019-08-11) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Sep  6 09:19:30 2019 from ...
rhoboro@instance-1:~$

無事にログインできたら、開発用のwebサーバを起動します。
今回はローカルからアクセスできることが確認できれば十分なため、Pythonの簡易HTTPサーバを利用しました。

rhoboro@instance-1:~$ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 ...

Cloud IAPを利用したトンネルの作成

gcloud compute start-iap-tunnelコマンドを利用すると、TCPトンネルを作成できます。 これを利用して、ローカルの8080番ポートとGCEの80番ポートを繋げましょう。
別のシェルを立ち上げて、次のコマンドを実行します。

$ gcloud beta compute start-iap-tunnel instance-1 80 --local-host-port=localhost:8080 --zone us-central1-a
Testing if tunnel connection works.
Listening on port [8080].

動作確認

トンネルが繋がったら、HTTPリクエストを投げて動作確認をしてみましょう。
別のシェルを立ち上げて、curlでリクエストを投げてみます。 上手く接続できると、次のようにレスポンスが返ってきます。

$ curl localhost:8080
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
...

webサーバのログにも、アクセスログが出ていました。

rhoboro@instance-1:~$ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 ...
... - - [06/Sep/2019 08:37:32] "GET / HTTP/1.1" 200 -

まとめ

特に詰まることなく、サクッと上手くいきました。
トンネルを掘ること自体はコマンド1つでできます。 そこまでの手間ではないので、個人的には外部IPは外しても問題ないと感じました。

また、料金が安くなる以外にも、外部IPを持たないことはセキュリティ面でも少し安心感が増すかなと思います。

tags: gcp, gce, iap