Cloud Run functions × TypeScript 開発をしよう！【発展編：Cloud Endpointsで Cloud Run functions に独自ドメインを設定する】

# はじめに
この記事では以下のことについて説明しています。
- Cloud Endpointsで独自ドメインを設定する方法
- 独自ドメインの設定方法

（もうここからほぼ Cloud Run functions × TypeScript 開発のタイトルと関係ないやん、みたいなことを話していきます。まぁ側（ガワ）の話ではありますが関係はあるかなと思っておりますので...）

---


以下の記事の続きに該当します。

https://qiita.com/KyongminS/items/583f27fdb10f1bf6617b

上記の記事では公式のやり方になぞって、事前に ESPv2 Cloud Run サービス を gcloud で作成して Terraform の管理化にして...と結構回りくどいことを行なっています。
カスタムドメインを使うとその手順が一気に省けるので結構ラクです。あと自動で生成されるドメインだとテンション上がらないですしね。


簡単にやることを説明します。

- カスタムドメインの用意（お名前.comで既に取得済みである想定）
- Search Consoleでドメインの所有権を確認できるようにする
- Terraform の `local.domain` の修正
- Terraform にドメインマッピングのリソースを追加
- DNS設定の実施

ドメインの用意についての説明は省略します。

# Search Consoleでドメインの所有権を確認できるようにする
以下のサイトでカスタムドメインを入力します。

https://search.google.com/search-console/welcome?hl=ja

注意ですが、ここで入力するアカウントがGCPのアカウントと同じものになっているか確認してください！

![スクリーンショット 2024-12-23 1.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/3980542a-bd52-2deb-a141-c33481e2ee74.png)


ドメインを入力すると、以下のように TXTレコードが出力されます。このTXTレコードを登録するカスタムドメインを所有するドメインサービスでDNS登録した後に「確認」を押します。

![スクリーンショット 2024-12-23 1.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/13e4846e-1f47-0178-f070-629ef8c1f7d5.png)

以下のように緑っぽい画面が出ればOKです。

![スクリーンショット 2024-12-23 1.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/b3984299-bdd1-86e3-d75a-3f19258e4557.png)


# Terraform の `local.domain` の修正

本記事で作成した `openapi-functions.yml` は Terraform リソースで動的に書き替えるよう実装してあるので、その Terraform の該当部分だけ修正すれば良いです。

```tf: locals.domain の書き換え
locals {
  project         = "advent-calendar-2024-w"
  region          = "asia-northeast1"
  zone            = "asia-northeast1-a"
  domain          = "独自ドメインに書き換え"
  ESPv2_image_ver = "2.51.0"
}
```

# Terraformにドメインマッピングのリソースを追加
以下のリソースを追加しましょう。
```tf: ドメインマッピングに関するリソース
resource "google_cloud_run_domain_mapping" "default" {
  location = local.region
  name     = local.domain

  metadata {
    namespace = local.project
  }

  spec {
    route_name = google_cloud_run_v2_service.gateway.name
  }
}
```

ここまで終わったら `terraform apply` しましょう。

```bash
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

function_uri = "https://xxx.a.run.app"
gateway_uri = "https://yyy.a.run.app"
```

# DNS設定の実施

そして Cloud Run サービスのページに行き「カスタムドメインを管理」のページに行きましょう。

![スクリーンショット 2024-12-23 1.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/37234ef4-e607-ca2a-e8a5-7a8299275a7d.png)

すると **カスタムドメインがSSL証明書のプロビジョニング待ち** のステータスになっています。こ操作の列の三点リーダをクリックします。

![スクリーンショット 2024-12-23 1.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/045082d1-046f-47f6-1a15-9a9a8b0b3b43.png)

「DNSレコード」をクリックすると、以下のようにDNSレコードが表示されます。

![スクリーンショット 2024-12-23 1.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/c0a79c22-be21-0bc2-749d-c79d4bc8c2bd.png)

これを各々ドメインを管理しているサービスで、表示された8つのDNSレコードの登録を行います。登録後15分ぐらい待つと、プロビジョニングが完了して緑のステータスになります。

![スクリーンショット 2024-12-23 1.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/15b03c46-49e5-c1b2-41c3-1f3c2f635882.png)

# APIを呼び出す
緑マークになってすぐはリクエストがまだ通らない状態です。20分くらい待ってリクエストしてみましょう。

```bash
curl -H 'x-api-key: APIキー' https://カスタムドメイン/hello
```

すると以下のようなメッセージが出ます。

```js
{
    "code": 403,
    "message": "PERMISSION_DENIED: API api.tenkawa-k.com is not enabled for the project."
}
```

あら？そういえば APIキー を使えるエンドポイントの制限を変えていませんでしたね。と言うことで変更しましょう。

対象のAPIキーのIDを確認します。

```bash
gcloud services api-keys list
```

カスタムドメインに対してAPIキーを有効にします。

```bash
gcloud services api-keys update APIキーのID --api-target=service=カスタムドメイン名
```

実行後すぐには反映されないので、15分くらい待ってから呼び出してみましょう。

```bash
$ curl -H "x-api-key:APIキー" https://カスタムドメイン名/hello
Hello, World!
```

無事、呼び出すことができました。

### 参考

https://cloud.google.com/run/docs/mapping-custom-domains?hl=ja#dns_update

# おまけ

APIキーのリソースは Terraform 管理もできます。やってみましょう。

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/apikeys_key

# トラブルシューティング
### PERMISSION_DENIED: API ドメイン名 is not enabled for the project

以下を実行してあげましょう。
```bash
gcloud services enable カスタムドメイン名
```