@@ -37,11 +37,17 @@ const (
37
37
)
38
38
39
39
var (
40
- // cache of parameter defaults
40
+ // cache of parameter defaults for cluster parameters
41
41
cachedParamMeta = util.ParamMetaCache {
42
42
Cache : map [string ]map [string ]util.ParamMeta {},
43
43
}
44
44
45
+ // cache of parameter defaults for instance parameters
46
+ // Used as fallback when cluster parameter validation fails
47
+ instanceParamMeta = util.ParamMetaCache {
48
+ Cache : map [string ]map [string ]util.ParamMeta {},
49
+ }
50
+
45
51
errParameterGroupJustCreated = fmt .Errorf ("parameter group just got created" )
46
52
requeueWaitWhileCreating = ackrequeue .NeededAfter (
47
53
errParameterGroupJustCreated ,
@@ -208,6 +214,11 @@ func sdkTagsFromResourceTags(
208
214
// RDS does not have a DeleteParameter or DeleteParameterFromParameterGroup API
209
215
// call. Instead, you need to call ResetDBClusterParameterGroup with a list of
210
216
// DB Cluster Parameters that you want RDS to reset to a default value.
217
+ //
218
+ // Note: This function uses fallback parameter validation to work around an AWS API
219
+ // limitation where DescribeEngineDefaultClusterParameters may not return all valid
220
+ // cluster parameters (e.g., MySQL logging parameters like slow_query_log). See
221
+ // getParameterMeta() for details on the fallback mechanism.
211
222
func (rm * resourceManager ) syncParameters (
212
223
ctx context.Context ,
213
224
desired * resource ,
@@ -307,9 +318,7 @@ func (rm *resourceManager) resetParameters(
307
318
// default to this if something goes wrong looking up parameter
308
319
// defaults
309
320
applyMethod := svcsdktypes .ApplyMethodImmediate
310
- pMeta , err = cachedParamMeta .Get (
311
- ctx , * family , paramName , rm .getFamilyParameters ,
312
- )
321
+ pMeta , err = rm .getParameterMeta (ctx , * family , paramName )
313
322
if err != nil {
314
323
return err
315
324
}
@@ -360,9 +369,7 @@ func (rm *resourceManager) modifyParameters(
360
369
for paramName , paramValue := range toModify {
361
370
// default to "immediate" if something goes wrong looking up defaults
362
371
applyMethod := svcsdktypes .ApplyMethodImmediate
363
- pMeta , err = cachedParamMeta .Get (
364
- ctx , * family , paramName , rm .getFamilyParameters ,
365
- )
372
+ pMeta , err = rm .getParameterMeta (ctx , * family , paramName )
366
373
if err != nil {
367
374
return err
368
375
}
@@ -433,3 +440,68 @@ func (rm *resourceManager) getFamilyParameters(
433
440
}
434
441
return familyMeta , nil
435
442
}
443
+
444
+ // getInstanceFamilyParameters calls the RDS DescribeEngineDefaultParameters API to
445
+ // retrieve the set of parameter information for a DB instance parameter group family.
446
+ // This is used as a fallback when cluster parameter validation fails, as some valid
447
+ // cluster parameters may only be listed in the instance parameter defaults.
448
+ func (rm * resourceManager ) getInstanceFamilyParameters (
449
+ ctx context.Context ,
450
+ family string ,
451
+ ) (map [string ]util.ParamMeta , error ) {
452
+ var marker * string
453
+ familyMeta := map [string ]util.ParamMeta {}
454
+
455
+ for {
456
+ resp , err := rm .sdkapi .DescribeEngineDefaultParameters (
457
+ ctx ,
458
+ & svcsdk.DescribeEngineDefaultParametersInput {
459
+ DBParameterGroupFamily : aws .String (family ),
460
+ Marker : marker ,
461
+ },
462
+ )
463
+ rm .metrics .RecordAPICall ("GET" , "DescribeEngineDefaultParameters" , err )
464
+ if err != nil {
465
+ return nil , err
466
+ }
467
+ for _ , param := range resp .EngineDefaults .Parameters {
468
+ pName := * param .ParameterName
469
+ familyMeta [pName ] = util.ParamMeta {
470
+ IsModifiable : * param .IsModifiable ,
471
+ IsDynamic : * param .ApplyType != applyTypeStatic ,
472
+ }
473
+ }
474
+ marker = resp .EngineDefaults .Marker
475
+ if marker == nil {
476
+ break
477
+ }
478
+ }
479
+ return familyMeta , nil
480
+ }
481
+
482
+ // getParameterMeta retrieves parameter metadata with fallback validation.
483
+ // First tries cluster-level parameter validation, then falls back to instance-level
484
+ // validation if the parameter is not found. This works around the AWS API limitation
485
+ // where DescribeEngineDefaultClusterParameters may not return all valid cluster
486
+ // parameters (e.g., MySQL logging parameters like slow_query_log).
487
+ func (rm * resourceManager ) getParameterMeta (
488
+ ctx context.Context ,
489
+ family string ,
490
+ paramName string ,
491
+ ) (* util.ParamMeta , error ) {
492
+ // Try cluster-level parameters first
493
+ pMeta , err := cachedParamMeta .Get (ctx , family , paramName , rm .getFamilyParameters )
494
+ if err == nil {
495
+ return pMeta , nil
496
+ }
497
+
498
+ // If not found in cluster parameters, try instance-level parameters
499
+ // Some valid cluster parameters may only be listed in instance defaults
500
+ instanceMeta , instanceErr := instanceParamMeta .Get (ctx , family , paramName , rm .getInstanceFamilyParameters )
501
+ if instanceErr == nil {
502
+ return instanceMeta , nil
503
+ }
504
+
505
+ // Return original error if not found in either
506
+ return nil , err
507
+ }
0 commit comments