diff --git a/aws/autoscaling_tags.go b/aws/autoscaling_tags.go deleted file mode 100644 index c0bbbe134d8..00000000000 --- a/aws/autoscaling_tags.go +++ /dev/null @@ -1,295 +0,0 @@ -package aws - -import ( - "bytes" - "fmt" - "log" - "regexp" - "strconv" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/autoscaling" - "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" -) - -// autoscalingTagSchema returns the schema to use for the tag element. -func autoscalingTagSchema() *schema.Schema { - return &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "key": { - Type: schema.TypeString, - Required: true, - }, - - "value": { - Type: schema.TypeString, - Required: true, - }, - - "propagate_at_launch": { - Type: schema.TypeBool, - Required: true, - }, - }, - }, - Set: autoscalingTagToHash, - } -} - -func autoscalingTagToHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["key"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) - buf.WriteString(fmt.Sprintf("%t-", m["propagate_at_launch"].(bool))) - - return hashcode.String(buf.String()) -} - -// setTags is a helper to set the tags for a resource. It expects the -// tags field to be named "tag" -func setAutoscalingTags(conn *autoscaling.AutoScaling, d *schema.ResourceData) error { - resourceID := d.Get("name").(string) - var createTags, removeTags []*autoscaling.Tag - - if d.HasChanges("tag", "tags") { - oraw, nraw := d.GetChange("tag") - o := setToMapByKey(oraw.(*schema.Set)) - n := setToMapByKey(nraw.(*schema.Set)) - - old, err := autoscalingTagsFromMap(o, resourceID) - if err != nil { - return err - } - - new, err := autoscalingTagsFromMap(n, resourceID) - if err != nil { - return err - } - - c, r, err := diffAutoscalingTags(old, new, resourceID) - if err != nil { - return err - } - - createTags = append(createTags, c...) - removeTags = append(removeTags, r...) - - oraw, nraw = d.GetChange("tags") - old, err = autoscalingTagsFromList(oraw.(*schema.Set).List(), resourceID) - if err != nil { - return err - } - - new, err = autoscalingTagsFromList(nraw.(*schema.Set).List(), resourceID) - if err != nil { - return err - } - - c, r, err = diffAutoscalingTags(old, new, resourceID) - if err != nil { - return err - } - - createTags = append(createTags, c...) - removeTags = append(removeTags, r...) - } - - // Set tags - if len(removeTags) > 0 { - log.Printf("[DEBUG] Removing autoscaling tags: %#v", removeTags) - - remove := autoscaling.DeleteTagsInput{ - Tags: removeTags, - } - - if _, err := conn.DeleteTags(&remove); err != nil { - return err - } - } - - if len(createTags) > 0 { - log.Printf("[DEBUG] Creating autoscaling tags: %#v", createTags) - - create := autoscaling.CreateOrUpdateTagsInput{ - Tags: createTags, - } - - if _, err := conn.CreateOrUpdateTags(&create); err != nil { - return err - } - } - - return nil -} - -// diffTags takes our tags locally and the ones remotely and returns -// the set of tags that must be created, and the set of tags that must -// be destroyed. -func diffAutoscalingTags(oldTags, newTags []*autoscaling.Tag, resourceID string) ([]*autoscaling.Tag, []*autoscaling.Tag, error) { - // First, we're creating everything we have - create := make(map[string]interface{}) - for _, t := range newTags { - tag := map[string]interface{}{ - "key": *t.Key, - "value": *t.Value, - "propagate_at_launch": *t.PropagateAtLaunch, - } - create[*t.Key] = tag - } - - // Build the list of what to remove - var remove []*autoscaling.Tag - for _, t := range oldTags { - old, ok := create[*t.Key].(map[string]interface{}) - - if !ok || old["value"] != *t.Value || old["propagate_at_launch"] != *t.PropagateAtLaunch { - // Delete it! - remove = append(remove, t) - } - } - - createTags, err := autoscalingTagsFromMap(create, resourceID) - if err != nil { - return nil, nil, err - } - - return createTags, remove, nil -} - -func autoscalingTagsFromList(vs []interface{}, resourceID string) ([]*autoscaling.Tag, error) { - result := make([]*autoscaling.Tag, 0, len(vs)) - for _, tag := range vs { - attr, ok := tag.(map[string]interface{}) - if !ok || len(attr) == 0 { - continue - } - - t, err := autoscalingTagFromMap(attr, resourceID) - if err != nil { - return nil, err - } - - if t != nil { - result = append(result, t) - } - } - return result, nil -} - -// tagsFromMap returns the tags for the given map of data. -func autoscalingTagsFromMap(m map[string]interface{}, resourceID string) ([]*autoscaling.Tag, error) { - result := make([]*autoscaling.Tag, 0, len(m)) - for _, v := range m { - attr, ok := v.(map[string]interface{}) - if !ok { - continue - } - - t, err := autoscalingTagFromMap(attr, resourceID) - if err != nil { - return nil, err - } - - if t != nil { - result = append(result, t) - } - } - - return result, nil -} - -func autoscalingTagFromMap(attr map[string]interface{}, resourceID string) (*autoscaling.Tag, error) { - if _, ok := attr["key"]; !ok { - return nil, fmt.Errorf("%s: invalid tag attributes: key missing", resourceID) - } - - if _, ok := attr["value"]; !ok { - return nil, fmt.Errorf("%s: invalid tag attributes: value missing", resourceID) - } - - if _, ok := attr["propagate_at_launch"]; !ok { - return nil, fmt.Errorf("%s: invalid tag attributes: propagate_at_launch missing", resourceID) - } - - var propagateAtLaunch bool - var err error - - if v, ok := attr["propagate_at_launch"].(bool); ok { - propagateAtLaunch = v - } - - if v, ok := attr["propagate_at_launch"].(string); ok { - if propagateAtLaunch, err = strconv.ParseBool(v); err != nil { - return nil, fmt.Errorf( - "%s: invalid tag attribute: invalid value for propagate_at_launch: %s", - resourceID, - v, - ) - } - } - - t := &autoscaling.Tag{ - Key: aws.String(attr["key"].(string)), - Value: aws.String(attr["value"].(string)), - PropagateAtLaunch: aws.Bool(propagateAtLaunch), - ResourceId: aws.String(resourceID), - ResourceType: aws.String("auto-scaling-group"), - } - - if tagIgnoredAutoscaling(t) { - return nil, nil - } - - return t, nil -} - -// autoscalingTagDescriptionsToSlice turns the list of tags into a slice. If -// forceStrings is true, all values are converted to strings -func autoscalingTagDescriptionsToSlice(ts []*autoscaling.TagDescription, forceStrings bool) []map[string]interface{} { - tags := make([]map[string]interface{}, 0, len(ts)) - for _, t := range ts { - var propagateAtLaunch interface{} - if forceStrings { - propagateAtLaunch = strconv.FormatBool(aws.BoolValue(t.PropagateAtLaunch)) - } else { - propagateAtLaunch = aws.BoolValue(t.PropagateAtLaunch) - } - tags = append(tags, map[string]interface{}{ - "key": aws.StringValue(t.Key), - "value": aws.StringValue(t.Value), - "propagate_at_launch": propagateAtLaunch, - }) - } - - return tags -} - -func setToMapByKey(s *schema.Set) map[string]interface{} { - result := make(map[string]interface{}) - for _, rawData := range s.List() { - data := rawData.(map[string]interface{}) - result[data["key"].(string)] = data - } - - return result -} - -// compare a tag against a list of strings and checks if it should -// be ignored or not -func tagIgnoredAutoscaling(t *autoscaling.Tag) bool { - filter := []string{"^aws:"} - for _, v := range filter { - log.Printf("[DEBUG] Matching %v with %v\n", v, *t.Key) - r, _ := regexp.MatchString(v, *t.Key) - if r { - log.Printf("[DEBUG] Found AWS specific tag %s (val: %s), ignoring.\n", *t.Key, *t.Value) - return true - } - } - return false -} diff --git a/aws/autoscaling_tags_test.go b/aws/autoscaling_tags_test.go deleted file mode 100644 index b2ec5d3ad20..00000000000 --- a/aws/autoscaling_tags_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package aws - -import ( - "fmt" - "reflect" - "testing" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/autoscaling" - "github.com/hashicorp/terraform-plugin-sdk/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/terraform" -) - -func TestDiffAutoscalingTags(t *testing.T) { - cases := []struct { - Old, New map[string]interface{} - Create, Remove map[string]interface{} - }{ - // Basic add/remove - { - Old: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "bar", - "propagate_at_launch": true, - }, - }, - New: map[string]interface{}{ - "DifferentTag": map[string]interface{}{ - "key": "DifferentTag", - "value": "baz", - "propagate_at_launch": true, - }, - }, - Create: map[string]interface{}{ - "DifferentTag": map[string]interface{}{ - "key": "DifferentTag", - "value": "baz", - "propagate_at_launch": true, - }, - }, - Remove: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "bar", - "propagate_at_launch": true, - }, - }, - }, - - // Modify - { - Old: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "bar", - "propagate_at_launch": true, - }, - }, - New: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "baz", - "propagate_at_launch": false, - }, - }, - Create: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "baz", - "propagate_at_launch": false, - }, - }, - Remove: map[string]interface{}{ - "Name": map[string]interface{}{ - "key": "Name", - "value": "bar", - "propagate_at_launch": true, - }, - }, - }, - } - - var resourceID = "sample" - - for i, tc := range cases { - awsTagsOld, err := autoscalingTagsFromMap(tc.Old, resourceID) - if err != nil { - t.Fatalf("%d: unexpected error convertig old tags: %v", i, err) - } - - awsTagsNew, err := autoscalingTagsFromMap(tc.New, resourceID) - if err != nil { - t.Fatalf("%d: unexpected error convertig new tags: %v", i, err) - } - - c, r, err := diffAutoscalingTags(awsTagsOld, awsTagsNew, resourceID) - if err != nil { - t.Fatalf("%d: unexpected error diff'ing tags: %v", i, err) - } - - cm := autoscalingTagsToMap(c) - rm := autoscalingTagsToMap(r) - if !reflect.DeepEqual(cm, tc.Create) { - t.Fatalf("%d: bad create: \n%#v\n%#v", i, cm, tc.Create) - } - if !reflect.DeepEqual(rm, tc.Remove) { - t.Fatalf("%d: bad remove: \n%#v\n%#v", i, rm, tc.Remove) - } - } -} - -// testAccCheckTags can be used to check the tags on a resource. -func testAccCheckAutoscalingTags( - ts *[]*autoscaling.TagDescription, key string, expected map[string]interface{}) resource.TestCheckFunc { - return func(s *terraform.State) error { - m := autoscalingTagDescriptionsToMap(ts) - v, ok := m[key] - if !ok { - return fmt.Errorf("Missing tag: %s", key) - } - - if v["value"] != expected["value"].(string) || - v["propagate_at_launch"] != expected["propagate_at_launch"].(bool) { - return fmt.Errorf("%s: bad value: %s", key, v) - } - - return nil - } -} - -func testAccCheckAutoscalingTagNotExists(ts *[]*autoscaling.TagDescription, key string) resource.TestCheckFunc { - return func(s *terraform.State) error { - m := autoscalingTagDescriptionsToMap(ts) - if _, ok := m[key]; ok { - return fmt.Errorf("Tag exists when it should not: %s", key) - } - - return nil - } -} - -func TestIgnoringTagsAutoscaling(t *testing.T) { - var ignoredTags []*autoscaling.Tag - ignoredTags = append(ignoredTags, &autoscaling.Tag{ - Key: aws.String("aws:cloudformation:logical-id"), - Value: aws.String("foo"), - }) - ignoredTags = append(ignoredTags, &autoscaling.Tag{ - Key: aws.String("aws:foo:bar"), - Value: aws.String("baz"), - }) - for _, tag := range ignoredTags { - if !tagIgnoredAutoscaling(tag) { - t.Fatalf("Tag %v with value %v not ignored, but should be!", *tag.Key, *tag.Value) - } - } -} - -// autoscalingTagsToMap turns the list of tags into a map. -func autoscalingTagsToMap(ts []*autoscaling.Tag) map[string]interface{} { - tags := make(map[string]interface{}) - for _, t := range ts { - tag := map[string]interface{}{ - "key": *t.Key, - "value": *t.Value, - "propagate_at_launch": *t.PropagateAtLaunch, - } - tags[*t.Key] = tag - } - - return tags -} - -// autoscalingTagDescriptionsToMap turns the list of tags into a map. -func autoscalingTagDescriptionsToMap(ts *[]*autoscaling.TagDescription) map[string]map[string]interface{} { - tags := make(map[string]map[string]interface{}) - for _, t := range *ts { - tag := map[string]interface{}{ - "key": *t.Key, - "value": *t.Value, - "propagate_at_launch": *t.PropagateAtLaunch, - } - tags[*t.Key] = tag - } - - return tags -} diff --git a/aws/resource_aws_autoscaling_group.go b/aws/resource_aws_autoscaling_group.go index 7907928bb9f..b0464b53e65 100644 --- a/aws/resource_aws_autoscaling_group.go +++ b/aws/resource_aws_autoscaling_group.go @@ -1,22 +1,28 @@ package aws import ( + "bytes" "fmt" "log" "regexp" "strings" "time" - "github.com/hashicorp/terraform-plugin-sdk/helper/customdiff" - "github.com/hashicorp/terraform-plugin-sdk/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/helper/validation" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/autoscaling" "github.com/aws/aws-sdk-go/service/elb" "github.com/aws/aws-sdk-go/service/elbv2" + "github.com/hashicorp/terraform-plugin-sdk/helper/customdiff" + "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" +) + +const ( + autoscalingTagResourceTypeAutoScalingGroup = `auto-scaling-group` ) func resourceAwsAutoscalingGroup() *schema.Resource { @@ -387,7 +393,38 @@ func resourceAwsAutoscalingGroup() *schema.Resource { }, }, - "tag": autoscalingTagSchema(), + "tag": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + }, + + "value": { + Type: schema.TypeString, + Required: true, + }, + + "propagate_at_launch": { + Type: schema.TypeBool, + Required: true, + }, + }, + }, + // This should be removable, but wait until other tags work is being done. + Set: func(v interface{}) int { + var buf bytes.Buffer + m := v.(map[string]interface{}) + buf.WriteString(fmt.Sprintf("%s-", m["key"].(string))) + buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) + buf.WriteString(fmt.Sprintf("%t-", m["propagate_at_launch"].(bool))) + + return hashcode.String(buf.String()) + }, + }, "tags": { Type: schema.TypeSet, @@ -532,22 +569,13 @@ func resourceAwsAutoscalingGroupCreate(d *schema.ResourceData, meta interface{}) } resourceID := d.Get("name").(string) + if v, ok := d.GetOk("tag"); ok { - var err error - createOpts.Tags, err = autoscalingTagsFromMap( - setToMapByKey(v.(*schema.Set)), resourceID) - if err != nil { - return err - } + createOpts.Tags = keyvaluetags.AutoscalingKeyValueTags(v, resourceID, autoscalingTagResourceTypeAutoScalingGroup).IgnoreAws().AutoscalingTags() } if v, ok := d.GetOk("tags"); ok { - tags, err := autoscalingTagsFromList(v.(*schema.Set).List(), resourceID) - if err != nil { - return err - } - - createOpts.Tags = append(createOpts.Tags, tags...) + createOpts.Tags = keyvaluetags.AutoscalingKeyValueTags(v, resourceID, autoscalingTagResourceTypeAutoScalingGroup).IgnoreAws().AutoscalingTags() } if v, ok := d.GetOk("default_cooldown"); ok { @@ -654,6 +682,7 @@ func resourceAwsAutoscalingGroupCreate(d *schema.ResourceData, meta interface{}) func resourceAwsAutoscalingGroupRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn + ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig g, err := getAwsAutoscalingGroup(d.Id(), conn) if err != nil { @@ -712,47 +741,31 @@ func resourceAwsAutoscalingGroupRead(d *schema.ResourceData, meta interface{}) e return fmt.Errorf("error setting suspended_processes: %s", err) } - var tagList, tagsList []*autoscaling.TagDescription var tagOk, tagsOk bool var v interface{} + // Deprecated: In a future major version, this should always set all tags except those ignored. + // Remove d.GetOk() and Only() handling. if v, tagOk = d.GetOk("tag"); tagOk { - tags := setToMapByKey(v.(*schema.Set)) - for _, t := range g.Tags { - if _, ok := tags[*t.Key]; ok { - tagList = append(tagList, t) - } + proposedStateTags := keyvaluetags.AutoscalingKeyValueTags(v, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) + + if err := d.Set("tag", keyvaluetags.AutoscalingKeyValueTags(g.Tags, d.Id(), autoscalingTagResourceTypeAutoScalingGroup).IgnoreAws().IgnoreConfig(ignoreTagsConfig).Only(proposedStateTags).AutoscalingListOfMap()); err != nil { + return fmt.Errorf("error setting tag: %w", err) } - d.Set("tag", autoscalingTagDescriptionsToSlice(tagList, false)) } if v, tagsOk = d.GetOk("tags"); tagsOk { - tags := map[string]struct{}{} - for _, tag := range v.(*schema.Set).List() { - attr, ok := tag.(map[string]interface{}) - if !ok { - continue - } - - key, ok := attr["key"].(string) - if !ok { - continue - } + proposedStateTags := keyvaluetags.AutoscalingKeyValueTags(v, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) - tags[key] = struct{}{} - } - - for _, t := range g.Tags { - if _, ok := tags[*t.Key]; ok { - tagsList = append(tagsList, t) - } + if err := d.Set("tags", keyvaluetags.AutoscalingKeyValueTags(g.Tags, d.Id(), autoscalingTagResourceTypeAutoScalingGroup).IgnoreAws().IgnoreConfig(ignoreTagsConfig).Only(proposedStateTags).AutoscalingListOfStringMap()); err != nil { + return fmt.Errorf("error setting tags: %w", err) } - //lintignore:AWSR002 - d.Set("tags", autoscalingTagDescriptionsToSlice(tagsList, true)) } if !tagOk && !tagsOk { - d.Set("tag", autoscalingTagDescriptionsToSlice(g.Tags, false)) + if err := d.Set("tag", keyvaluetags.AutoscalingKeyValueTags(g.Tags, d.Id(), autoscalingTagResourceTypeAutoScalingGroup).IgnoreAws().IgnoreConfig(ignoreTagsConfig).AutoscalingListOfMap()); err != nil { + return fmt.Errorf("error setting tag: %w", err) + } } if err := d.Set("target_group_arns", flattenStringList(g.TargetGroupARNs)); err != nil { @@ -939,8 +952,21 @@ func resourceAwsAutoscalingGroupUpdate(d *schema.ResourceData, meta interface{}) opts.ServiceLinkedRoleARN = aws.String(d.Get("service_linked_role_arn").(string)) } - if err := setAutoscalingTags(conn, d); err != nil { - return err + if d.HasChanges("tag", "tags") { + oTagRaw, nTagRaw := d.GetChange("tag") + oTagsRaw, nTagsRaw := d.GetChange("tags") + + oTag := keyvaluetags.AutoscalingKeyValueTags(oTagRaw, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) + oTags := keyvaluetags.AutoscalingKeyValueTags(oTagsRaw, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) + oldTags := oTag.Merge(oTags).AutoscalingTags() + + nTag := keyvaluetags.AutoscalingKeyValueTags(nTagRaw, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) + nTags := keyvaluetags.AutoscalingKeyValueTags(nTagsRaw, d.Id(), autoscalingTagResourceTypeAutoScalingGroup) + newTags := nTag.Merge(nTags).AutoscalingTags() + + if err := keyvaluetags.AutoscalingUpdateTags(conn, d.Id(), autoscalingTagResourceTypeAutoScalingGroup, oldTags, newTags); err != nil { + return fmt.Errorf("error updating tags for Auto Scaling Group (%s): %w", d.Id(), err) + } } log.Printf("[DEBUG] AutoScaling Group update configuration: %#v", opts) diff --git a/aws/resource_aws_autoscaling_group_test.go b/aws/resource_aws_autoscaling_group_test.go index 1a08ab5504d..562dfe081f4 100644 --- a/aws/resource_aws_autoscaling_group_test.go +++ b/aws/resource_aws_autoscaling_group_test.go @@ -1288,6 +1288,51 @@ func testAccCheckAWSAutoScalingGroupAttributesVPCZoneIdentifier(group *autoscali } } +// testAccCheckTags can be used to check the tags on a resource. +func testAccCheckAutoscalingTags( + ts *[]*autoscaling.TagDescription, key string, expected map[string]interface{}) resource.TestCheckFunc { + return func(s *terraform.State) error { + m := autoscalingTagDescriptionsToMap(ts) + v, ok := m[key] + if !ok { + return fmt.Errorf("Missing tag: %s", key) + } + + if v["value"] != expected["value"].(string) || + v["propagate_at_launch"] != expected["propagate_at_launch"].(bool) { + return fmt.Errorf("%s: bad value: %s", key, v) + } + + return nil + } +} + +func testAccCheckAutoscalingTagNotExists(ts *[]*autoscaling.TagDescription, key string) resource.TestCheckFunc { + return func(s *terraform.State) error { + m := autoscalingTagDescriptionsToMap(ts) + if _, ok := m[key]; ok { + return fmt.Errorf("Tag exists when it should not: %s", key) + } + + return nil + } +} + +// autoscalingTagDescriptionsToMap turns the list of tags into a map. +func autoscalingTagDescriptionsToMap(ts *[]*autoscaling.TagDescription) map[string]map[string]interface{} { + tags := make(map[string]map[string]interface{}) + for _, t := range *ts { + tag := map[string]interface{}{ + "key": aws.StringValue(t.Key), + "value": aws.StringValue(t.Value), + "propagate_at_launch": aws.BoolValue(t.PropagateAtLaunch), + } + tags[aws.StringValue(t.Key)] = tag + } + + return tags +} + // testAccCheckAWSALBTargetGroupHealthy checks an *elbv2.TargetGroup to make // sure that all instances in it are healthy. func testAccCheckAWSALBTargetGroupHealthy(res *elbv2.TargetGroup) resource.TestCheckFunc { diff --git a/website/docs/index.html.markdown b/website/docs/index.html.markdown index 891f7884b87..16fdd2ef3da 100644 --- a/website/docs/index.html.markdown +++ b/website/docs/index.html.markdown @@ -200,7 +200,7 @@ for more information about connecting to alternate AWS endpoints or AWS compatib potentially end up destroying a live environment). Conflicts with `allowed_account_ids`. -* `ignore_tags` - (Optional) Configuration block with resource tag settings to ignore across all resources handled by this provider (except `aws_autoscaling_group` and any individual service tag resources such as `aws_ec2_tag`) for situations where external systems are managing certain resource tags. Arguments to the configuration block are described below in the `ignore_tags` Configuration Block section. See the [Terraform multiple provider instances documentation](/docs/configuration/providers.html#alias-multiple-provider-instances) for more information about additional provider configurations. +* `ignore_tags` - (Optional) Configuration block with resource tag settings to ignore across all resources handled by this provider (except any individual service tag resources such as `aws_ec2_tag`) for situations where external systems are managing certain resource tags. Arguments to the configuration block are described below in the `ignore_tags` Configuration Block section. See the [Terraform multiple provider instances documentation](/docs/configuration/providers.html#alias-multiple-provider-instances) for more information about additional provider configurations. * `insecure` - (Optional) Explicitly allow the provider to perform "insecure" SSL requests. If omitted, default value is `false`.