こんにちは。いきなりですが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 にも早く適用して欲しいと願っています。