API を管理するためのプラットフォームである Apigee X について、基本的な使い方を記載します。Apigee は 2016 年に Google によって買収されており、Apigee Edge という名称で Google Cloud のサービスに加わりました。2021 年に Apigee X という名称の GCP-native なサービスが開始されました。
似たサービスである Cloud Endpoints や、Cloud Functions/Cloud Run 等の serverless サービスをバックエンドとする Cloud API Gateway は、GCP 内に閉じており、機能としてもシンプルなものが提供されます。
関連資料:
Apigee 社 (Google) によって管理される VPC と顧客管理の VPC の二つによって構成されます。これら二つの VPC は VPC network peering によって接続されます。
より正確には、VPC network peering の技術を利用した Private Services Access によって接続されます。似た名称の機能が複数存在するため注意します。Private "Service" Access ではありません。"Services" は複数形です。
参考資料: Private access options for services
VPC → PRIVATE SERVICE CONNECTION → ALLOCATED RANGES FOR SERVICES → ALLOCATE IP RANGE をクリックして IP レンジを予約します。
PRIVATE CONNECTIONS TO SERVICES をクリックして Service Directory への connection を作成します。
VPC network peering が Google 管理の VPC である servicenetworking に対して作成されていることも確認できます。
例えば、Cloud SQL インスタンスを作成する際に、予約した IP レンジを指定すると、Cloud SQL インスタンスに対して、VPC 内から内部 IP でアクセス可能となります。
以下は eval (評価版) を Wizard でセットアップする例です。プロジェクトID を指定します。
補足: eval (評価版) における無料枠は、Apigee 管理の VPC 内リソースに対して適用されます。顧客管理 VPC 内の VM や Load Balancer は対象外です。
API を有効化した後に、ネットワーク関連の設定を行います。
VPC を選択します。前述の Private Services Access で利用する IP レンジも指定します。
Private Services Access が利用する VPC network peering が作成されていることが確認できます。
割り当てられた IP レンジです。
Private Services Access です。
Apigee API を利用して Apigee organization を作成します。
リージョンを指定します。
利用者が Apigee にアクセスする際の経路を指定します。
インターネットからアクセスする場合は以下のようにします。独自にドメインを指定することもできます。
Load balancer の backend となる Managed Instance Group (MIG) の subnet を指定します。
セットアップが完了すると、以下のような表示になります。
作成された HTTP Load Balancer です。
作成された Instance Template です。
作成された Managed Instance Group (MIG) です。
作成された VM です。
しばらく待つと、以下の API Proxy にアクセスできます。
$ curl -sS https://34.149.134.44.nip.io/hello-world
Hello, Guest!
Proxy が複数登場するため分かりづらいですが、上記 MIG の VM も Proxy です。MIG の Proxy 先が API Proxy です。API Proxy が Proxy する先が、実際の API です。
実際には API Proxy を複数まとめて API Product としてユーザに提供します。
API Proxy は Apigee 管理の Instance で稼働します。Instance には Private Services Access で利用する IP レンジ内の IP が付与されていることが確認できます。
Apigee X の Customer VPC のプロジェクトを VPC-SC に含めることができます。
関連資料:
VPC-SC を設定済みであっても、API Proxy からインターネット上の Target を指定可能です。
$ curl -sS https://34.149.134.44.nip.io/hello-world
Hello, Guest!
gcloud services vpc-peerings enable-vpc-service-controls を利用することにより、Private Services Access の VPC network peering で接続された先の VPC 内のリソースからの通信を Customer VPC にルーティングさせることができます。
username@cloudshell:~ (myproject-20211206)$ gcloud services vpc-peerings enable-vpc-service-controls --network=myvpc --project=myproject-20211206
Operation "operations/evsc.p28-464464998635-294c81f8-4399-4737-8233-71a04f5d5c42" finished successfully.
$ curl -sS https://34.149.134.44.nip.io/hello-world
{"fault":{"faultstring":"The Service is temporarily unavailable","detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}
Both the Google Cloud project and its associated runtime are incuded within that project's VPC Service Controls perimeter.
https://cloud.google.com/apigee/docs/api-platform/security/vpc-scWhen VPC Service Controls are enabled, access to the internet is disabled: the Apigee runtime will no longer communicate with any public internet target.
https://cloud.google.com/apigee/docs/api-platform/security/vpc-sc
インターネット上の API にアクセスしたい場合は、一旦 Customer VPC の VM にルーティングする必要があります。
You have to route traffic to your VPC by establishing custom routes.
https://cloud.google.com/apigee/docs/api-platform/security/vpc-sc
以下の二つの Cloud Storage Bucket を用いて実験してみます。Cloud Shell で実行すると、どちらもパブリックにアクセスできることが分かります。
username@cloudshell:~ (myproject-20211206)$ gsutil ls gs://gcp-public-data-landsat/
gs://gcp-public-data-landsat/index.csv.gz
gs://gcp-public-data-landsat/LC08/
gs://gcp-public-data-landsat/LE07/
gs://gcp-public-data-landsat/LM01/
gs://gcp-public-data-landsat/LM02/
gs://gcp-public-data-landsat/LM03/
gs://gcp-public-data-landsat/LM04/
gs://gcp-public-data-landsat/LM05/
gs://gcp-public-data-landsat/LO08/
gs://gcp-public-data-landsat/LT04/
gs://gcp-public-data-landsat/LT05/
gs://gcp-public-data-landsat/LT08/
username@cloudshell:~ (myproject-20211206)$ gsutil ls gs://apigee-5g-saas/
gs://apigee-5g-saas/apigee-envoy-proxy-release/
gs://apigee-5g-saas/apigee-southbound-nat-release/
VPC-SC を Cloud Storage API についても設定すると、MIG で管理される VM 内では以下のようになります。
username@apigee-proxy-3ksw:~$ gsutil ls gs://gcp-public-data-landsat/
AccessDeniedException: 403 Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: uCVEeFd2EHek3OrPMYPi1gbFi7k1QN0WGlJrYDRqFy4Vmwu82Bng9Q
username@apigee-proxy-3ksw:~$ gsutil ls gs://apigee-5g-saas/
gs://apigee-5g-saas/apigee-envoy-proxy-release/
gs://apigee-5g-saas/apigee-southbound-nat-release/
VM の startup-script-url
で指定された Bucket については、VPC-SC が存在していてもアクセスできることが分かります。
Apigee X の apigee.google.com は 2021-12-19 現在、Cloud Identity のサービスアクセス制御に対応していません。「Additional services without individual control」に属するため、以下のページで ON/OFF を制御する必要があります。
関連資料: Manage access to services that aren't controlled individually
以下のページで言及されている BeyondCorp Enterprise の IP アクセス制限は apigee.google.com へのアクセスについては機能しません。
IP 制限を実施したい場合は、BeyondCorp Enterprise ではなく VPC-SC を設定する必要があります。