-
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 1 commit
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,14 @@ func resourceAwsElasticacheClusterCreate(d *schema.ResourceData, meta interface{ | |
req.CacheParameterGroupName = aws.String(v.(string)) | ||
} | ||
|
||
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 +287,8 @@ 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) | ||
d.Set("snapshot_window", c.SnapshotWindow) | ||
d.Set("snapshot_retention_limit", c.SnapshotRetentionLimit) | ||
if c.NotificationConfiguration != nil { | ||
if *c.NotificationConfiguration.TopicStatus == "active" { | ||
d.Set("notification_topic_arn", c.NotificationConfiguration.TopicArn) | ||
|
@@ -344,6 +372,15 @@ func resourceAwsElasticacheClusterUpdate(d *schema.ResourceData, meta interface{ | |
requestUpdate = true | ||
} | ||
|
||
if d.HasChange("snapshot_window") { | ||
req.EngineVersion = aws.String(d.Get("snapshot_window").(string)) | ||
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. Probably not 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'OH! |
||
requestUpdate = true | ||
} | ||
|
||
if d.HasChange("snapshot_retention_limit") { | ||
req.NumCacheNodes = aws.Int64(int64(d.Get("snapshot_retention_limit").(int))) | ||
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. Probably not 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'OH! |
||
} | ||
|
||
if d.HasChange("num_cache_nodes") { | ||
req.NumCacheNodes = aws.Int64(int64(d.Get("num_cache_nodes").(int))) | ||
requestUpdate = true | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,6 +33,28 @@ func TestAccAWSElasticacheCluster_basic(t *testing.T) { | |
}) | ||
} | ||
|
||
func TestAccAWSElasticacheCluster_snapshots(t *testing.T) { | ||
var ec elasticache.CacheCluster | ||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckAWSElasticacheClusterDestroy, | ||
Steps: []resource.TestStep{ | ||
resource.TestStep{ | ||
Config: testAccAWSElasticacheClusterConfig_snapshots, | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckAWSElasticacheSecurityGroupExists("aws_elasticache_security_group.bar"), | ||
testAccCheckAWSElasticacheClusterExists("aws_elasticache_cluster.bar", &ec), | ||
resource.TestCheckResourceAttr( | ||
"aws_elasticache_cluster.bar", "snapshot_window", "05:00-09:00"), | ||
resource.TestCheckResourceAttr( | ||
"aws_elasticache_cluster.bar", "snapshot_retention_limit", "3"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func TestAccAWSElasticacheCluster_vpc(t *testing.T) { | ||
var csg elasticache.CacheSubnetGroup | ||
var ec elasticache.CacheCluster | ||
|
@@ -149,6 +171,42 @@ resource "aws_elasticache_cluster" "bar" { | |
port = 11211 | ||
parameter_group_name = "default.memcached1.4" | ||
security_group_names = ["${aws_elasticache_security_group.bar.name}"] | ||
snapshot_window = "05:00-09:00" | ||
snapshot_retention_limit = 3 | ||
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. Engine |
||
} | ||
`, genRandInt(), genRandInt(), genRandInt()) | ||
|
||
var testAccAWSElasticacheClusterConfig_snapshots = fmt.Sprintf(` | ||
provider "aws" { | ||
region = "us-east-1" | ||
} | ||
resource "aws_security_group" "bar" { | ||
name = "tf-test-security-group-%03d" | ||
description = "tf-test-security-group-descr" | ||
ingress { | ||
from_port = -1 | ||
to_port = -1 | ||
protocol = "icmp" | ||
cidr_blocks = ["0.0.0.0/0"] | ||
} | ||
} | ||
|
||
resource "aws_elasticache_security_group" "bar" { | ||
name = "tf-test-security-group-%03d" | ||
description = "tf-test-security-group-descr" | ||
security_group_names = ["${aws_security_group.bar.name}"] | ||
} | ||
|
||
resource "aws_elasticache_cluster" "bar" { | ||
cluster_id = "tf-test-%03d" | ||
engine = "redis" | ||
node_type = "cache.m1.small" | ||
num_cache_nodes = 1 | ||
port = 6379 | ||
parameter_group_name = "default.redis2.8" | ||
security_group_names = ["${aws_elasticache_security_group.bar.name}"] | ||
snapshot_window = "05:00-09:00" | ||
snapshot_retention_limit = 3 | ||
} | ||
`, genRandInt(), genRandInt(), genRandInt()) | ||
|
||
|
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.
snapshot_window
andsnapshot_retention_limit
are not toggling therequestUpdate
bit, so they're never actually being sent in anyupdate
call.