diff --git a/internal/backend/remote-state/s3/backend.go b/internal/backend/remote-state/s3/backend.go index 959f40f8a7..bc47c33af6 100644 --- a/internal/backend/remote-state/s3/backend.go +++ b/internal/backend/remote-state/s3/backend.go @@ -217,6 +217,16 @@ func (b *Backend) PrepareConfig(obj cty.Value) (cty.Value, tfdiags.Diagnostics) return obj, diags } + if val := obj.GetAttr("bucket"); val.IsNull() || val.AsString() == "" { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Invalid bucket value", + // `The "bucket" attribute value must not be empty.`, + `"bucket": required field is not set`, + cty.Path{cty.GetAttrStep{Name: "bucket"}}, + )) + } + if val := obj.GetAttr("key"); val.IsNull() || val.AsString() == "" { diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, @@ -237,7 +247,7 @@ func (b *Backend) PrepareConfig(obj cty.Value) (cty.Value, tfdiags.Diagnostics) )) } - if val := obj.GetAttr("region"); val.IsNull() { + if val := obj.GetAttr("region"); val.IsNull() || val.AsString() == "" { if os.Getenv("AWS_REGION") == "" && os.Getenv("AWS_DEFAULT_REGION") == "" { diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, diff --git a/internal/backend/remote-state/s3/backend_test.go b/internal/backend/remote-state/s3/backend_test.go index 6662ad4dfe..b9c8e51d60 100644 --- a/internal/backend/remote-state/s3/backend_test.go +++ b/internal/backend/remote-state/s3/backend_test.go @@ -614,11 +614,17 @@ func TestBackendConfig_PrepareConfigValidation(t *testing.T) { b := New() _, valDiags := b.PrepareConfig(populateSchema(t, b.ConfigSchema(), tc.config)) - if valDiags.Err() != nil && tc.expectedErr != "" { - actualErr := valDiags.Err().Error() - if !strings.Contains(actualErr, tc.expectedErr) { - t.Fatalf("unexpected validation result: %v", valDiags.Err()) + if tc.expectedErr != "" { + if valDiags.Err() != nil { + actualErr := valDiags.Err().Error() + if !strings.Contains(actualErr, tc.expectedErr) { + t.Fatalf("unexpected validation result: %v", valDiags.Err()) + } + } else { + t.Fatal("expected an error, got none") } + } else if valDiags.Err() != nil { + t.Fatalf("expected no error, got %s", valDiags.Err()) } }) } @@ -666,11 +672,17 @@ func TestBackendConfig_PrepareConfigWithEnvVars(t *testing.T) { }) _, valDiags := b.PrepareConfig(populateSchema(t, b.ConfigSchema(), tc.config)) - if valDiags.Err() != nil && tc.expectedErr != "" { - actualErr := valDiags.Err().Error() - if !strings.Contains(actualErr, tc.expectedErr) { - t.Fatalf("unexpected validation result: %v", valDiags.Err()) + if tc.expectedErr != "" { + if valDiags.Err() != nil { + actualErr := valDiags.Err().Error() + if !strings.Contains(actualErr, tc.expectedErr) { + t.Fatalf("unexpected validation result: %v", valDiags.Err()) + } + } else { + t.Fatal("expected an error, got none") } + } else if valDiags.Err() != nil { + t.Fatalf("expected no error, got %s", valDiags.Err()) } }) }