Terraform×Cloud DNSでACM証明書のDNS認証を自動化
はじめに
AWS の Route53 で親ドメインを管理しつつ、特定のサブドメイン(例:sub.example.com)を Google CloudのCloud DNS に委譲する構成は、マルチクラウド環境ではありえるパターンかと思います。
この構成の中で、sub.example.com に対して AWS Certificate Manager(ACM) を使って SSL 証明書を発行したい場合、DNS 認証レコードの登録先が Cloud DNS になるため、Terraform による自動化は工夫が必要です。
本記事では、この構成における SSL 証明書の DNS 検証を Terraform で自動化するサンプルコードを解説します。
使用するTerraformプロバイダの設定
まずは AWS と Google Cloud のプロバイダ設定を行います。
provider "aws" {
alias = "us_east_1"
region = "us-east-1"
}
provider "google" {
credentials = file("path/to/your-service-account.json")
project = "your-gcp-project-id"
region = "us-central1"
}
これによりAWS側とGoogleCloud側のリソースの一元管理が可能になります。
リソースをTerraformで作成
これらのリソースをterraformで定義します。
- ACM証明書本体
- ACMのDNS認証に必要なTXTレコード
#ACM証明書本体
resource "aws_acm_certificate" "certificate" {
provider = aws.us_east_1
domain_name = "*.sub.example.com"
validation_method = "DNS"
validation_option {
domain_name = "*.sub.example.com"
validation_domain = "sub.example.com"
}
}
#ACMのDNS認証に必要なTXTレコード
resource "google_dns_record_set" "acm_validation" {
for_each = {
for validation in aws_acm_certificate.certificate.domain_validation_options : validation.domain_name => {
name = validation.resource_record_name
type = validation.resource_record_type
record = validation.resource_record_value
}
}
name = each.value.name
type = each.value.type
ttl = 300
managed_zone = "example-subdomain-zone" # Cloud DNSのゾーン名
rrdatas = [each.value.record]
}
ポイントとしてはACMの domain_validation_options を動的に解釈してCloud DNSに反映している部分になるかと思います。
このコードをterraform applyするのみで、無事、認証済のレコードがデプロイされました。
まとめ
このterraformコードの強みとしては
- マルチクラウドでもインフラ一元管理が可能
- Terraformの宣言的記述だけで、AWSとGoogleCloudを横断した認証連携が完結
- ACMのDNS認証を完全自動化
になるかと思います。
自動化できるかわからなかった当初は、認証のレコードは手動で管理することになるのか?と思いましたが、認証部分も無事自動化できました。
また、Terraformの宣言的な記述だけで、マルチアカウントかつマルチクラウド環境にまたがるリソース構成を柔軟に扱える点も、 Terraformの強みを改めて実感した次第です。
We're Hiring!
DELTAではチームの一員になっていただける仲間を募集中です!
下記フォームよりお気軽にご連絡ください!
Discussion