@@ -62,12 +62,11 @@ func generateCert(ctx context.Context, domain, albDns string) {
62
62
term .Infof ("Waiting for TLS cert to be online for %v" , domain )
63
63
if err := waitForTLS (ctx , domain ); err != nil {
64
64
term .Errorf ("Error waiting for TLS to be online: %v" , err )
65
- // FIXME: The message below is only valid for BYOC, need to update when playground ACME cert support is added
66
- term .Errorf ("Please check for error messages from `/aws/lambda/acme-lambda` log group in cloudwatch for more details" )
65
+ // FIXME: Add more info on how to debug, possibly provided by the server side to avoid client type detection here
67
66
return
68
67
}
69
68
70
- term . Infof ("TLS cert for %v is ready" , domain )
69
+ fmt . Printf ("TLS cert for %v is ready\n " , domain )
71
70
}
72
71
73
72
func triggerCertGeneration (ctx context.Context , domain string ) {
@@ -141,12 +140,13 @@ func waitForCNAME(ctx context.Context, domain, albDns string) error {
141
140
case <- ctx .Done ():
142
141
return ctx .Err ()
143
142
case <- ticker .C :
144
- cname , err := resolver . LookupCNAME (ctx , domain )
143
+ cname , err := waitForCNAMEInSync (ctx , domain )
145
144
cname = strings .TrimSuffix (cname , "." )
146
145
if err != nil || strings .ToLower (cname ) != strings .ToLower (albDns ) {
147
146
if ! msgShown {
148
- term .Infof ("Please setup CNAME record for %v to point to ALB %v, waiting for CNAME record setup and DNS propagation" , domain , strings .ToLower (albDns ))
149
- term .Infof ("Note: DNS propagation may take a while, we will proceed as soon as the CNAME record is ready, checking..." )
147
+ term .Infof ("Please setup CNAME record for %v" , domain )
148
+ fmt .Printf (" %v CNAME %v\n " , domain , strings .ToLower (albDns ))
149
+ term .Infof ("Waiting for CNAME record setup and DNS propagation..." )
150
150
msgShown = true
151
151
}
152
152
if doSpinner {
@@ -185,3 +185,71 @@ func getWithRetries(ctx context.Context, url string, tries int) error {
185
185
}
186
186
return errors .Join (errs ... )
187
187
}
188
+
189
+ func waitForCNAMEInSync (ctx context.Context , domain string ) (string , error ) {
190
+ ns , err := getNSServers (ctx , domain )
191
+ if err != nil {
192
+ return "" , err
193
+ }
194
+
195
+ ticker := time .NewTicker (1 * time .Second )
196
+ defer ticker .Stop ()
197
+ for {
198
+ select {
199
+ case <- ticker .C :
200
+ fmt .Printf ("Checking CNAME for %v\n " , domain )
201
+ cnames := make (map [string ]bool )
202
+ var cname string
203
+ var err error
204
+ for _ , n := range ns {
205
+ cname , err = resolverAt (n ).LookupCNAME (context .Background (), domain )
206
+ if err != nil {
207
+ cnames ["" ] = true
208
+ }
209
+ cnames [cname ] = true
210
+ }
211
+ if len (cnames ) > 1 {
212
+ fmt .Printf ("CNAME mismatch for %v: %v\n " , domain , cnames )
213
+ continue
214
+ }
215
+ return cname , err
216
+ case <- ctx .Done ():
217
+ return "" , ctx .Err ()
218
+ }
219
+ }
220
+ }
221
+
222
+ func getNSServers (ctx context.Context , domain string ) ([]string , error ) {
223
+ d := domain
224
+ var ns []* net.NS
225
+ for {
226
+ var err error
227
+ ns , err = resolver .LookupNS (ctx , d )
228
+ var ne * net.DNSError
229
+ if errors .As (err , & ne ) {
230
+ if strings .Count (d , "." ) <= 1 {
231
+ return nil , fmt .Errorf ("No DNS server found" )
232
+ }
233
+ d = d [strings .Index (domain , "." )+ 1 :]
234
+ continue
235
+ } else if err != nil {
236
+ fmt .Printf ("Failed to find NS server for %v at %v: %v" , domain , d , err )
237
+ }
238
+ break
239
+ }
240
+ servers := make ([]string , len (ns ))
241
+ for i , n := range ns {
242
+ servers [i ] = n .Host
243
+ }
244
+ return servers , nil
245
+ }
246
+
247
+ func resolverAt (nsServer string ) * net.Resolver {
248
+ return & net.Resolver {
249
+ PreferGo : true ,
250
+ Dial : func (ctx context.Context , network , address string ) (net.Conn , error ) {
251
+ d := net.Dialer {}
252
+ return d .DialContext (ctx , network , nsServer + ":53" )
253
+ },
254
+ }
255
+ }
0 commit comments