2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GCPのサーバレスプロダクトからのリクエストのソースIPを固定化する

Last updated at Posted at 2020-06-09

こんにちは。いきなりですがGCPでいちばん好きなプロダクトはCloud Runです。
皆さん、GCPのサーバレス楽しんで使っていますか?

GCPのサーバレスプロダクト(主に以下のプロダクト)は無料枠もあり、しかも使った分だけ課金されるため、お財布にとっても優しいプロダクトです。

  • Google AppEngine スタンダード環境/フレキシブル環境
  • Cloud Functions
  • Cloud Run

なぜ安いか...それはリクエストが無い夜間など、CPUを使っていない間はインスタンスがゼロスケールされ課金されないためです。
Cloud Functionsの競合プロダクトとしてはAWS Lambda、Azure Functionsがあります。
AppEngineフレキシブル環境の競合プロダクトはAWS ECS、Azure App Serviceだと思います。
AppEngineスタンダード環境、CloudRunの競合プロダクトについては...すみません。未確認です。

サーバレスプロダクトのソースIPの課題

そんなGCPのサーバレスプロダクトですが、欠点の一つとしてプロダクトの上で実行するアプリから外部サービスへリクエストを出した時のソースIPが不定になることです。
これはアプリがGoogleのデータセンターのどれかで実行され、Googleが持つ膨大な数のIPアドレスのいずれかが使用されるためと推測しています。

大概のアクセスには問題になりません。ですが、いくつかの外部サービスではソースIPアドレスで制限を行っているものがあり、そこにアクセスするのにIaaSを使用せざるを得ないケースがあります。

Serverless VPC Accessの登場

Serverless VPC Accessや、AppEngineフレキシブル環境ができる前までは、サーバレスプロダクトからGCPのVPC(IaaS上に構築されるVirtual Private Cloud)へのアクセスにはインターネット側に出る必要があり、VPC内インスタンスへ内部IPで直接アクセスすることはできませんでした。

Serverless VPC Accessを用いVPC内のインスタンスを経由することでリクエスト時のIPアドレス固定化ができるようになります。
例としてAppEngineの場合は以下のようになります。

  • AppEngine
    • Severless VPC Accessを設定することで、内部IP向けのアクセスはVPC側に出力されます。
    • 環境変数HTTP_PROXY,HTTPS_PROXYにCompute Engine上に作成したプロキシサーバの内部IPを設定します。(Golangを使う場合)
  • Compute Engine
    • VPC内に外部IPを持たないインスタンスを作成しsquid等でプロキシサービスを起動します。
  • Cloud NAT
    • Cloud NATを設定し、リクエストがVPC内から出ていけるようにします。
    • ここでインスタンスに直接外部IPを割り当てずに、Cloud NATを使うのは少しでも利用料を節約するためです。

一応上記の構成でAppEngine上のアプリからIPを固定化してリクエストが出るようになりますが、やはり不満はあります。IaaS特にCompute Engineを使用しているため、利用料がそれなりにかかることです。

Cloud Functionsの--egress-settingsオプションの登場

Cloud Functionsをデプロイする際に使用するgcloud functions deployコマンドには--egress-settingsオプションがあります。これはServerless VPC Access使用時に使うものですが、これにallを指定すると外部IPだろうが内部IPだろうがリクエストはVPCに出力されます。

これとCloud NATを組み合わせると、VPC内のインスタンスが不要になります。

  • Cloud Functions
    • デプロイ時にServerless VPC Accessの使用と--egress-settings=allを指定することでCloud Functions内の全てのリクエストをVPC側に出力します。
  • Cloud NAT
    • Cloud NATを設定し、外向けのリクエストがVPC内から出ていけるようにします。

gcloud alpha run deploy には--vpc-egressオプションが存在する

もうしばらく待てばCloud RunでもソースIPの固定化が楽にできるようになりそうです。

Cloud Run(beta)

(2020/10/14記)Cloud Run(beta)で--vpc-egressオプションが適用できるようになりました。
このオプションとServerless VPC Access、Cloud NATを使用することでCloud Functions同様、Cloud RunでもソースIPを固定化することができます。

まとめ

GCPのサーバレスプロダクト上のアプリからソースIPを固定化してリクエストを出したい場合、Cloud FunctionsまたはCloud Runを使用すると運用費が安くなる可能性があります。

Googleさんには、この仕組みをAppEngine やCloud Run にも早く適用して欲しいと願っています。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?