【GCP】Terraform で Cloud Run にカスタムドメインをマッピング

Terraform で Cloud Run にカスタムドメインをマッピングしました。
全て手動で実施する場合は、[公式ドキュメント](https://cloud.google.com/run/docs/mapping-custom-domains)に手順が記載されています。

## 全体の流れ
全体的に手動での対応が多くなりますが、DNS設定は仕方ない。

* ドメインの認証（手動）
* ドメインの所有者を追加（手動）
* ドメインマッピング（Terraform）
* DNSレコード追加（手動）

## ドメインの認証
Cloud Run のカスタムドメインの設定画面より、マッピングを追加。
マッピング自体は Terraform より実施するため、ここではドメイン検証のみ実施。
![Cloud Run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/3080aae8-4099-87d1-b75a-b997f8f12ad5.png)

マッピングしたい Cloud Run のサービス名を選択し、新規ドメインの検証を行う。
マッピングしたいドメインがサブドメイン (api.example.com) を持つ場合は、親ドメイン (example.com) で検証する。
(ドキュメントに明記はされていないが、`example.com` と `*.example.com`の証明書を取得しているっぽい)

<img width="500" alt="7ylyT061TET.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/0a70a43f-ece3-d1c1-ea1b-8989a069b4b5.png">

ウェブマスターセントラルで確認。
<img width="500" alt="7yLygoetSVE2-.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/9c2812d0-68b4-d294-9b23-92bdd61ac205.png">

ドメイン名プロバイダを選択し、出力された文字列を、DNS の TXTレコードに追加。
追加が完了したら、確認ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/d0701b02-d258-1dfa-7bc4-4eb71de65703.png)

正常に完了すると次のような画面が表示される。
次のステップのために、`<ドメイン名>に所有者を追加`をクリック。
![PastedGraphic6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/83496a90-71c3-45eb-8db6-386507824cb6.png)

## ドメインの所有者を追加
GitHub Actions などで CICD を組んでいるなら、ドメイン認証を行ったユーザとは別に専用のサービスアカウントを持つケースがある。この場合は、サイト所有者を追加しなければ次のように、ドメイン未検証のエラーが返される。

```
Error: Error waiting to create DomainMapping: resource is in failed state "Ready:False", message: Caller is not authorized to administer the domain 'XXX.XXX.jp'. If you own 'XXX.XXX.jp', you can obtain authorization by verifying ownership of the domain, or any of its parent domains, via the Webmaster Central portal: https://www.google.com/webmasters/verification/verification?domain=XXX.XXX.jp. We recommend verifying ownership of the largest scope you wish to use with subdomains (eg. verify 'example.com' if you wish to map 'subdomain.example.com').
```


ドキュメントにもバッチリ書いてありますが、気付くまでに時間がかかった。
>ユーザーがドメインを検証すると、そのユーザーのアカウントに対してのみドメインの検証が行われます。つまり、ドメイン マッピングを追加できるのは、そのドメインを使用しているユーザーだけです。他のユーザーがドメインを使用するマッピングを追加できるようにするには、ユーザーを確認済みのオーナーとして追加する必要があります。
https://cloud.google.com/run/docs/mapping-custom-domains#adding_verified_domain_owners_to_other_users_or_service_accounts


サイト所有者にCICD用のサービスアカウントのメールアドレスを追加する。
![HERBAW+OIPA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/9519137e-be22-0ca5-48ac-b00fc93aecb9.png)
￼
## ドメインマッピング
[公式ドキュメント](https://registry.terraform.io/providers/hashicorp/google/3.67.0/docs/resources/cloud_run_domain_mapping)を元にTerraform でリソースを追加。



```main.tf
resource "google_cloud_run_domain_mapping" "domain-mapping" {
  location = "asia-northeast1"
  name     = var.custom_domain ## 検証済みのドメイン名

  metadata {
    namespace = var.project_id ## GCP のプロジェクト ID
  }

  spec {
    route_name = google_cloud_run_service.cloudrun.name ## マッピングさせたい Cloud Run
  }
}
```

完了するとドメインマッピングの画面に新しいドメインが表示される。
![Cloud Run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/ac141abc-3e3e-c4e1-fdc6-a1d45a8843f1.png)
￼

## DNSレコード追加

ドメインマッピングの操作ボタンから DNS レコードを表示する。
![DNS VZ-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/a5076d3a-fde3-a612-3da3-d6bbc73847ed.png)

DNS にレコードを登録し、しばらくすると緑色のチェックボタンが表示される。
![Cloud Run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/83ca2c2d-22c6-a660-d845-eb86c6bcac4b.png)

これでマッピングしたドメインから Cloud Run のサービスにアクセスが可能となる。