hearth/terraform/dns-elastic-ips.tf
Eric Garcia e78000831e Initial commit: Port infrastructure from coherence-mcp
Hearth is the infrastructure home for the letemcook ecosystem.

Ported from coherence-mcp/infra:
- Terraform modules (VPC, EKS, IAM, NLB, S3, storage)
- Kubernetes manifests (Forgejo, ingress, cert-manager, karpenter)
- Deployment scripts (phased rollout)

Status: Not deployed. EKS cluster needs to be provisioned.

Next steps:
1. Bootstrap terraform backend
2. Deploy phase 1 (foundation)
3. Deploy phase 2 (core services including Forgejo)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 06:06:13 -05:00

84 lines
2.8 KiB
HCL

# DNS Elastic IPs for Stable Glue Records
# RFC 0046: Domain Email Migration - Phase 1
#
# Purpose: Allocate static Elastic IPs for the DNS NLB to enable
# stable glue records at GoDaddy for NS delegation.
#
# Architecture:
# - 3 EIPs (one per AZ) for high availability
# - Attached to NLB via subnet_mapping
# - Used as glue records: ns1.domain.com, ns2.domain.com, ns3.domain.com
#
# Cost: ~$0/mo (EIPs attached to running resources are free)
locals {
# Enable static IPs for DNS delegation
enable_dns_static_ips = var.enable_dns_static_ips
# Domains to be delegated from GoDaddy to PowerDNS
managed_domains = [
"superviber.com",
"muffinlabs.ai",
"letemcook.com",
"appbasecamp.com",
"thanksforborrowing.com",
"alignment.coop"
]
}
# Allocate Elastic IPs for DNS NLB (one per AZ)
resource "aws_eip" "dns" {
count = local.enable_dns_static_ips ? length(local.azs) : 0
domain = "vpc"
tags = merge(local.common_tags, {
Name = "${local.name}-dns-${count.index + 1}"
Purpose = "dns-nlb"
RFC = "0046"
Description = "Stable IP for DNS glue records - AZ ${count.index + 1}"
})
lifecycle {
# Prevent accidental deletion - changing these breaks glue records
prevent_destroy = true
}
}
# Output the EIP public IPs for glue record configuration
output "dns_elastic_ips" {
description = "Elastic IP addresses for DNS NLB (use for glue records at GoDaddy)"
value = aws_eip.dns[*].public_ip
}
output "dns_elastic_ip_allocation_ids" {
description = "Elastic IP allocation IDs for NLB subnet_mapping"
value = aws_eip.dns[*].id
}
output "glue_record_instructions" {
description = "Instructions for configuring glue records at GoDaddy"
value = local.enable_dns_static_ips ? join("\n", [
"================================================================================",
"GoDaddy Glue Record Configuration",
"RFC 0046: Domain Email Migration - DNS Delegation",
"================================================================================",
"",
"Domains: ${join(", ", local.managed_domains)}",
"",
"1. Custom Nameservers (set for each domain):",
" - ns1.<domain>",
" - ns2.<domain>",
" - ns3.<domain>",
"",
"2. Glue Records (Host Records):",
" ns1 -> ${try(aws_eip.dns[0].public_ip, "PENDING")}",
" ns2 -> ${try(aws_eip.dns[1].public_ip, "PENDING")}",
" ns3 -> ${try(aws_eip.dns[2].public_ip, "PENDING")}",
"",
"3. Verification Commands:",
" dig @${try(aws_eip.dns[0].public_ip, "PENDING")} superviber.com NS",
" dig @8.8.8.8 superviber.com NS",
"",
"================================================================================"
]) : "DNS static IPs not enabled. Set enable_dns_static_ips = true to allocate EIPs."
}