どんなに些細なこと、当たり前のことであっても、しばらく自分で試行錯誤したことを備忘録としてウェブ上に残しておくことは、次にまた同じことをしたいと思ったときにググれば出てくるので便利です。
昨日も、そういえば昔こういうことやったよね・・・と思ってググったら、かなり前に自分で書いた記事を見つけました。→「googleクラウドにたてたWeb Serverをセキュアに使う」
今から思えばちょっと冗長なので、簡素化して再度備忘録です。
やりたいこと:
ファイアウォールで閉じたGCEインスタンスへ、ブラウザでアクセスしたい。
つまり、グローバルにはhttpやhttpsのポートを開けることなく、プライベートにウェブアクセスしたいということです。
方法は、google cloud console の cloud shell が備えているポート転送に乗っかるだけです。GCPには cloud shell という便利なコンソールがあって、gcloud のコマンドでプロジェクトを切り替えることでファイアウォールの中に入れる仕組みを持っています。このコンソールがウェブのポートを転送する機能も持っていて、cloud shell をみているブラウザからcloud shell 仮想マシンにアクセスすることができます。
ブラウザで cloud shell を立ち上げると、「ポート8080でプレビュー」というメニューが出てきます。これが、cloud shell 仮想マシンの8080ポートに、このブラウザからアクセスするメニューです。
これは、cloud shell のサーバーで開発をする目的で作ってあるんじゃないかと思いますが(例えばこの「ウェブでプレビュー」機能を説明する記事など)、cloud shell 仮想マシンはあまり重い仕事ができず、例えば大量のデータを扱ったり、重い計算をしたり、重厚なウェブアプリを動かしたりすることができません。だから、別のGCEインスタンスに転送したくなります。
そこで、この cloud shell 仮想マシンの8080ポートを、各プロジェクトのファイアウォールの中で動いているGCEインスタンスの8080ポートに転送します。
いわば、cloud shell を使ってVPNを張っているようなものですね。
方法は、cloud shell にて
gcloud compute ssh (instanceName) --project (projentName) \\
--zone (zoneName) --ssh-flag="-L" \\
--zone (zoneName) --ssh-flag="-L" \\
--ssh-flag="8080:localhost:8080"
でOK。やっていることは、cloud shell 仮想マシンからGCEインスタンスへ sshでトンネルを掘っているだけです。これを実行すると、「ポート8080でプレビュー」でGCEのインスタンス(instanceName)の8080ポートに繋がります。
最後に、なんでわざわざこんなことをするのか。
それは、セキュリティを可能な限り誰かに任せたいからです。SEならばhttpやhttpsポートをグローバルに見せて、かつセキュリティを保つ方法を知っていて、経験値もあると思いますが、私は分析屋で、開発については素人なので、セキュリティはできれば信頼できる誰かに任せたい。その意味で、googleさんのセキュリティに乗っかるのは世界最高峰の知識と経験に乗っかっているようなものなので、自分がやるより安心です。