diff --git a/.changelog/32297.txt b/.changelog/32297.txt new file mode 100644 index 00000000000..49dcac6c5e2 --- /dev/null +++ b/.changelog/32297.txt @@ -0,0 +1,3 @@ +```release-note:bug +provider: Prevent resource recreation if `tags` or `tags_all` are updated +``` \ No newline at end of file diff --git a/internal/service/ec2/ec2_spot_instance_request.go b/internal/service/ec2/ec2_spot_instance_request.go index ecd794c3ae9..a7e6ab89fa1 100644 --- a/internal/service/ec2/ec2_spot_instance_request.go +++ b/internal/service/ec2/ec2_spot_instance_request.go @@ -49,7 +49,7 @@ func ResourceSpotInstanceRequest() *schema.Resource { if v.Computed && !v.Optional { continue } - if k == names.AttrTags || k == "volume_tags" { + if k == names.AttrTags { continue } v.ForceNew = true diff --git a/internal/service/ec2/tags.go b/internal/service/ec2/tags.go index 5887f2da49c..729383ff674 100644 --- a/internal/service/ec2/tags.go +++ b/internal/service/ec2/tags.go @@ -111,10 +111,8 @@ func tagsFromTagDescriptions(tds []*ec2.TagDescription) []*ec2.Tag { } func tagsSchemaConflictsWith(conflictsWith []string) *schema.Schema { - return &schema.Schema{ - Type: schema.TypeMap, - Optional: true, - Elem: &schema.Schema{Type: schema.TypeString}, - ConflictsWith: conflictsWith, - } + v := tftags.TagsSchema() + v.ConflictsWith = conflictsWith + + return v } diff --git a/internal/service/ec2/vpc_test.go b/internal/service/ec2/vpc_test.go index 8a35f89928e..c9f8702a381 100644 --- a/internal/service/ec2/vpc_test.go +++ b/internal/service/ec2/vpc_test.go @@ -91,7 +91,7 @@ func TestAccVPC_disappears(t *testing.T) { func TestAccVPC_tags(t *testing.T) { ctx := acctest.Context(t) - var vpc ec2.Vpc + var vpc1, vpc2, vpc3 ec2.Vpc resourceName := "aws_vpc.test" resource.ParallelTest(t, resource.TestCase{ @@ -103,7 +103,7 @@ func TestAccVPC_tags(t *testing.T) { { Config: testAccVPCConfig_tags1("key1", "value1"), Check: resource.ComposeTestCheckFunc( - acctest.CheckVPCExists(ctx, resourceName, &vpc), + acctest.CheckVPCExists(ctx, resourceName, &vpc1), resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1"), ), @@ -116,7 +116,8 @@ func TestAccVPC_tags(t *testing.T) { { Config: testAccVPCConfig_tags2("key1", "value1updated", "key2", "value2"), Check: resource.ComposeTestCheckFunc( - acctest.CheckVPCExists(ctx, resourceName, &vpc), + acctest.CheckVPCExists(ctx, resourceName, &vpc2), + testAccCheckVPCIDsEqual(&vpc2, &vpc1), resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1updated"), resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), @@ -125,7 +126,8 @@ func TestAccVPC_tags(t *testing.T) { { Config: testAccVPCConfig_tags1("key2", "value2"), Check: resource.ComposeTestCheckFunc( - acctest.CheckVPCExists(ctx, resourceName, &vpc), + acctest.CheckVPCExists(ctx, resourceName, &vpc3), + testAccCheckVPCIDsEqual(&vpc3, &vpc2), resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), ), diff --git a/internal/tags/tags.go b/internal/tags/tags.go index 76893e46983..fbe5fe2385a 100644 --- a/internal/tags/tags.go +++ b/internal/tags/tags.go @@ -4,35 +4,29 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -var ( - tagsSchema *schema.Schema = &schema.Schema{ +// TagsSchema returns the schema to use for tags. +func TagsSchema() *schema.Schema { + return &schema.Schema{ Type: schema.TypeMap, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, } - tagsSchemaComputed *schema.Schema = &schema.Schema{ +} + +func TagsSchemaComputed() *schema.Schema { + return &schema.Schema{ Type: schema.TypeMap, Optional: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, } - tagsSchemaForceNew *schema.Schema = &schema.Schema{ +} + +func TagsSchemaForceNew() *schema.Schema { + return &schema.Schema{ Type: schema.TypeMap, Optional: true, ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, } -) - -// TagsSchema returns the schema to use for tags. -func TagsSchema() *schema.Schema { - return tagsSchema -} - -func TagsSchemaComputed() *schema.Schema { - return tagsSchemaComputed -} - -func TagsSchemaForceNew() *schema.Schema { - return tagsSchemaForceNew }