【GCP】CloudEndpointsにカスタムドメインを設定する

クラウドカテゴリー

この記事では、CloudEndpointsに独自ドメイン(カスタムドメイン)を設定して、APIに任意のパスを設定する方法を紹介します。

CloudEndpointsで設定されるパスは、デフォルトだとCloudRunのホスト名(ハッシュ値付き)になってしまうため、パスを直感的に記述することができません。

独自のドメインを持っている方なら、ホスト名ではなくてドメインを利用したパスを設定することが可能なので、その方法を紹介します。

設定手順は下記の通りです。

  • 事前準備
  • ドメインの所有権を確認
  • DNSレコードの登録
  • OpenAPIの設定ファイル(yaml)の作成
  • Endpointsサービスのデプロイ
  • ESPv2のデプロイ
  • CloudRunのドメインマッピング

それぞれ詳細を説明していきます。

基本的には公式ドキュメントにカスタムドメインの設定方法は紹介されています。ただ、情報が散らかっていてわかりにくいです。自分が躓いた点を意識しながら、設定方法を説明していきます!

事前準備

まず、この記事で想定している前提は下記になります。

  • ドメインを取得済み
  • CloudEndpointsをデプロイ済み
  • CloudEndpointsではAPIゲートウェイとしてESPv2を利用している
  • CloudEndpointsの後ろのAPIはCloudFunctionsで構築されている(CloudFunctions以外でも可)

ドメインについて

ドメインはどのサービスからでも構わないですが、事前に取得しておく必要があります。

お名前ドットコムムームードメインXserverなど多くのドメイン販売サービスがあるので、好きなサービスからドメインを取得しましょう。

GoogleDomainsとGCPの親和性は高いので、GCPで利用するのであればGoogleDomainsでの取得がおすすめです。

自分はGoogleDomainsでドメインを取得しています。

自分はXserver(ブログ用)とGoogleDomains(開発用)でそれぞれ一つずつドメインを取得しています。両方GCPで利用したことがありますが、GCPではGoogleDomainsがおすすめです!

CloudEndpointsの事前デプロイについて

下の記事でCloudEndpointsのデプロイ方法を紹介しているので、まだCloudEndpointsをデプロイしていない方がいたら参考にしてみてください。

CloudEndpointsを理解する上でのポイントは、EndpointsサービスとAPIゲートウェイであるESPv2は別々にデプロイする点です。

CloudFunctionsでのAPI立ち上げ

この記事ではCloudFunctionsを想定していますが、別にCloudFunctionsではなくても問題ありません。

ComputeEngine, AppEngineやCloudRunでも、好きなのを利用下さい。

ドメインの所有権を確認

Googleウェブマスターセントラルから、自身の持っているドメインの所有権を確認します。

ドメインを取得したサービスによって設定方法が異なるかもしれませんが、公式ドキュメント通りに進めれば難しいことはありません

公式ドキュメント-所有権の確認:https://cloud.google.com/endpoints/docs/openapi/verify-domain-name?hl=ja#verifying_ownership

DNSレコードの登録

ドメイン名からIPアドレスに変換できるようにするために、DNSレコード(A / AAAA / CNAME)を登録します。

実は設定方法が複数あるため、正しい設定方法がいまいち把握できていません。。。

ここでは、AppEngineのドメイン設定画面からDNSレコードを取得する方法を紹介します。(亜流かも、、、)

ポイント
  • ドメインの取得はどこのサービスでも問題ないが、DNSレコード設定方法が異なる
  • DNSの設定は、GCPのCloudDNSを使うことも可能
  • AppEngineのほかにCloudRun for Anthosのドメイン設定画面からもDNSレコードを取得可能

CloudDNSは使用料金がかかるので私はまだ利用していません!大量のアクセスがない限りCloudDNSは必要ないと思っています。

DNSレコードの取得

まず、DNSレコードを取得しましょう。

