LoginSignup
87
57

More than 3 years have passed since last update.

GCP CloudFunctionsの実行IPアドレスを固定化する方法

Last updated at Posted at 2020-01-17

2020/02/03 追記

CloudFunctionsのIP固定ですが、proxyサーバ立てないでマネージドでも出来るようになりました!
https://cloud.google.com/functions/docs/networking/network-settings?hl=ja#associate-static-ip

下記に書いた構成からproxyサーバを外していただき
CloudFunctionsの設定で
image.png
すべてのトラフィックをVPCコネクタ経由でルーティングする

に変更すればproxyサーバ無くてもIPの固定が出来ます!

はじめに

gcp のCloudFunctionsは便利ですが、IPが固定されていなく、VPC内での起動も出来ないのでNATを通す事も出来ません。
IP制限がされているサービスに対してCloudFunctionsでアクセスしたい場合ってありませんか?
私はありました!!

単純にproxy通せば出来るのですが、その場合proxyサーバに対するアクセスのIPを固定出来なく、ServerlessVPCAccessを使って出来ないかな?と考え、セキュアにIP固定化する事が出来ました!!!

これでもうIP制限なんて怖くない!!!!

構成

スクリーンショット 2020-01-17 15.48.21.png

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を使いましたが、こちらをインスタンスグループとして、ロードバランサーたてるなどするとエンドポイントも変わらず、冗長性もたもてる構成にすることが出来ます。

87
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
57