Skip to content

Commit 5a350e1

Browse files
committed
feat: custom domain creation script
1 parent 7a4696d commit 5a350e1

1 file changed

Lines changed: 144 additions & 0 deletions

File tree

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# Documentation:
5+
# Creates custom domains on Azure Front Door and outputs DNS records needed
6+
7+
# --- OPTIONS --- #
8+
environmentOptions=("loc" "dev" "prd")
9+
10+
# --- DOMAINS --- #
11+
# Format: "custom-domain:app-code"
12+
# App codes must match appNameOptions in manualFrontdoorSetup.sh
13+
# Example: "example.com:dea" -> creates custom domain for dEuro API
14+
CUSTOM_DOMAINS=(
15+
"example.com:dea"
16+
)
17+
18+
# --- FUNCTIONS --- #
19+
selectOption() {
20+
PS3="${1}: "
21+
shift
22+
options=("$@")
23+
24+
select opt in "${options[@]}" "quit"; do
25+
case "$REPLY" in
26+
*) selection="${opt}"; break ;;
27+
esac
28+
done
29+
30+
if [[ ! $selection || $selection == "quit" ]]; then exit -1; fi
31+
echo "${selection}"
32+
}
33+
34+
# --- MAIN --- #
35+
ENV=$(selectOption "Select Environment" "${environmentOptions[@]}")
36+
37+
# Global variables
38+
COMP_NAME="dfx"
39+
API_NAME="api"
40+
41+
RESOURCE_GROUP="rg-${COMP_NAME}-${API_NAME}-${ENV}"
42+
AFD_PROFILE="afd-${COMP_NAME}-${API_NAME}-${ENV}"
43+
44+
echo "Resource Group: ${RESOURCE_GROUP}"
45+
echo "Frontdoor Profile: ${AFD_PROFILE}"
46+
47+
DNS_RECORDS=""
48+
49+
for entry in "${CUSTOM_DOMAINS[@]}"; do
50+
DOMAIN="${entry%%:*}"
51+
APP="${entry##*:}"
52+
53+
# Generate resource names
54+
AFD_ENDPOINT="fde-${COMP_NAME}-${APP}-${ENV}"
55+
DOMAIN_NAME="${DOMAIN//./-}"
56+
57+
echo ""
58+
echo "Custom Domain: ${DOMAIN}"
59+
echo "Frontdoor Endpoint: ${AFD_ENDPOINT}"
60+
echo "Domain Resource Name: ${DOMAIN_NAME}"
61+
62+
# Get endpoint hostname
63+
ENDPOINT_HOSTNAME=$(az afd endpoint show \
64+
--resource-group "$RESOURCE_GROUP" \
65+
--profile-name "$AFD_PROFILE" \
66+
--endpoint-name "$AFD_ENDPOINT" \
67+
--query "hostName" \
68+
--output tsv)
69+
70+
echo "Endpoint Hostname:"
71+
echo $ENDPOINT_HOSTNAME
72+
73+
# Check if custom domain already exists
74+
EXISTING=$(az afd custom-domain show \
75+
--resource-group "$RESOURCE_GROUP" \
76+
--profile-name "$AFD_PROFILE" \
77+
--custom-domain-name "$DOMAIN_NAME" \
78+
--query "hostName" \
79+
--output tsv 2>/dev/null || echo "")
80+
81+
if [ -n "$EXISTING" ]; then
82+
echo "Custom domain already exists, skipping creation..."
83+
else
84+
# Create the custom domain
85+
az afd custom-domain create \
86+
--resource-group "$RESOURCE_GROUP" \
87+
--profile-name "$AFD_PROFILE" \
88+
--custom-domain-name "$DOMAIN_NAME" \
89+
--host-name "$DOMAIN" \
90+
--certificate-type ManagedCertificate \
91+
--minimum-tls-version TLS12 \
92+
--output none
93+
fi
94+
95+
# Get validation token
96+
VALIDATION_TOKEN=$(az afd custom-domain show \
97+
--resource-group "$RESOURCE_GROUP" \
98+
--profile-name "$AFD_PROFILE" \
99+
--custom-domain-name "$DOMAIN_NAME" \
100+
--query "validationProperties.validationToken" \
101+
--output tsv)
102+
103+
echo "Validation Token:"
104+
echo $VALIDATION_TOKEN
105+
106+
# Collect DNS records for summary
107+
DNS_RECORDS="${DNS_RECORDS}${DOMAIN}|CNAME|${ENDPOINT_HOSTNAME}\n"
108+
DNS_RECORDS="${DNS_RECORDS}_dnsauth.${DOMAIN}|TXT|${VALIDATION_TOKEN}\n\n"
109+
done
110+
111+
echo ""
112+
echo "--- Associating domains with routes ---"
113+
114+
for entry in "${CUSTOM_DOMAINS[@]}"; do
115+
DOMAIN="${entry%%:*}"
116+
APP="${entry##*:}"
117+
AFD_ENDPOINT="fde-${COMP_NAME}-${APP}-${ENV}"
118+
AFD_ROUTE="fdor-${COMP_NAME}-${APP}-${ENV}"
119+
DOMAIN_NAME="${DOMAIN//./-}"
120+
121+
echo ""
122+
echo "Associating ${DOMAIN} with route ${AFD_ROUTE}..."
123+
124+
az afd route update \
125+
--resource-group $RESOURCE_GROUP \
126+
--profile-name $AFD_PROFILE \
127+
--endpoint-name $AFD_ENDPOINT \
128+
--route-name $AFD_ROUTE \
129+
--custom-domains $DOMAIN_NAME
130+
done
131+
132+
echo ""
133+
echo "--- DNS Records to Create ---"
134+
echo ""
135+
printf "%-40s %-8s %s\n" "NAME" "TYPE" "VALUE"
136+
printf "%-40s %-8s %s\n" "---" "----" "-----"
137+
printf "%b" "$DNS_RECORDS" | while IFS='|' read -r name type value; do
138+
if [ -n "$name" ]; then
139+
# Extract subdomain and root domain (assumes 2-part TLD like .com, .ch)
140+
root_domain=$(echo "$name" | awk -F. '{print $(NF-1)"."$NF}')
141+
subdomain=$(echo "$name" | sed "s/\.$root_domain$//")
142+
printf "%-40s %-8s %s\n" "$subdomain (.$root_domain)" "$type" "$value"
143+
fi
144+
done

0 commit comments

Comments
 (0)