TerraformとRoute53でApp Runnerのカスタムドメインを設定する方法

TerraformとRoute53でApp Runnerのカスタムドメインを設定する方法

こんにちは!@Ryo54388667です!☺️


普段は都内でエンジニアとして業務をしてます!

主にTypeScriptやNext.jsといった技術を触っています。

今回はTerraformでApp RunnerのDNSターゲットをRoute53のAレコードに設定する方法を紹介していきます!


行いたいこと

#

App Runnerはデフォルトドメインを発行してくれるので、デプロイさえ終えれば自動的にWeb上に公開することができます!ドチャクソ便利ですよね!ただ、デフォルトではなくカスタムドメインを利用したいケースがほとんどだと思います。もちろん、App Runnerにはカスタムドメイン機能もサポートしています。

https://aws.amazon.com/jp/apprunner/



画像のような値を対象のレコードに設定すればカスタムドメインを設定できます。


このレコードの設定に関して、もちろんAWS マネジメントコンソール上で設定することもできますが、IaCを利用する事例も増えているように感じますので、今回はIaCの一つであるTerraformを利用して設定していきます。


前提条件

  • AWS CLIの設定済み
  • Terraformの環境構築済み
  • Route53のホストゾーンの設定済み

実装について

#

先ほどの画像の「証明書の検証」(1.の箇所)をCNAMEを設定します。

resource "aws_route53_record" "cname_validation_a" { name = var.cert_validation_record_name_a zone_id = aws_route53_zone.main_prd.zone_id type = "CNAME" ttl = 300 records = [var.cert_validation_record_value_a] depends_on = [aws_apprunner_service.apprunner] } resource "aws_route53_record" "cname_validation_b" { name = var.cert_validation_record_name_b zone_id = aws_route53_zone.main_prd.zone_id type = "CNAME" ttl = 300 records = [var.cert_validation_record_value_b] depends_on = [aws_apprunner_service.apprunner] } resource "aws_route53_record" "cname_validation_c" { name = var.cert_validation_record_name_c zone_id = aws_route53_zone.main_prd.zone_id type = "CNAME" ttl = 300 records = [var.cert_validation_record_value_c] depends_on = [aws_apprunner_service.apprunner] }

CNAMEレコードの設定は特段問題なく設定できると思います。

いくつかつまづきポイントがあるのは「DNSターゲットを設定する(2.の箇所)」です。


僕はこのDNSターゲットの箇所でつまずきました😇はじめは、「ここも同様にCNAMEレコードで登録すればええんやろー」と思っていたのですが、下記のエラーが出ました。。

Error: creating Route 53 Record: InvalidChangeBatch: [RRSet of type CNAME with DNS name <ドメイン名> is not permitted at apex in zone <ドメイン名>]

このエラーはCNAMEの仕様上、同様のドメイン名のNSレコードが存在する場合、同一ゾーンには共存できないらしいです。。


https://blog.serverworks.co.jp/dns-cname-record-error


僕は外部のドメインサービスを利用するために、同様の名前のNSレコードを設定していました。このため、エラーが起きました。

DNSターゲットはAレコードでも設定できるので、CNAMEではなく、その方法で設定していきます。多くの記事では下記のようなexampleで書かれています。

//例 resource "aws_route53_record" "www" { zone_id = aws_route53_zone.primary.zone_id name = "example.com" type = "A" alias { name = aws_elb.main.dns_name zone_id = aws_elb.main.zone_id evaluate_target_health = true } }

ここでzone_idが2つあることがわかります。2つ目のzone_idはdnsが存在するゾーンのidを表しています。今回、App Runnerで言えば、App Runnerのデフォルトドメインが存在するホストゾーンのidを設定する必要があります。とはいえ、「そんなものわかるんか。。」と思ったのですが、ありがたいことに公開されていました👏詳しくは下記のURL。

https://docs.aws.amazon.com/general/latest/gr/apprunner.html

2024/06/15現在

ap-northeast-1の場合、Z08491812XW6IPYLR6CCA


それを踏まえて、下記のようにAレコードを設定しました。

resource "aws_route53_record" "dns_a_record" { name = var.dns_record_name zone_id = aws_route53_zone.main_prd.zone_id type = "A" alias { name = var.dns_record_value # NOTE: 参照 https://docs.aws.amazon.com/general/latest/gr/apprunner.html zone_id = "Z08491812XW6IPYLR6CCA" evaluate_target_health = false } depends_on = [aws_apprunner_service.apprunner] }


より良い方法があれば教えてください〜

最後まで読んでいただきありがとうございます!

気ままにつぶやいているので、気軽にフォローをお願いします!🥺




GitHub
修正をリクエストする