@@ -18,6 +18,8 @@ import (
1818
1919var version = "dev"
2020
21+ const defaultMaxRetries = 10
22+
2123type config struct {
2224 OutputDir string `toml:"output-dir"`
2325 Region string `toml:"region"`
@@ -26,6 +28,7 @@ type config struct {
2628 ViewerRequestName string `toml:"viewer-request-name"`
2729 ViewerResponseName string `toml:"viewer-response-name"`
2830 DebugHeaders bool `toml:"debug-headers"`
31+ MaxRetries int `toml:"max-retries"`
2932}
3033
3134func main () {
@@ -60,6 +63,7 @@ func runDeploy(args []string) {
6063 dryRun := fs .Bool ("dry-run" , false , "parse and validate only, print plan" )
6164 region := fs .String ("region" , "" , "AWS region override" )
6265 debugHeaders := fs .Bool ("debug-headers" , false , "inject debug headers into viewer-response function" )
66+ maxRetries := fs .Int ("max-retries" , - 1 , fmt .Sprintf ("max AWS throttle retries (default %d, 0 disables retries)" , defaultMaxRetries ))
6367 fs .Parse (args )
6468
6569 // Resolve @FILE syntax for string flags
@@ -102,6 +106,12 @@ func runDeploy(args []string) {
102106 if * debugHeaders {
103107 cfg .DebugHeaders = true
104108 }
109+ if * maxRetries >= 0 {
110+ cfg .MaxRetries = * maxRetries
111+ } else if cfg .MaxRetries == 0 {
112+ // Neither flag nor config set: use default
113+ cfg .MaxRetries = defaultMaxRetries
114+ }
105115
106116 // Validate required config
107117 if cfg .OutputDir == "" {
@@ -205,52 +215,52 @@ func runDeploy(args []string) {
205215
206216 // Step 5: Resolve KVS ARNs
207217 fmt .Fprintf (os .Stderr , "Resolving KVS ARNs...\n " )
208- redirectsARN , err := functions .ResolveKVSARN (ctx , cfClient , cfg .RedirectsKVSName )
218+ redirectsARN , err := functions .ResolveKVSARN (ctx , cfClient , cfg .RedirectsKVSName , cfg . MaxRetries )
209219 if err != nil {
210220 fatal ("resolving redirects KVS: %v" , err )
211221 }
212222 fmt .Fprintf (os .Stderr , "Redirects KVS: %s\n " , redirectsARN )
213223
214- headersARN , err := functions .ResolveKVSARN (ctx , cfClient , cfg .HeadersKVSName )
224+ headersARN , err := functions .ResolveKVSARN (ctx , cfClient , cfg .HeadersKVSName , cfg . MaxRetries )
215225 if err != nil {
216226 fatal ("resolving headers KVS: %v" , err )
217227 }
218228 fmt .Fprintf (os .Stderr , "Headers KVS: %s\n " , headersARN )
219229
220230 // Step 6: Sync redirects KVS
221231 fmt .Fprintf (os .Stderr , "Syncing redirects KVS...\n " )
222- existingRedirects , redirectEtag , err := kvs .FetchExistingKeys (ctx , kvsClient , redirectsARN )
232+ existingRedirects , redirectEtag , err := kvs .FetchExistingKeys (ctx , kvsClient , redirectsARN , cfg . MaxRetries )
223233 if err != nil {
224234 fatal ("fetching existing redirects: %v" , err )
225235 }
226236 redirectPlan := kvs .ComputeSyncPlan (redirectData , existingRedirects )
227237 fmt .Fprintf (os .Stderr , "Redirects: %d puts, %d deletes\n " , len (redirectPlan .Puts ), len (redirectPlan .Deletes ))
228- if err := kvs .Sync (ctx , kvsClient , redirectsARN , redirectEtag , redirectPlan ); err != nil {
238+ if err := kvs .Sync (ctx , kvsClient , redirectsARN , redirectEtag , redirectPlan , cfg . MaxRetries ); err != nil {
229239 fatal ("syncing redirects: %v" , err )
230240 }
231241
232242 // Step 7: Sync headers KVS
233243 fmt .Fprintf (os .Stderr , "Syncing headers KVS...\n " )
234- existingHeaders , headerEtag , err := kvs .FetchExistingKeys (ctx , kvsClient , headersARN )
244+ existingHeaders , headerEtag , err := kvs .FetchExistingKeys (ctx , kvsClient , headersARN , cfg . MaxRetries )
235245 if err != nil {
236246 fatal ("fetching existing headers: %v" , err )
237247 }
238248 headerPlan := kvs .ComputeSyncPlan (headerData , existingHeaders )
239249 fmt .Fprintf (os .Stderr , "Headers: %d puts, %d deletes\n " , len (headerPlan .Puts ), len (headerPlan .Deletes ))
240- if err := kvs .Sync (ctx , kvsClient , headersARN , headerEtag , headerPlan ); err != nil {
250+ if err := kvs .Sync (ctx , kvsClient , headersARN , headerEtag , headerPlan , cfg . MaxRetries ); err != nil {
241251 fatal ("syncing headers: %v" , err )
242252 }
243253
244254 // Step 8: Deploy CloudFront Functions
245255 fmt .Fprintf (os .Stderr , "Deploying viewer-request function...\n " )
246256 requestCode := functions .BuildFunctionCode (functions .ViewerRequestJS , functions .KVSIDFromARN (redirectsARN ), false )
247- if err := functions .DeployFunction (ctx , cfClient , cfg .ViewerRequestName , requestCode , redirectsARN ); err != nil {
257+ if err := functions .DeployFunction (ctx , cfClient , cfg .ViewerRequestName , requestCode , redirectsARN , cfg . MaxRetries ); err != nil {
248258 fatal ("deploying viewer-request function: %v" , err )
249259 }
250260
251261 fmt .Fprintf (os .Stderr , "Deploying viewer-response function...\n " )
252262 responseCode := functions .BuildFunctionCode (functions .ViewerResponseJS , functions .KVSIDFromARN (headersARN ), cfg .DebugHeaders )
253- if err := functions .DeployFunction (ctx , cfClient , cfg .ViewerResponseName , responseCode , headersARN ); err != nil {
263+ if err := functions .DeployFunction (ctx , cfClient , cfg .ViewerResponseName , responseCode , headersARN , cfg . MaxRetries ); err != nil {
254264 fatal ("deploying viewer-response function: %v" , err )
255265 }
256266
0 commit comments