resource "aws_route53_zone" "main" { name = "cibello.app" tags = { Name = "cibello-app-zone" } } resource "aws_acm_certificate" "main" { provider = aws.us_east_1 domain_name = "cibello.app" subject_alternative_names = ["www.cibello.app"] validation_method = "DNS" lifecycle { create_before_destroy = true } tags = { Name = "cibello-prod-cert" } } resource "aws_route53_record" "cert_validation" { for_each = { for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } zone_id = aws_route53_zone.main.zone_id name = each.value.name type = each.value.type ttl = 300 records = [each.value.record] } resource "aws_cloudfront_origin_access_control" "web" { name = "cibello-prod-oac" description = "OAC for cibello-web" origin_access_control_origin_type = "s3" signing_behavior = "always" signing_protocol = "sigv4" } resource "aws_s3_bucket_policy" "web" { bucket = aws_s3_bucket.web.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Sid = "AllowCloudFrontOAC" Effect = "Allow" Principal = { Service = "cloudfront.amazonaws.com" } Action = "s3:GetObject" Resource = "${aws_s3_bucket.web.arn}/*" Condition = { StringEquals = { "AWS:SourceArn" = aws_cloudfront_distribution.main.arn } } } ] }) } resource "aws_cloudfront_distribution" "main" { enabled = true is_ipv6_enabled = true default_root_object = "index.html" aliases = ["cibello.app", "www.cibello.app"] origin { domain_name = aws_s3_bucket.web.bucket_regional_domain_name origin_id = "cibello-web" origin_access_control_id = aws_cloudfront_origin_access_control.web.id } default_cache_behavior { allowed_methods = ["GET", "HEAD", "OPTIONS"] cached_methods = ["GET", "HEAD"] target_origin_id = "cibello-web" viewer_protocol_policy = "redirect-to-https" forwarded_values { query_string = false cookies { forward = "none" } } min_ttl = 0 default_ttl = 3600 max_ttl = 86400 } price_class = "PriceClass_100" restrictions { geo_restriction { restriction_type = "none" } } viewer_certificate { acm_certificate_arn = aws_acm_certificate.main.arn ssl_support_method = "sni-only" minimum_protocol_version = "TLSv1.2_2021" } tags = { Name = "cibello-prod-cdn" } } resource "aws_route53_record" "apex" { zone_id = aws_route53_zone.main.zone_id name = "cibello.app" type = "A" alias { name = aws_cloudfront_distribution.main.domain_name zone_id = aws_cloudfront_distribution.main.hosted_zone_id evaluate_target_health = false } } resource "aws_route53_record" "www" { zone_id = aws_route53_zone.main.zone_id name = "www.cibello.app" type = "A" alias { name = aws_cloudfront_distribution.main.domain_name zone_id = aws_cloudfront_distribution.main.hosted_zone_id evaluate_target_health = false } } resource "aws_route53_record" "api" { zone_id = aws_route53_zone.main.zone_id name = "api.cibello.app" type = "A" ttl = 300 records = [aws_eip.app.public_ip] } resource "aws_route53_record" "admin" { zone_id = aws_route53_zone.main.zone_id name = "admin.cibello.app" type = "A" ttl = 300 records = [aws_eip.app.public_ip] } resource "aws_route53_record" "mx" { zone_id = aws_route53_zone.main.zone_id name = "cibello.app" type = "MX" ttl = 300 records = ["10 mail.aamos.systems"] } resource "aws_route53_record" "spf" { zone_id = aws_route53_zone.main.zone_id name = "cibello.app" type = "TXT" ttl = 300 records = ["v=spf1 mx a:mail.aamos.systems ~all"] } resource "aws_route53_record" "dkim" { zone_id = aws_route53_zone.main.zone_id name = "mail._domainkey.cibello.app" type = "TXT" ttl = 300 records = [ "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApUGQRa54rZOOaUWHTnCVXZfXkcXGHxZaYhI2AklP5j5y3jrA/4kiNaxzlxOFthJ2ujomnTZdPs4/V/uQ/xlAQxf7T9X5Vg9Kf7NQtmFii//4q3K2OgGg070aHLeKuDF6YjRjEADBVQBtGVwf9btjvEfhtLsPiWgp2KuxKYGRSWNuXjAZiwf3ON1ehRWm", "wlxSfe8yil93LYi0u+BOAzYhQsI6v8bpmCkR/+GCdbWNZQsbbDDSvUt6z2xBmlzKZQ6TpE6yCbMs6ddsSVLq4OXuL5rVk9+ETbZqsbmy/IB//18Ta/7Hi4QL4WqZbD97To2UlD1TtUwpLDHx/cR+bEgNCQIDAQAB" ] } resource "aws_route53_record" "dmarc" { zone_id = aws_route53_zone.main.zone_id name = "_dmarc.cibello.app" type = "TXT" ttl = 300 records = ["v=DMARC1; p=none; rua=mailto:dmarc@cibello.app"] }