-
Notifications
You must be signed in to change notification settings - Fork 9.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
provider/aws: ElastiCache (Redis) snapshot window and retention limits #3707
Changes from 4 commits
7dd1546
4f05df6
707bfd7
ca2ea80
350f91e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -138,6 +138,24 @@ func resourceAwsElasticacheCluster() *schema.Resource { | |
}, | ||
}, | ||
|
||
"snapshot_window": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
}, | ||
|
||
"snapshot_retention_limit": &schema.Schema{ | ||
Type: schema.TypeInt, | ||
Optional: true, | ||
ValidateFunc: func(v interface{}, k string) (ws []string, es []error) { | ||
value := v.(int) | ||
if value > 35 { | ||
es = append(es, fmt.Errorf( | ||
"snapshot retention limit cannot be more than 35 days")) | ||
} | ||
return | ||
}, | ||
}, | ||
|
||
"tags": tagsSchema(), | ||
|
||
// apply_immediately is used to determine when the update modifications | ||
|
@@ -187,6 +205,16 @@ func resourceAwsElasticacheClusterCreate(d *schema.ResourceData, meta interface{ | |
req.CacheParameterGroupName = aws.String(v.(string)) | ||
} | ||
|
||
if !strings.Contains(d.Get("node_type").(string), "cache.t2") { | ||
if v, ok := d.GetOk("snapshot_retention_limit"); ok { | ||
req.SnapshotRetentionLimit = aws.Int64(int64(v.(int))) | ||
} | ||
|
||
if v, ok := d.GetOk("snapshot_window"); ok { | ||
req.SnapshotWindow = aws.String(v.(string)) | ||
} | ||
} | ||
|
||
if v, ok := d.GetOk("maintenance_window"); ok { | ||
req.PreferredMaintenanceWindow = aws.String(v.(string)) | ||
} | ||
|
@@ -261,6 +289,12 @@ func resourceAwsElasticacheClusterRead(d *schema.ResourceData, meta interface{}) | |
d.Set("security_group_ids", c.SecurityGroups) | ||
d.Set("parameter_group_name", c.CacheParameterGroup) | ||
d.Set("maintenance_window", c.PreferredMaintenanceWindow) | ||
if c.SnapshotWindow != nil { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
d.Set("snapshot_window", c.SnapshotWindow) | ||
} | ||
if c.SnapshotRetentionLimit != nil { | ||
d.Set("snapshot_retention_limit", c.SnapshotRetentionLimit) | ||
} | ||
if c.NotificationConfiguration != nil { | ||
if *c.NotificationConfiguration.TopicStatus == "active" { | ||
d.Set("notification_topic_arn", c.NotificationConfiguration.TopicArn) | ||
|
@@ -343,6 +377,17 @@ func resourceAwsElasticacheClusterUpdate(d *schema.ResourceData, meta interface{ | |
req.EngineVersion = aws.String(d.Get("engine_version").(string)) | ||
requestUpdate = true | ||
} | ||
if !strings.Contains(d.Get("node_type").(string), "cache.t2") { | ||
if d.HasChange("snapshot_window") { | ||
req.SnapshotWindow = aws.String(d.Get("snapshot_window").(string)) | ||
requestUpdate = true | ||
} | ||
|
||
if d.HasChange("snapshot_retention_limit") { | ||
req.SnapshotRetentionLimit = aws.Int64(int64(d.Get("snapshot_retention_limit").(int))) | ||
requestUpdate = true | ||
} | ||
} | ||
|
||
if d.HasChange("num_cache_nodes") { | ||
req.NumCacheNodes = aws.Int64(int64(d.Get("num_cache_nodes").(int))) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -73,6 +73,15 @@ names to associate with this cache cluster | |
Amazon Resource Name (ARN) of a Redis RDB snapshot file stored in Amazon S3. | ||
Example: `arn:aws:s3:::my_bucket/snapshot1.rdb` | ||
|
||
* `snapshot_window` - (Optional) The daily time range (in UTC) during which ElastiCache will | ||
begin taking a daily snapshot of your cache cluster. Can only be used for the Redis engine. Example: 05:00-09:00 | ||
|
||
* `snapshow_retention_limit` - (Optional) The number of days for which ElastiCache will | ||
retain automatic cache cluster snapshots before deleting them. For example, if you set | ||
SnapshotRetentionLimit to 5, then a snapshot that was taken today will be retained for 5 days | ||
before being deleted. If the value of SnapshotRetentionLimit is set to zero (0), backups are turned off. | ||
Can only be used for the Redis engine. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Another gem: snapshotting is not enabled for
|
||
* `notification_topic_arn` – (Optional) An Amazon Resource Name (ARN) of an | ||
SNS topic to send ElastiCache notifications to. Example: | ||
`arn:aws:sns:us-east-1:012345678999:my_sns_topic` | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't believe this is the approach we should take. We should document that snapshotting does not work with
cache.t2
's , and we should bubble up the error if a user uses t2's anyway.Only applying these params in this block would (especially without any message) would be misleading the user, as without an error, anything in their config that doesn't throw an error in applying will be written to state, so from Terraforms view, they are applied. But in reality, they are not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So you thibk I should just log that snapshotting isn't available if the user specifies t2 and then just let the values be set? Or should I specifically check for snapahotting in conjunction with t2 (using a check like above) and throw an error?