2020/02/03 追記
CloudFunctionsのIP固定ですが、proxyサーバ立てないでマネージドでも出来るようになりました!
https://cloud.google.com/functions/docs/networking/network-settings?hl=ja#associate-static-ip
下記に書いた構成からproxyサーバを外していただき
CloudFunctionsの設定で
すべてのトラフィックをVPCコネクタ経由でルーティングする
に変更すればproxyサーバ無くてもIPの固定が出来ます!
はじめに
gcp のCloudFunctionsは便利ですが、IPが固定されていなく、VPC内での起動も出来ないのでNATを通す事も出来ません。
IP制限がされているサービスに対してCloudFunctionsでアクセスしたい場合ってありませんか?
私はありました!!
単純にproxy通せば出来るのですが、その場合proxyサーバに対するアクセスのIPを固定出来なく、ServerlessVPCAccessを使って出来ないかな?と考え、セキュアにIP固定化する事が出来ました!!!
これでもうIP制限なんて怖くない!!!!
構成
CloudFunctionsからServerlessVPCAccessを使って、内部IPでVPC内のproxyにアクセスします。
proxy経由をして外に出ればCloudFunctionsの実行IPはNATのIPとなります。
それぞれの設定方法など見ていきましょう
ServerlessVPCAcess
ServerlessVPCAccessこちらのドキュメントを参照してproxyが立っているsubnetにアクセス出来るコネクタを作成しましょう
設定するIPは接続するVPC内のIPと重複しないようにしなければいけません。
ここで設定したIPでVPC内のリソースへアクセスすることになります。
proxyサーバ
GCEをたて、そこにsquidをつかってproxyサーバをたてました
squidのたて方は以下になります
# squidのインストール
sudo apt install squid
# 設定ファイルの修正
sudo vi /etc/squid/squid.conf
# 1194行目あたりにある以下をコメントアウト
# http_access deny all
# 1612行目あたりにあるportを任意の番号に変更(3128はsquidデフォルトなので使わない)
http_port 33228
# ファイルの末尾に以下を追加
# ServerlessVPCAccessのIPを追加
acl myacl src X.X.X.X/28
http_access allow myacl
http_access deny all
# プロキシサーバ接続端末のIP隠蔽
forwarded_for off
# プロキシ経由のアクセスをアクセス先に隠蔽
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
# squidの再起動
sudo service squid restart
# proxyのログ確認する場合は以下のファイルを確認
/var/log/squid/access.log
squidサーバが出来たら、以下の通信を許可するファイアーウォールを作って、GCEにつけましょう
tcp [ServeressVPCAccessのIP]:[squidのport]
CloudFunctions
CloudFunctionsでServerlessVPCAccessを使うには権限設定をしなくてはいけません。
こちらのページを参考に、権限設定を行い、ServerlessVPCAccessのコネクタを使うCloudFunctionsを作りましょう。
IPの確認をしたいのみでしたら以下のソースで確認出来ます
def hello_world(request):
import urllib.request
# グローバルIPアドレスを取得
ip = urllib.request.urlopen('http://checkip.dyndns.com/').read().decode('utf-8')
return ip
CloudFunctionsからのアクセスをproxyサーバ通すには環境変数の設定が必要になります。
以下の環境変数を設定します
http_proxy http://[proxyサーバの内部IP]:[proxyサーバのport]
CloudNat
こちらのドキュメントを参考にproxyサーバがあるVPCにCloudNatをたてましょう
おわりに
以上で設定は完了です。
CloudFunctionsのテスト実行をして、アウトプットにCloudNatのIPが出てきたら成功です!!
今回はproxyサーバを1台だけたてて、proxyサーバの内部IPを使いましたが、こちらをインスタンスグループとして、ロードバランサーたてるなどするとエンドポイントも変わらず、冗長性もたもてる構成にすることが出来ます。