GCP:Proxy Server構築とバックエンドへのリクエストを試す
はじめに
GCPのcompute engineをつかって、Proxy Serverを構築し、後段のバックエンドへリクエストを行うモックを作ってみます。下記のような構成を試してみました。プロジェクト間でそれぞれVMインスタンスを持ち、それぞれのVPC(Virtual Private Cloud)ネットワークをVPC peeringで接続します。プロキシサーバーはNginxで構築し、後段のバックエンドサーバーはNode.jsとExpressを使ってリクエストを受けるようにします。本記事では実装の流れをかいつまんで書き残します。
GCPの設定
VPCネットワークの作成
各プロジェクトでVPCネットワークを作成します。
サブネットは任意の名前・リージョン・IPv4範囲を指定します。
例えば、下記のようにします。
- Project_1
- network_1
- リージョン:us-central1
- サブネット:10.0.0.0/24
- network_1
- Project_2
- network_2
- リージョン:us-central1
- サブネット:10.1.0.0/24
- network_2
そして、それぞれのVPCネットワークで適切なファイヤーウォール(IAP TCP 転送によるSSH接続やバックエンドサーバーのリクエストに必要なIPアドレス、TCPのポート番号など)を追加しておきます。
VPCネットワークを作成できれば、VPCネットワークピアリングから設定を行います。
この設定では、それぞれ双方向になるようピアリング先のプロジェクト名とネットワーク名を入力することが大事です。VPCネットワークピアリングでステータスが有効になっていれば設定に成功しています。
VMインスタンスの作成
それぞれのプロジェクトでVMインスタンスを作成します。
ネットワークインターフェースは先ほど作成したVPCネットワークを選択します。
例えば、下記のようなにします。
- Project_1
- インスタンス名:proxy-server
- ロケーション:us-central1-a
- ネットワークインターフェース:network_1
- Project_2
- インスタンス名:backend-server
- ロケーション:us-central1-a
- ネットワークインターフェース:network_2
後段のバックエンドサーバーの実装
VMインスタンスbackend-server
に、Node.jsとExpressを使います。
Node.js
とnvm
はこちらを参考にインストールします。
適当なディレクトリをつくって、
npm init
npm install express
適当なサンプルコードをつくります。
const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
そして、起動します。
実際、作り込むときは例えばpm2
をつかって永続化すると良いでしょう。
node index.js
プロキシサーバーの実装
こちらは、VMインスタンスproxy-server
に構築します。
Nginx
インストール
導入手順はこちらの公式サイトに従います。
今回は、VMインスタンスはDebianで用意しているので、その手順を参考します。
一通り、手順が実行した後、インストールされている確認します。
nginx -V
このとき何も表示されない場合、パスが通っていない可能性があるのでパスを通します。
今回試した時は、/usr/sbin
のほうに入っていました。こちらは、OSで使われるディレクトリの1つでシステム管理者向けの実行可能ファイルが格納される場所です。
# パスを調べる
dpkg -L nginx | grep bin
# その結果 -> sbin とは?
/usr/sbin
/usr/sbin/nginx
/usr/sbin/nginx-debug
# パスを通す
echo 'export PATH=$PATH:/usr/sbin' >> ~/.bashrc
# 再起動
source ~/.bashrc
そして、nginxを起動します。
systemctl start nginx
プロキシの設定
/etc/nginx/conf.d
のディレクトリ内に新しくconfファイルを作成します。
イメージは、server_name
が入口で、proxy_pass
が出口(バックエンドサーバーの入口)です。
server{
listen 80;
server_name {$プロキシサーバー側の外部IPもしくはドメイン名};
# proxy setting
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 後段に流すアドレス
location /sample/ {
proxy_pass http://{$後段のバックエンドサーバーの内部IP}:{$ポート番号}/;
}
}
そして、設定を反映します。下記のコマンドを実行することで、再起動なしで反映できます。
sudo nginx -s reload
実行
http://{$プロキシサーバー側の外部IPもしくはドメイン名}:80/sample/
とブラウザで実行する(もしくはcターミナルからcurlコマンドで実行)と、Hello World
と返ってきます。
おわりに
一連の接続がうまくいかない場合は、VPCネットワークのファイヤーウォール設定を見直すと良いです。本記事ではプロキシサーバーを通して、後段のバックエンドサーバーにリクエストを送信することができました。また次回、こちらのサンプルをTerraformで管理して置けるようにしたいですね。
Discussion