⛈️

GCP:Proxy Server構築とバックエンドへのリクエストを試す

2024/11/17に公開

はじめに

GCPのcompute engineをつかって、Proxy Serverを構築し、後段のバックエンドへリクエストを行うモックを作ってみます。下記のような構成を試してみました。プロジェクト間でそれぞれVMインスタンスを持ち、それぞれのVPC(Virtual Private Cloud)ネットワークをVPC peeringで接続します。プロキシサーバーはNginxで構築し、後段のバックエンドサーバーはNode.jsとExpressを使ってリクエストを受けるようにします。本記事では実装の流れをかいつまんで書き残します。

alt text

GCPの設定

VPCネットワークの作成

各プロジェクトでVPCネットワークを作成します。
サブネットは任意の名前・リージョン・IPv4範囲を指定します。
例えば、下記のようにします。

  • Project_1
    • network_1
      • リージョン:us-central1
      • サブネット:10.0.0.0/24
  • Project_2
    • network_2
      • リージョン:us-central1
      • サブネット:10.1.0.0/24

そして、それぞれのVPCネットワークで適切なファイヤーウォール(IAP TCP 転送によるSSH接続やバックエンドサーバーのリクエストに必要なIPアドレス、TCPのポート番号など)を追加しておきます。

VPCネットワークを作成できれば、VPCネットワークピアリングから設定を行います。
この設定では、それぞれ双方向になるようピアリング先のプロジェクト名とネットワーク名を入力することが大事です。VPCネットワークピアリングでステータスが有効になっていれば設定に成功しています。

alt text

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.jsnvmはこちらを参考にインストールします。

https://nodejs.org/en/download/package-manager

https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating

適当なディレクトリをつくって、

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で用意しているので、その手順を参考します。

https://nginx.org/en/linux_packages.html#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