نحوه عیبیابی ایجاد مجدد ناموفق منابع مدیر گواهینامه Google Cloud با Terraform

این یادداشت نحوه رسیدگی به خطای رخ داده در هنگام تلاش برای ایجاد مجدد گواهی در مدیر گواهی Google Cloud را که از طریق Terraform مدیریت میشود، توضیح میدهد.
توجه داشته باشید
این عملیات در یک محیط توسعه انجام شد، بنابراین خرابی در طول فرآیند عیب یابی در نظر گرفته نشد.
نسخه ها
- Terraform: 1.9.8
- hashicorp/google: 6.16.0
هدف
ما می خواستیم دامنه را در گواهی از تغییر دهیم before.com
به after.com
، همانطور که در زیر نشان داده شده است:
locals {
- domain_name = "before.com"
+ domain_name = "after.com"
}
resource "google_certificate_manager_dns_authorization" "example" {
name = "example-dns-authorization"
domain = local.domain_name
}
resource "google_certificate_manager_certificate_map" "example" {
name = "example-certificate-map"
}
resource "google_certificate_manager_certificate" "example" {
name = var.prefix
managed {
domains = [
local.domain_name,
"*.${local.domain_name}"
]
dns_authorizations = [google_certificate_manager_dns_authorization.example.id]
}
}
resource "google_certificate_manager_certificate_map_entry" "example" {
name = "example-certificate-map-entry"
map = google_certificate_manager_certificate_map.example.name
matcher = "PRIMARY"
certificates = [google_certificate_manager_certificate.example.id]
}
جزئیات خطا
با خطای زیر مواجه شدیم:
Error: Error when reading or editing Certificate: googleapi: Error 400: can't delete certificate that is referenced by a CertificateMapEntry or other resources
از آنجایی که تغییر نام دامنه نیاز به حذف و ایجاد مجدد گواهی دارد و گواهی با ورودی نقشه گواهی ارجاع داده می شود، نمی توان آن را همانطور که هست حذف کرد.
راه حل
در زیر روش مورد استفاده برای حل این مشکل آورده شده است.
- هنگام تغییر دامنه، منابع google_certificate_manager_certificate و google_certificate_manager_certificate_map_entry را نظر دهید:
locals {
- domain_name = "before.com"
+ domain_name = "after.com"
}
resource "google_certificate_manager_dns_authorization" "example" {
name = "example-dns-authorization"
domain = local.domain_name
}
resource "google_certificate_manager_certificate_map" "example" {
name = "example-certificate-map"
}
- resource "google_certificate_manager_certificate" "example" {
- name = var.prefix
- managed {
- domains = [
- local.domain_name,
- "*.${local.domain_name}"
- ]
- dns_authorizations = [google_certificate_manager_dns_authorization.example.id]
- }
- }
- resource "google_certificate_manager_certificate_map_entry" "example" {
- name = "example-certificate-map-entry"
- map = google_certificate_manager_certificate_map.example.name
- matcher = "PRIMARY"
- certificates = [google_certificate_manager_certificate.example.id]
- }
+ # resource "google_certificate_manager_certificate" "example" {
+ # name = var.prefix
+ # managed {
+ # domains = [
+ # local.domain_name,
+ # "*.${local.domain_name}"
+ # ]
+ # dns_authorizations = [google_certificate_manager_dns_authorization.example.id]
+ # }
+ # }
+
+ # resource "google_certificate_manager_certificate_map_entry" "example" {
+ # name = "example-certificate-map-entry"
+ # map = google_certificate_manager_certificate_map.example.name
+ # matcher = "PRIMARY"
+ # certificates = [google_certificate_manager_certificate.example.id]
+ # }
پس از انجام این تغییرات، اجرا کنید:
terraform apply
- دو منبع را از نظر خارج کنید:
locals {
domain_name = "after.com"
}
resource "google_certificate_manager_dns_authorization" "example" {
name = "example-dns-authorization"
domain = local.domain_name
}
resource "google_certificate_manager_certificate_map" "example" {
name = "example-certificate-map"
}
- # resource "google_certificate_manager_certificate" "example" {
- # name = var.prefix
- # managed {
- # domains = [
- # local.domain_name,
- # "*.${local.domain_name}"
- # ]
- # dns_authorizations = [google_certificate_manager_dns_authorization.example.id]
- # }
- # }
-
- # resource "google_certificate_manager_certificate_map_entry" "example" {
- # name = "example-certificate-map-entry"
- # map = google_certificate_manager_certificate_map.example.name
- # matcher = "PRIMARY"
- # certificates = [google_certificate_manager_certificate.example.id]
- # }
+ resource "google_certificate_manager_certificate" "example" {
+ name = var.prefix
+ managed {
+ domains = [
+ local.domain_name,
+ "*.${local.domain_name}"
+ ]
+ dns_authorizations = [google_certificate_manager_dns_authorization.example.id]
+ }
+ }
+ resource "google_certificate_manager_certificate_map_entry" "example" {
+ name = "example-certificate-map-entry"
+ map = google_certificate_manager_certificate_map.example.name
+ matcher = "PRIMARY"
+ certificates = [google_certificate_manager_certificate.example.id]
+ }
در نهایت اجرا کنید:
terraform apply
این روش دامنه گواهی را با موفقیت به روز می کند.