Merge pull request #4631 from wata727/add_new_parameter_elasticache
provider/aws: Add new parameter az_mode and availabiliy_zone(s) in ElastiCache
This commit is contained in:
commit
f0ef2c1a72
|
@ -120,6 +120,10 @@ func resourceAwsElasticacheCluster() *schema.Resource {
|
|||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"availability_zone": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -162,6 +166,30 @@ func resourceAwsElasticacheCluster() *schema.Resource {
|
|||
},
|
||||
},
|
||||
|
||||
"az_mode": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
|
||||
"availability_zone": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
|
||||
"availability_zones": &schema.Schema{
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
Set: func(v interface{}) int {
|
||||
return hashcode.String(v.(string))
|
||||
},
|
||||
},
|
||||
|
||||
"tags": tagsSchema(),
|
||||
|
||||
// apply_immediately is used to determine when the update modifications
|
||||
|
@ -234,6 +262,20 @@ func resourceAwsElasticacheClusterCreate(d *schema.ResourceData, meta interface{
|
|||
log.Printf("[DEBUG] Restoring Redis cluster from S3 snapshot: %#v", s)
|
||||
}
|
||||
|
||||
if v, ok := d.GetOk("az_mode"); ok {
|
||||
req.AZMode = aws.String(v.(string))
|
||||
}
|
||||
|
||||
if v, ok := d.GetOk("availability_zone"); ok {
|
||||
req.PreferredAvailabilityZone = aws.String(v.(string))
|
||||
}
|
||||
|
||||
preferred_azs := d.Get("availability_zones").(*schema.Set).List()
|
||||
if len(preferred_azs) > 0 {
|
||||
azs := expandStringList(preferred_azs)
|
||||
req.PreferredAvailabilityZones = azs
|
||||
}
|
||||
|
||||
resp, err := conn.CreateCacheCluster(req)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error creating Elasticache: %s", err)
|
||||
|
@ -306,6 +348,7 @@ func resourceAwsElasticacheClusterRead(d *schema.ResourceData, meta interface{})
|
|||
d.Set("notification_topic_arn", c.NotificationConfiguration.TopicArn)
|
||||
}
|
||||
}
|
||||
d.Set("availability_zone", c.PreferredAvailabilityZone)
|
||||
|
||||
if err := setCacheNodeData(d, c); err != nil {
|
||||
return err
|
||||
|
@ -398,6 +441,9 @@ func resourceAwsElasticacheClusterUpdate(d *schema.ResourceData, meta interface{
|
|||
oraw, nraw := d.GetChange("num_cache_nodes")
|
||||
o := oraw.(int)
|
||||
n := nraw.(int)
|
||||
if v, ok := d.GetOk("az_mode"); ok && v.(string) == "cross-az" && n == 1 {
|
||||
return fmt.Errorf("[WARN] Error updateing Elasticache cluster (%s), error: Cross-AZ mode is not supported in a single cache node.", d.Id())
|
||||
}
|
||||
if n < o {
|
||||
log.Printf("[INFO] Cluster %s is marked for Decreasing cache nodes from %d to %d", d.Id(), o, n)
|
||||
nodesToRemove := getCacheNodesToRemove(d, o, o-n)
|
||||
|
@ -454,13 +500,14 @@ func setCacheNodeData(d *schema.ResourceData, c *elasticache.CacheCluster) error
|
|||
cacheNodeData := make([]map[string]interface{}, 0, len(sortedCacheNodes))
|
||||
|
||||
for _, node := range sortedCacheNodes {
|
||||
if node.CacheNodeId == nil || node.Endpoint == nil || node.Endpoint.Address == nil || node.Endpoint.Port == nil {
|
||||
if node.CacheNodeId == nil || node.Endpoint == nil || node.Endpoint.Address == nil || node.Endpoint.Port == nil || node.CustomerAvailabilityZone == nil {
|
||||
return fmt.Errorf("Unexpected nil pointer in: %s", node)
|
||||
}
|
||||
cacheNodeData = append(cacheNodeData, map[string]interface{}{
|
||||
"id": *node.CacheNodeId,
|
||||
"address": *node.Endpoint.Address,
|
||||
"port": int(*node.Endpoint.Port),
|
||||
"id": *node.CacheNodeId,
|
||||
"address": *node.Endpoint.Address,
|
||||
"port": int(*node.Endpoint.Port),
|
||||
"availability_zone": *node.CustomerAvailabilityZone,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -122,6 +122,29 @@ func TestAccAWSElasticacheCluster_vpc(t *testing.T) {
|
|||
testAccCheckAWSElasticacheSubnetGroupExists("aws_elasticache_subnet_group.bar", &csg),
|
||||
testAccCheckAWSElasticacheClusterExists("aws_elasticache_cluster.bar", &ec),
|
||||
testAccCheckAWSElasticacheClusterAttributes(&ec),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_elasticache_cluster.bar", "availability_zone", "us-west-2a"),
|
||||
),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func TestAccAWSElasticacheCluster_multiAZInVpc(t *testing.T) {
|
||||
var csg elasticache.CacheSubnetGroup
|
||||
var ec elasticache.CacheCluster
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
Providers: testAccProviders,
|
||||
CheckDestroy: testAccCheckAWSElasticacheClusterDestroy,
|
||||
Steps: []resource.TestStep{
|
||||
resource.TestStep{
|
||||
Config: testAccAWSElasticacheClusterMultiAZInVPCConfig,
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testAccCheckAWSElasticacheSubnetGroupExists("aws_elasticache_subnet_group.bar", &csg),
|
||||
testAccCheckAWSElasticacheClusterExists("aws_elasticache_cluster.bar", &ec),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_elasticache_cluster.bar", "availability_zone", "Multiple"),
|
||||
),
|
||||
},
|
||||
},
|
||||
|
@ -414,9 +437,74 @@ resource "aws_elasticache_cluster" "bar" {
|
|||
security_group_ids = ["${aws_security_group.bar.id}"]
|
||||
parameter_group_name = "default.redis2.8"
|
||||
notification_topic_arn = "${aws_sns_topic.topic_example.arn}"
|
||||
availability_zone = "us-west-2a"
|
||||
}
|
||||
|
||||
resource "aws_sns_topic" "topic_example" {
|
||||
name = "tf-ecache-cluster-test"
|
||||
}
|
||||
`, genRandInt(), genRandInt(), genRandInt())
|
||||
|
||||
var testAccAWSElasticacheClusterMultiAZInVPCConfig = fmt.Sprintf(`
|
||||
resource "aws_vpc" "foo" {
|
||||
cidr_block = "192.168.0.0/16"
|
||||
tags {
|
||||
Name = "tf-test"
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_subnet" "foo" {
|
||||
vpc_id = "${aws_vpc.foo.id}"
|
||||
cidr_block = "192.168.0.0/20"
|
||||
availability_zone = "us-west-2a"
|
||||
tags {
|
||||
Name = "tf-test-%03d"
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_subnet" "bar" {
|
||||
vpc_id = "${aws_vpc.foo.id}"
|
||||
cidr_block = "192.168.16.0/20"
|
||||
availability_zone = "us-west-2b"
|
||||
tags {
|
||||
Name = "tf-test-%03d"
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_elasticache_subnet_group" "bar" {
|
||||
name = "tf-test-cache-subnet-%03d"
|
||||
description = "tf-test-cache-subnet-group-descr"
|
||||
subnet_ids = [
|
||||
"${aws_subnet.foo.id}",
|
||||
"${aws_subnet.bar.id}"
|
||||
]
|
||||
}
|
||||
|
||||
resource "aws_security_group" "bar" {
|
||||
name = "tf-test-security-group-%03d"
|
||||
description = "tf-test-security-group-descr"
|
||||
vpc_id = "${aws_vpc.foo.id}"
|
||||
ingress {
|
||||
from_port = -1
|
||||
to_port = -1
|
||||
protocol = "icmp"
|
||||
cidr_blocks = ["0.0.0.0/0"]
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_elasticache_cluster" "bar" {
|
||||
cluster_id = "tf-test-%03d"
|
||||
engine = "memcached"
|
||||
node_type = "cache.m1.small"
|
||||
num_cache_nodes = 2
|
||||
port = 11211
|
||||
subnet_group_name = "${aws_elasticache_subnet_group.bar.name}"
|
||||
security_group_ids = ["${aws_security_group.bar.id}"]
|
||||
parameter_group_name = "default.memcached1.4"
|
||||
az_mode = "cross-az"
|
||||
availability_zones = [
|
||||
"us-west-2a",
|
||||
"us-west-2b"
|
||||
]
|
||||
}
|
||||
`, genRandInt(), genRandInt(), genRandInt(), genRandInt(), genRandInt())
|
||||
|
|
|
@ -98,6 +98,12 @@ Can only be used for the Redis engine.
|
|||
SNS topic to send ElastiCache notifications to. Example:
|
||||
`arn:aws:sns:us-east-1:012345678999:my_sns_topic`
|
||||
|
||||
* `az_mode` - (Optional, Memcached only) Specifies whether the nodes in this Memcached node group are created in a single Availability Zone or created across multiple Availability Zones in the cluster's region. Valid values for this parameter are `single-az` or `cross-az`, default is `single-az`. If you want to choose `cross-az`, `num_cache_nodes` must be greater than `1`.
|
||||
|
||||
* `availability_zone` - (Optional) The AZ for the cache cluster. If you want to create cache nodes in multi-az, use `availability_zones`.
|
||||
|
||||
* `availability_zones` - (Optional, Memcached only) List of AZ in which the cache nodes will be created. If you want to create cache nodes in single-az, use `availability_zone`.
|
||||
|
||||
* `tags` - (Optional) A mapping of tags to assign to the resource.
|
||||
|
||||
~> **NOTE:** Snapshotting functionality is not compatible with t2 instance types.
|
||||
|
@ -106,7 +112,7 @@ SNS topic to send ElastiCache notifications to. Example:
|
|||
|
||||
The following attributes are exported:
|
||||
|
||||
* `cache_nodes` - List of node objects including `id`, `address` and `port`.
|
||||
* `cache_nodes` - List of node objects including `id`, `address`, `port` and `availability_zone`.
|
||||
Referenceable e.g. as `${aws_elasticache_cluster.bar.cache_nodes.0.address}`
|
||||
|
||||
* `configuration_endpoint` - (Memcached only) The configuration endpoint to allow host discovery
|
||||
|
|
Loading…
Reference in New Issue