
オンライン通信のセキュリティとプライバシーの確保が不可欠となった現在、SSL証明書は安全な接続の確立、機密データの保護、そしてユーザーとWebサイト間の信頼関係の構築において欠かせない役割を担っています。
Google Cloud Platform (GCP) でロードバランサー向けにSSL証明書を設定する際、ドメイン所有権の検証は重要なポイントになります。従来は、ロードバランサーベースの認可が一般的な方法でした。これは、Googleマネージド SSL証明書をロードバランサーに割り当て、AレコードでドメインをロードバランサーのIPに紐付ける方式です。
ただし、ロードバランサーベースの認可によるマネージドSSL証明書のセットアップには、時間がかかりミスも起こりやすいという課題があります。第一に、TLS(SSL)証明書のプロビジョニング前に、すべての構成手順を完了させる必要があります。途中で誤りや漏れがあると、その分遅延が発生します。第二に、グローバルなDNSレコードの伝播には最大48時間かかる場合があります。その結果、SSL証明書のドメインにアクセスできない時間帯が通常10〜15分発生します。そのため、この方法は本番トラフィックが流れていない新規環境のセットアップに最も適しています。
こうした課題を解消し、ロードバランサーの構築前や他ベンダーからGoogle Cloudへの移行前にGoogleマネージド証明書を準備しておくための代替手段が、ドメイン認可です。ドメイン認可では、専用のDNSレコードを追加してドメイン所有権を検証します。これにより、ターゲットプロキシがネットワークトラフィックを処理できる状態になる前から、証明書を事前にプロビジョニングできます。その結果、サードパーティ製ソリューションからGoogle Cloudへのダウンタイムゼロ移行が可能となり、よりスムーズな移行を実現できます。
ロードバランサー認可とドメイン認可の違いは、以下の表をご覧ください。

本記事では、ドメイン認可のセットアップ方法と、これを使ってCertificate Managerで新しい証明書を作成する手順を解説します。
前提条件
- Cloud DNSのパブリックDNSゾーン
ドメイン認可は、他のDNSプロバイダーや でも利用可能です。
- GCPプロジェクトでCertificate Manager APIが有効化されていること
- gcloud CLI
本記事では、Cloud DNSのパブリックゾーン chimbuc.dns.doit-playground.com を使用します。

DNS認可のセットアップ
- 必要な環境変数を設定します。
export PROJECT_ID="your-project-id"export REGION="your-region" # ex: us-central1export DOMAIN_NAME="domain-name-for-the-certificate" # ex: example.chimbuc.dns.doit-playground.comexport DOMAIN_AUTHORIZATION_NAME="dns-authorization-resource-name" # ex: dns-authorization-exampleexport CLOUD_DNS_ZONE_NAME="your-cloud-dns-zone" # ex: chimbuc.dns.doit-playground.com.export CERTIFICATE_NAME="certificate-manager-cert-name" # ex: example-chimbuc-dns-doit-playground-comexport CERTIFICATE_MAP_NAME="certificate-map-name" # ex: example-dns-authorization-cert-mapexport CERTIFICATE_MAP_ENTRY_NAME="certificate-map-entry" # ex: example-dns-authorization-cert-map-entry- ドメイン用のDNS認可を作成します。1つのDNS認可は単一のホスト名のみを対象とするため、対象の証明書で使用したいホスト名ごとにDNS認可を作成する必要があります。
*.example.com のようなワイルドカード証明書のDNS認可を作成する場合は、親ドメイン( example.com など)に対してDNS認可を構成します。
gcloud certificate-manager dns-authorizations create $DOMAIN_AUTHORIZATION_NAME \ --domain="${DOMAIN_NAME}" \ --project $PROJECT_ID
example.chimbuc.dns.doit-playground.com に対するDNS認可
- DNS構成に追加するCNAMEレコードの詳細を取得します。
gcloud certificate-manager dns-authorizations describe $DOMAIN_AUTHORIZATION_NAME \ --project $PROJECT_ID
example.chimbuc.dns.doit-playground.com のDNS認可詳細
- CNAMEレコードをDNS構成に追加します。Google CloudでDNSを管理している場合は本セクションの手順に従ってください。それ以外の場合は、ご利用のサードパーティ製DNSソリューションのドキュメントを参照してください。
#Initiate the DNS record transactiongcloud dns record-sets transaction start --zone="${CLOUD_DNS_ZONE_NAME}" \ --project $PROJECT_ID
#Add the CNAME record to the target DNS zonegcloud dns record-sets transaction add CNAME_RECORD_DATA \ --name="_acme-challenge.${DOMAIN_NAME}." \ --ttl="30" \ --type="CNAME" \ --zone="${CLOUD_DNS_ZONE_NAME}" \ --project $PROJECT_ID
#Execute the DNS record transaction to save your changesgcloud dns record-sets transaction execute --zone="${CLOUD_DNS_ZONE_NAME}" \ --project $PROJECT_ID
DNS構成
DNS認可を使ったGoogleマネージド証明書の作成
- DNS認可を構成したドメイン向けに証明書を作成します。Googleマネージド証明書はグローバルロケーションでのみ作成可能です。
gcloud certificate-manager certificates create $CERTIFICATE_NAME \ --domains="${DOMAIN_NAME}" \ --dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \ --project $PROJECT_ID