AppEngineのカスタムドメイン設定のドキュメントを参考にします(https://cloud.google.com/appengine/docs/standard/python3/mapping-custom-domains)。

1.

AppEngineのコンソールへ移動し、「設定」→「カスタムドメイン」→「カスタムドメインを追加」をクリックします。

2.

まず、所有権を確認済みの使用するドメインを選択します。次に、CloudEndpointsで利用するサブドメインを指定します。(CNAMEレコードに影響します)

最後に、表示されるDNSレコードをメモしておきます。

DNSレコードの設定

上記でメモしたDNSレコードをドメインの管理画面から追加します。

下記ではGoogleDomainsでの設定方法を紹介します。

GoogleDomainsのコンソールページにアクセスして、「DNS」→「Manage customer records」に移動しましょう。

あとは、Aレコード、AAAAレコード、CNAMEレコードを登録したら、DNSレコードの設定は完了です。

各レコードの役割を簡単に説明しておきます。

  • A:ドメイン名・ホスト名をIPv4と結びつけるために利用する
  • AAAA:ドメイン名・ホスト名をIPv6と結びつけるために利用する
  • CNAME:A / AAAAレコードに別名をつけるレコード。特定のドメイン名を別のドメイン名に転送するときに利用する

※今後サブドメインを追加したいときは、CNAMEだけ追加すればOKです。

OpenAPIの設定ファイルを作成

公式ドキュメントを参考にOpenAPIのYAMLファイルを作成します。(Endpointsの設定:https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions?hl=ja#endpoints_configure

ポイントは、hostsにDNSレコードを登録したカスタムドメインを設定することです(test.sample.comとします)。

一例です。各設定値は、OpenAPI2.0の仕様を確認ください。

swagger: '2.0'
info: title: API Gateway description: Sample version: 1.0.0
host: test.sample.com
basePath: /v1
schemes: - https
paths: /hello: get: summary: hello operationId: hello x-google-backend: address: https://{region}-{project_id}.cloudfunctions.net/hello protocol: h2 responses: '200': description: A successful response schema: type: string

上記の設定では、https://test.sample.com/v1/helloに対してGETリクエストを受け付けるということになります。

Endpointsサービスのデプロイ

上記で作成したEndpointsの設定をデプロイします。

こちらも、公式ドキュメントを参考に進めれば、問題ありません。(Endpoints 構成をデプロイする:https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions?hl=ja#deploy_configuration)。

下記コマンド例です。環境変数は適宜変更してください。

$ export YAML_FILE=openapi.yml
$ export PROJECT_NAME=project_name_of_espv2
# カスタムドメインがEndpointsサービス名出力されることを確認してください
$ gcloud endpoints services deploy $YAML_FILE --project $PROJECT_NAME
Service Configuration [2021-08-22r0] uploaded for service [test.sample.com]

デプロイが完了したら、ドメインのEndpointsサービスを有効化します。

$ export ENDPOINTS_SERVICE_NAME=test.sample.com
$ gcloud services enable $ENDPOINTS_SERVICE_NAME

ESPv2をデプロイ

上記でデプロイしたEndpointsサービスを利用するAPIゲートウェイ(ESPv2)イメージを作成し、CloudRunにデプロイします。

デプロイ先のCloudRunサービスは、すでにESPv2をデプロイしているサービスを利用してください。

$ export CLOUD_RUN_HOST=test.sample.com
$ export ENDPOINTS_VERSION=2021-08-22r0
# 最後に出力されるイメージ名は次のコマンドで利用するので、メモしておきましょう
$ ./gcloud_build_image -s $CLOUD_RUN_HOST -c $ENDPOINTS_VERSION -p $PROJECT_NAME
...
gcr.io/{PROJECT_NAME}/endpoints-runtime-serverless:{ESP_VERSION}-{CLOUD_RUN_HOST}-{ENDPOINTS_VERSION}
# デプロイ済みのESPv2のサービス名を指定します。
$ export CLOUD_RUN_SERVICE_NAME=gateway
$ gcloud run deploy ${CLOUD_RUN_SERVICE_NAME} \ --image="gcr.io/${PROJECT_NAME}/endpoints-runtime-serverless:${ESP_VERSION}-${CLOUD_RUN_HOST}-${ENDPOINTS_VERSION}" \ --allow-unauthenticated \ --set-env-vars=ESPv2_ARGS=--cors_preset=basic \ --platform managed \ --project=${PROJECT_NAME}

ENDPOINTS_VERSIONは、GCPコンソールでEndpointsサービスのページでも確認が可能です。

次が最後になります。

デプロイしたCloudRunとカスタムドメインをマッピングしましょう。

CloudRunのドメインマッピング

最後にESPv2がデプロイされているCloudRunサービスに、test.sample.comのドメインをマッピングします。

1.

GCPのCloudRunのコンソール画面に移動して、上部の「カスタムドメインを管理」をクリックします。

2.

「マッピングを追加」をクリックします。

3.

「マッピングするサービスを選択」で、ESPv2をデプロイしたサービス名を選択します。

「サブドメインを指定」の部分には、Endpointsサービスで指定したhostsの値を入れます。(test.sample.comの場合はtestを記入)

この設定が反映されるまでには少し時間がかかるので、5-10分ほど待ちましょう。

しばらくすると、無事にhttps://test.sample.com/helloに対するGETリクエストが可能になっているはずです。

まとめ

CloudEndpointsにカスタムドメインを設定する方法を紹介しました。

カスタムドメインを設定しない方法と比べて、DNSレコードの登録、OpenApiの設定ファイル内のhostsの設定、CloudRunのドメインマッピングが異なります。

ただ、それだけでカスタムドメインを設定できるので、非常に便利な機能ですよね。

CloudEndpointsでは、カスタムドメイン設定の他に、セキュリティを高めるためにAPIキーの設定とサービスアカウントの設定をおこなうことが一般的です。

また別の記事で、セキュリティを高める方法について紹介しようと思います。