弊社支払い代行サービスをご利用のお客様から、Partner Interconnectなどの専用線経由でGCS(Google Cloud Storage) を使う方法ないの? とよく質問をいただきます。
本記事ではお手軽な方法として、VPC(Virtual Private Cloud)上に構築したプロキシサーバ経由でGCSを利用する方法を紹介いたします。
目次
専用線経由でGCSを使う方法
GCSは世界中のどこからでもデータの保存と取得ができることが売りのサービスなので、インターネット経由でGCSののAPIにアクセスして利用することが前提になります。
オンプレミスのネットワークとVPCが専用線でつながっていても、そのままではインターネット経由でのアクセスとなってしまい、せっかくの専用線接続を活かすことができません。
オンプレミスのサーバやPCから専用線経由でGCSを使う方法として、ざっくり下記3つが考えられます。
1.ゲートウェイ製品を導入する
2.Private Google Access for on-premises hostsを利用する
3.プロキシサーバを利用する
1.ゲートウェイ製品を導入する
Panzuraのようなゲートウェイ製品を導入して利用する方法です。大規模なエンタープライズ向けのソリューションなので、SMBやNFSといったプロトコルを使えたり、高性能なキャッシュ機能を備えていたりと機能的な面は言うことないのですが、初期投資や運用設計などコスト的な面で導入までのハードルがなかなか高く、「ちょっとやってみよう」的な使い方は難しいです。
2.Private Google Access for on-premises hostsを利用する
GCPにはオンプレミスのネットワークからGCPのAPIを利用できるサービスとして、Private Google Access for on-premises hostsというものがあります。2019年5月現在ベータ版のサービスであり、既存のネットワーク設定に手を入れる必要があるため気軽に行うには影響範囲が大きく、まだおすすめができません。※GAになりました!
3.プロキシサーバを利用する
これが今回ご紹介する方法になります。VPC上にGCE(Google Compute Engine)でプロキシサーバを構築し、gsutilなどのツールからこのプロキシサーバ経由でGCSにアクセスします。専用線の利用料を考えないのであれば、他の2点と比べて
・費用はGCEの利用料だけ
・影響が出るのはプロキシサーバを使うように設定した環境だけ
というお手軽な方法ですので、気軽に試してみていただければと思います。
プロキシサーバを作ってみよう
では実際にプロキシサーバを作ってみましよう。以下のステップで進めていきます。
・構成
・GCEインスタンス作成
・squidインストール
・squidの設定
・GCPのファイアウォール設定
構成説明
構成は図のとおりです。検証用に専用線を用意するのは難しかったので、オンプレミス環境に見立てたAWSのVPCとGCPのVPCをCloud VPNでつないで検証環境を用意しました。AWSの仮想サーバ(EC2)にCloud SDKを導入して、GCP上に構築したプロキシサーバを利用する設定を行います。最終的にgsutilコマンドラインツールを利用して、これらのサーバからVPNを経由してGCSを利用できているかを確認します。
今回の構成では、プロキシサーバは外部IPアドレス経由でGCSのAPIにアクセスします。この構成でも、通信はGoogleのネットワーク内で完結しますが、プライベート Google アクセスを使うと外部IPアドレスが無くてもGCSのAPIを利用することができますので、ご利用の環境にあわせてご利用いただければと思います。
VPC(サブネット) | |
---|---|
GCP | 192.168.0.0/24 |
AWS | 192.168.100.0/24 |
仮想サーバ | 内部IPアドレス | 外部IPアドレス | 備考 |
---|---|---|---|
プロキシサーバ (GCE/CentOS7) |
192.168.0.2 | エフェメラル | squidを導入 (ポート3128) |
確認用 (EC2/Windows Server 2016) |
192.168.100.59 | なし | Cloud SDKを導入 |
確認用 (EC2/CentOS7) |
192.168.100.57 | なし | Cloud SDKを導入 |
プロキシサーバ用GCEインスタンス作成
GCPのVPC上に外部IPアドレスを持つCentOS7のGCEインスタンスを1台作成し、これをプロキシサーバとして使用します。複数人でプロキシサーバを使うのであれば、それに応じたサイジングが必要ですが、検証での利用であればn1-standard-1(1vCPU、3.75GBメモリ)に10GByteの永続ディスクで十分です。プロキシサーバの内部IPアドレスが変更されると都合が悪いので、予め静的内部IPアドレスを予約しておくと面倒がないです。
以下、このインスタンスにSSHで接続して作業します。
squid インストール
下記コマンドで プロキシサーバsquidをインストールします。ついでにupdateもしておきましょう。
## squidインストール
$ sudo yum -y install squid
## 更新
$ sudo yum -y update
squid の設定
squidをインストールしたら下記設定を行います。
1.squid.conf の 編集
2.自動起動設定
squidはインストールしただけでは使用できないので、環境にあわせてコンフィグファイルを編集します。 /etc/squid/squid.conf
の指定箇所を編集してください。
ご紹介する設定は、squidをデフォルトポート3128で利用するために最低限必要なものとなります。この記事ではsquidのパフォーマンスやセキュリティについては扱いませんので、興味のある方はGoogleで検索してみてください。
1.squid.conf の 編集
・squidのコンフィグファイルを開く
$ sudo vi /etc/squid/squid.conf
・接続を許可するネットワークの設定
AWSのサブネット(192.168.100.0/24)からのみプロキシサーバを利用できるように設定を追加します。試される場合は、ご利用の環境にあわせて設定してください。
不要なネットワークはコメントアウトしておきます。
## 編集前
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
## 編集後
# acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
# acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
# acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
# acl localnet src fc00::/7 # RFC 4193 local private network range
# acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl localnet src 192.168.100.0/24
・接続先ポートの許可設定
GCPはHTTPSで接続するのでSSL(443)以外はコメントアウトします。
## 編集前
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
## 編集後
acl SSL_ports port 443
#acl Safe_ports port 80 # http
#acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
・「http_access deny all」のコメントアウト
このままだと全ての接続が拒否されるので、「http_access deny all」の行をコメントアウトします。
## 編集前
# And finally deny all other access to this proxy
http_access deny all
## 編集後
# And finally deny all other access to this proxy
# http_access deny all
・ログファイルのフォーマット設定
これは必須の設定ではないのですが、ログを見やすくするためにフォーマットを指定します。squid.conf の最後に下記行を追加してください。
## 下記行を追加
# squid log format
logformat squid %tl %>a %rm %<Hs %ru %st
2.自動起動設定
OSが起動したときにsquidのサービスも自動で起動するように設定します。
## 自動起動設定
$ sudo systemctl enable squid
設定がすべて完了したらsquidを起動します。
## squid起動
$ sudo systemctl start squid
GCPのファイアウォール設定
手順は省略しますが、GCPのVPCへのInbound通信でプロキシサーバへの通信(TCP、ポート3128)が許可されるようにしておいてください。これを忘れると通信ができません。
オンプレミス側(今回でいうとAWS)でもプロキシサーバへのOutbound通信(TCP、ポート3128)の許可が必要となりますので、通信を絞っている場合は設定をお願いします。
プロキシサーバ経由でGCSを使ってみよう
構築したプロキシサーバを使うよう設定を行い、gsutilコマンドでGCSのバケットにファイルをコピーしてみましょう。Cloud SDKをインストールし、gcloud init
コマンドで初期設定を行った環境が前提となります。Cloud SDKのインストールは下記サイトを参考にしてください。
https://cloud.google.com/sdk/docs/
https://cloud.google.com/storage/docs/boto-gsutil
Windows、Linux共にgsutilのbotoファイルへプロキシサーバの設定を入れます。
・Windows
%HOMEDRIVE%%HOMEPATH% に 隠しファイルとして”.boto”というファイルがありますので、プロキシサーバのIPアドレスとポート情報を入れます。
プロキシサーバの設定が終わったら、gsutilでGCSのバケットにファイルを転送してみましょう。以下の例では「proxy-test-samples」というGCSバケットに「testfile.bin」という10MByteのファイルをコピーしています。
C:\>gsutil cp C:\testfol\testfile.bin gs://proxy-test-samples/testfile.bin
Copying file://C:\testfol\testfile.bin [Content-Type=application/octet-stream]...
\ [1 files][ 10.0 MiB/ 10.0 MiB]
Operation completed over 1 objects/10.0 MiB.
ファイルのコピーが終わったら、プロキシサーバでsquidのアクセスログを確認してみましょう。gsutiを実行したサーバからGoogleのAPIへの通信ログがあれば成功です。
## プロキシサーバで下記実行
$ sudo tail -10 /var/log/squid/access.log
## ログの例
08/May/2019:01:26:20 +0000 192.168.100.59 CONNECT - www.googleapis.com:443 4587
08/May/2019:01:26:20 +0000 192.168.100.59 CONNECT - www.googleapis.com:443 5187
・Linux
ユーザーのホーム ディレクトリに隠しファイルとして”.boto”というファイルがありますので、プロキシサーバのIPアドレスとポート情報を入れます。”.boto”ファイルの編集が終わったら、設定を適用するため一度シェルに入り直してください。
## botoファイルを編集
$ vi ~/.boto
## 変更前
#proxy =
#proxy_port =
## 変更後
proxy = 192.168.0.2
proxy_port = 3128
gsutilでファイルをコピーしてみます。
$ gsutil cp testfile.bin gs://proxy-test-samples/testfile.bin
Copying file://testfile.bin [Content-Type=application/octet-stream]...
/ [1 files][ 10.0 MiB/ 10.0 MiB]
Operation completed over 1 objects/10.0 MiB.
こちらもファイルのコピーが終わったら、プロキシサーバでsquidのアクセスログを確認してみましょう。
## プロキシサーバで下記実行
$ sudo tail -10 /var/log/squid/access.log
## ログの例
08/May/2019:01:40:46 +0000 192.168.100.57 CONNECT - www.googleapis.com:443 5188
08/May/2019:01:40:46 +0000 192.168.100.57 CONNECT - www.googleapis.com:443 4584
今回はgsutilツールで試していますが、プロキシを設定可能なツールであれば同様にご利用いただけるかと思います。ぜひお試しください。
まとめ
今回はお手軽に専用線経由でGCSを利用する方法として、プロキシサーバを構築して使用する方法を紹介いたしました。実際に本番環境として使用するには、冗長性やパフォーマンスを意識した構成にしたりsquidのチューニングなどを行ったりと、いろいろな考慮が必要になるかと思いますが、Cloudのよいところは気軽に始められるところです。使ってみないとわからないことも多々ございますので、まずは最小構成で試してみていただき、ご利用の環境にあった構成を見つけていただければと思います。
クラウドエースでは、Google Cloud Platformのご利用について様々な技術支援を行っております。何かお困りのことがございましたらぜひご相談ください!