証明書のプロビジョニングには数分かかります。完了するとステータスがactiveに変わります。Pendingのまま長く変化がない場合は、証明書名をクリックして失敗の理由を確認してください。
- 証明書のステータスを確認します。
gcloud certificate-manager certificates describe $CERTIFICATE_NAME --project $PROJECT_ID

作成した証明書をロードバランサーにデプロイするには、ホスト名ごとに証明書を割り当てる1つ以上の証明書マップエントリを参照する証明書マップを作成する必要があります。詳しくはHow Certificate Manager Worksをご覧ください。
- 証明書マップを作成します。
gcloud certificate-manager maps create $CERTIFICATE_MAP_NAME --project $PROJECT_ID
証明書マップ
- ドメイン用の証明書マップエントリを作成します。
gcloud certificate-manager maps entries create $CERTIFICATE_MAP_ENTRY_NAME \ --map="${CERTIFICATE_MAP_NAME}" \ --certificates="${CERTIFICATE_NAME}" \ --hostname="${DOMAIN_NAME}" \ --project $PROJECT_ID
証明書マップエントリ
証明書マップエントリのプロビジョニングには数分かかり、完了するとステータスがactiveに変わります。
gcloud certificate-manager maps entries describe $CERTIFICATE_MAP_ENTRY_NAME \ --map="${CERTIFICATE_MAP_NAME}" \ --project $PROJECT_ID
サンプルアプリケーションのデプロイ
- マネージドインスタンスグループを作成し、Apacheをインストールします。
#Create an instance template.gcloud compute instance-templates create web-app-instance-template \ --region=$REGION \ --project $PROJECT_ID \ --network=default \ --subnet=default \ --tags=allow-health-check \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
#Create the managed instance group based on the template.
gcloud compute instance-groups managed create web-app-instance-group \ --template=web-app-instance-template \ --size=1 \ --zone="${REGION}"-b \ --project $PROJECT_ID
#Add a named port to the instance group
gcloud compute instance-groups set-named-ports web-app-instance-group \ --named-ports http:80 \ --zone "${REGION}"-b \ --project $PROJECT_ID- Google Cloudのヘルスチェックシステムからのトラフィックを許可するファイアウォールルールを作成します。
gcloud compute firewall-rules create fw-allow-health-check \ --network=default \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp:80 \ --project $PROJECT_ID
サンプルインスタンス
証明書をロードバランサーへデプロイ
- ロードバランサーのリソースを作成します。
#Reserve an external ipgcloud compute addresses create external-lb-ipv4 \ --ip-version=IPV4 \ --network-tier=PREMIUM \ --global \ --project $PROJECT_ID
#Create a health checkgcloud compute health-checks create http http-basic-check \ --port 80 \ --project $PROJECT_ID
#Create a backend servicegcloud compute backend-services create web-app-backend-service \ --load-balancing-scheme=EXTERNAL \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global \ --project $PROJECT_ID
#Add the instance group as the backend to the backend service.gcloud compute backend-services add-backend web-app-backend-service \ --instance-group=web-app-instance-group \ --instance-group-zone="${REGION}"-b \ --global \ --project $PROJECT_ID
#create a URL map to route the incoming requests to the default backend servicegcloud compute url-maps create web-app-url-map-https \ --default-service web-app-backend-service \ --project $PROJECT_ID- URLマップへリクエストをルーティングするターゲットHTTPSプロキシを作成し、証明書マップをターゲットプロキシに紐付けます。
gcloud compute target-https-proxies create https-lb-proxy \ --url-map=web-app-url-map-https \ --certificate-map="${CERTIFICATE_MAP_NAME}" \ --project $PROJECT_ID
ターゲットHTTPSプロキシに証明書が紐付けられた状態
- 受信リクエストをプロキシへルーティングするグローバル転送ルールを作成します。
gcloud compute forwarding-rules create web-app-https-fw-rule \ --load-balancing-scheme=EXTERNAL \ --network-tier=PREMIUM \ --address=external-lb-ipv4 \ --global \ --target-https-proxy=https-lb-proxy \ --ports=443 \ --project $PROJECT_ID
外部LBの構成
- Cloud DNSにドメイン用のレコードセットを作成し、エンドポイントへアクセスします。

example.chimbuc.dns.doit-playground.com のAレコード

Google Cloud Platform (GCP) でドメイン認可を活用すれば、従来のロードバランサーベースの認可方式に比べて、SSL証明書のプロビジョニング速度を大幅に高められます。本記事で解説した手順に沿って進めれば、ドメイン認可のセットアップ、新しいTLS証明書の作成、そしてGCP環境のセキュリティ強化を効率的に実現できます。ダウンタイムを最小限に抑え、よりスムーズな移行を可能にするアプローチです。