diff --git a/.changelog/30354.txt b/.changelog/30354.txt new file mode 100644 index 000000000000..ba859a8a8396 --- /dev/null +++ b/.changelog/30354.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_cloudwatch_log_group: Fix `invalid new value for .skip_destroy: was cty.False, but now null` errors +``` \ No newline at end of file diff --git a/internal/service/logs/group.go b/internal/service/logs/group.go index e33f219d829c..cc2909f66771 100644 --- a/internal/service/logs/group.go +++ b/internal/service/logs/group.go @@ -149,6 +149,8 @@ func resourceGroupRead(ctx context.Context, d *schema.ResourceData, meta interfa d.Set("name", lg.LogGroupName) d.Set("name_prefix", create.NamePrefixFromName(aws.ToString(lg.LogGroupName))) d.Set("retention_in_days", lg.RetentionInDays) + // Support in-place update of non-refreshable attribute. + d.Set("skip_destroy", d.Get("skip_destroy")) tags, err := listLogGroupTags(ctx, conn, d.Id()) diff --git a/internal/service/logs/group_test.go b/internal/service/logs/group_test.go index e49422164067..2f804d25f87e 100644 --- a/internal/service/logs/group_test.go +++ b/internal/service/logs/group_test.go @@ -50,10 +50,9 @@ func TestAccLogsGroup_basic(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, }, }) @@ -79,10 +78,9 @@ func TestAccLogsGroup_nameGenerate(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, }, }) @@ -108,10 +106,9 @@ func TestAccLogsGroup_namePrefix(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, }, }) @@ -162,10 +159,9 @@ func TestAccLogsGroup_tags(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, { Config: testAccGroupConfig_tags2(rName, "key1", "value1updated", "key2", "value2"), @@ -210,10 +206,9 @@ func TestAccLogsGroup_kmsKey(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, { Config: testAccGroupConfig_kmsKey(rName, 1), @@ -287,10 +282,9 @@ func TestAccLogsGroup_retentionPolicy(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"retention_in_days", "skip_destroy"}, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, }, { Config: testAccGroupConfig_retentionPolicy(rName, 0), @@ -352,6 +346,36 @@ func TestAccLogsGroup_skipDestroy(t *testing.T) { }) } +func TestAccLogsGroup_skipDestroyInconsistentPlan(t *testing.T) { + ctx := acctest.Context(t) + var v types.LogGroup + rName := acctest.RandomWithPrefix(t, acctest.ResourcePrefix) + resourceName := "aws_cloudwatch_log_group.test" + + acctest.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, names.CloudWatchLogsEndpointID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGroupDestroy(ctx, t), + Steps: []resource.TestStep{ + { + Config: testAccGroupConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckGroupExists(ctx, t, resourceName, &v), + resource.TestCheckResourceAttr(resourceName, "skip_destroy", "false"), + ), + }, + { + Config: testAccGroupConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckGroupExists(ctx, t, resourceName, &v), + resource.TestCheckResourceAttr(resourceName, "skip_destroy", "false"), + ), + }, + }, + }) +} + func testAccCheckGroupExists(ctx context.Context, t *testing.T, n string, v *types.LogGroup) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n]