Google Cloud Run でカスタム ドメインマッピングのチュートリアルをやってみた

はじめに

Google Cloud Run でカスタム ドメインマッピングの設定方法を理解するため、以下のチュートリアルをやってみた。

カスタム ドメインマッピングを設定するには、Cloud Run のサービスも必要なので、以下のチュートリアルを合わせて行っている。

マッピング先のドメインは、20230111.i-chi-li.info とする。

チュートリアルを実施している様子を、YouTube にアップロードした。

利用 API

  • Cloud Run API
  • Artifact Registry API
  • Cloud Build API

事前準備

Google Cloud にプロジェクトを作成済みとする。
gcloud コマンドが利用可能とする。
go 言語をインストール済みとする。
git コマンドが利用可能とする。
gcloud コマンドは、以下の設定をしていること。 YOUR_PROJECT_ID は、プロジェクト ID に置換すること。
gcloud config set project YOUR_PROJECT_ID
gcloud config set artifacts/location asia-northeast1
gcloud config set run/region asia-northeast1
作業用の任意のディレクトリを作成済みとする。ここでは、D:\tmp\tutorials とする。

チュートリアル実施


利用 API を有効化する

Cloud コンソールで有効化するか、以下のように gcloud コマンドを実行する。
gcloud services enable run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com

サンプル アプリケーションを作成する


ディレクトリを作成する

mkdir golang-samples
cd golang-samples

go モジュールを宣言する

go mod init github.com/i-chi-li/golang-samples
コマンドを実行すると、カレントディレクトリに go.mod ファイルが作成される。

main.go ファイルを作成する

カレントディレクトリに main.go ファイルを以下の内容で作成する。
// Sample run-helloworld is a minimal Cloud Run service.
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	log.Print("starting server...")
	http.HandleFunc("/", handler)

	// Determine port for HTTP service.
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("defaulting to port %s", port)
	}

	// Start HTTP server.
	log.Printf("listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	name := os.Getenv("NAME")
	if name == "" {
		name = "World"
	}
	fmt.Fprintf(w, "Hello %s!\n", name)
}

サンプル アプリケーションを Cloud Run にデプロイする

gcloud run deploy
各種問い合わせには以下のように回答する。 「Allow unauthenticated invocations」行の問い合わせには、y を選択する。
Source code location (D:\tmp\tutorials\golang-samples): (そのまま Enter)
Service name (golang-samples): (そのまま Enter)
Do you want to continue (Y/n)? (そのまま Enter)
Allow unauthenticated invocations to [golang-samples] (y/N)?  y

Cloud Run のドメイン マッピングを設定する

マッピングの前に、ドメインの所有権を証明する必要がある。
ここでは、新規に証明する前提とする。
証明する方法はいくつかあるが、ここでは、ドメインホストに TXT レコードを追加する方法を利用する前提とする。

Cloud コンソールで、「ナビゲーションメニュー」→「Cloud Run」をクリックする。
画面上部の「カスタム ドメインを管理」をクリックする。
画面上部の「マッピングを追加」をクリックすると「マッピングを追加」ダイアログが開く。
マッピングするサービスを選択する。ここでは、golang-samples を選択する。

所有権を証明済みの他ドメインが存在する場合は、確認済みのドメインを選択となる。
「Verify a new domain...」を選択した場合、「検証するベースドメイン」の選択項目が表示される。

所有権を証明済みの他ドメインが存在しない場合は、検証するベースドメインの入力項目が表示される。

検証するベースドメインを入力する。ここでは、「20230111.i-chi-li.info」とする。

「続行」をクリックする。

「ドメインの所有権確認を実行中です。変更が反映されるまでに数分かかる場合があります。確認手順が終了したら更新するか、Webmaster Central  に移動して手順を確認してください。」と表示される。
その下の「ウェブマスター セントラルで確認」をクリックすると、別ウィンドウで、ウェブマスター セントラル画面が開く。

ウェブマスター セントラル画面では、ベースドメインの所有権を証明する設定方法を確認できる。
「ドメイン レジストラまたはプロバイダを選択」ドロップダウンで、該当する項目を選択する。
ここでは、AWS の Route53 に設定する前提とするが、選択肢にないため、「その他」を選択する。
以下のような形式の文字列を、TXT レコードに設定する。
「google-site-verification=n5Gcyxxxxxxxxxxxxxxxxxxx」
レコード名が同一の TXT には、メールの SPF 用の値などと合わせて、複数の値を設定できる。
Route53 での設定方法は、「Route 53のTXTレコードに複数値を登録できますか?への対処法」を参照。その他のドメイン レジストラについては、それぞれの設定方法を確認すること。
ここでは、レコード名「20230111.i-chi-li.info」、レコードタイプ「TXT」、値「"google-site-verification=n5Gcyxxxxxxxxxxxxxxxxxxx"」を登録する。

ウェブマスター セントラル画面の「確認」をクリックする。

所有権の確認ができた後、Cloud Run の「マッピングを追加」画面に戻り、「確認」をクリックする。
「確認済みドメインを選択」ドロップダウンに、所有権の確認ができたベースドメインが設定される。
「サブドメインを指定」にマッピングしたいドメイン名を設定する。
空欄にすると、ベースドメインにマッピングできる。ここでは、空欄とする。
「続行」をクリックする。

しばらくすると、A および、AAAA レコードが表示されるので、マッピングしたいドメイン名(ここでは、「20230111.i-chi-li.info」)で DNS に登録する。
「OK」をクリックする。

10 分程度で、マッピングが完了する。
Cloud Run のインスタンスに接続できるようになるまでは、さらに 10 分程度かかる。

接続確認

ブラウザなどで、マッピングした URL (ここでは、https://20230111.i-chi-li.info)にアクセスする。
レスポンスに「Hello World!」と表示されれば、正常に設定されている。

後片付け

DNS レコードを削除する

上記手順で登録した TXT、A、AAAA レコードを DNS から削除する。

ウェブマスター セントラルで所有権を確認できたドメインを削除する

ウェブマスター セントラル 画面で、対象のドメインをクリックする。
詳細画面の「確認済みサイト所有者」一覧の処理項目にある「未確認にする」をクリックする。
ダイアログ画面で、「未確認にする」をクリックする。

Cloud Run のドメイン マッピングを削除する

Cloud コンソールで、「ナビゲーションメニュー」→「Cloud Run」をクリックする。
画面上部の「カスタム ドメインを管理」をクリックする。
マッピング先が、「golang-samples」がとなっている行を選択して、上部の「削除」をクリックする。
表示されたダイアログで、「削除」をクリックする。
しばらくすると削除される。

サンプル アプリケーションを Cloud Run から削除する

gcloud run services delete golang-samples

Artifact Registry のリポジトリを削除する

gcloud artifacts repositories delete cloud-run-source-deploy

Cloud Storage のバケットを削除する

以下のコマンドを実行すると、バケットの中身および、バケット自身も削除される。
YOUR_PROJECT_ID の部分をプロジェクト ID に変更すること。
gcloud storage rm --recursive gs://YOUR_PROJECT_ID_cloudbuild/

API を無効化する

gcloud services disable --force run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com