diff --git a/.changelog/41678.txt b/.changelog/41678.txt new file mode 100644 index 000000000000..750b93ff1e49 --- /dev/null +++ b/.changelog/41678.txt @@ -0,0 +1,7 @@ +```release-note:enhancement +resource/aws_account_region: Prevent errors when the region is an ENABLING or DISABLING state during creation +``` + +```release-note:enhancement +resource/aws_account_region: Allow adoption of regions in an ENABLED or DISABLED state without an explicit import operation +``` diff --git a/internal/service/account/region.go b/internal/service/account/region.go index 42b500dab00c..e37b53673fef 100644 --- a/internal/service/account/region.go +++ b/internal/service/account/region.go @@ -91,6 +91,11 @@ func resourceRegionUpdate(ctx context.Context, d *schema.ResourceData, meta inte timeout = d.Timeout(schema.TimeoutUpdate) } + status, err := findRegionOptStatus(ctx, conn, accountID, region) + if err != nil { + return sdkdiag.AppendErrorf(diags, "reading Account Region status: %s", err) + } + if v := d.Get(names.AttrEnabled).(bool); v { input := account.EnableRegionInput{ RegionName: aws.String(region), @@ -99,10 +104,11 @@ func resourceRegionUpdate(ctx context.Context, d *schema.ResourceData, meta inte input.AccountId = aws.String(accountID) } - _, err := conn.EnableRegion(ctx, &input) - - if err != nil { - return sdkdiag.AppendErrorf(diags, "enabling Account Region (%s): %s", id, err) + if requiresStatusChange(status.RegionOptStatus, true) { + _, err := conn.EnableRegion(ctx, &input) + if err != nil { + return sdkdiag.AppendErrorf(diags, "enabling Account Region (%s): %s", id, err) + } } if _, err := waitRegionEnabled(ctx, conn, accountID, region, timeout); err != nil { @@ -116,10 +122,11 @@ func resourceRegionUpdate(ctx context.Context, d *schema.ResourceData, meta inte input.AccountId = aws.String(accountID) } - _, err := conn.DisableRegion(ctx, &input) - - if err != nil { - return sdkdiag.AppendErrorf(diags, "enabling Account Region (%s): %s", id, err) + if requiresStatusChange(status.RegionOptStatus, false) { + _, err := conn.DisableRegion(ctx, &input) + if err != nil { + return sdkdiag.AppendErrorf(diags, "disabling Account Region (%s): %s", id, err) + } } if _, err := waitRegionDisabled(ctx, conn, accountID, region, timeout); err != nil { @@ -208,7 +215,6 @@ func waitRegionEnabled(ctx context.Context, conn *account.Client, accountID, reg Target: enum.Slice(types.RegionOptStatusEnabled), Refresh: statusRegionOptStatus(ctx, conn, accountID, region), Timeout: timeout, - Delay: 1 * time.Minute, PollInterval: 30 * time.Second, } @@ -227,7 +233,6 @@ func waitRegionDisabled(ctx context.Context, conn *account.Client, accountID, re Target: enum.Slice(types.RegionOptStatusDisabled), Refresh: statusRegionOptStatus(ctx, conn, accountID, region), Timeout: timeout, - Delay: 1 * time.Minute, PollInterval: 30 * time.Second, } @@ -239,3 +244,10 @@ func waitRegionDisabled(ctx context.Context, conn *account.Client, accountID, re return nil, err } + +func requiresStatusChange(status types.RegionOptStatus, enable bool) bool { + if enable { + return status != types.RegionOptStatusEnabled && status != types.RegionOptStatusEnabling + } + return status != types.RegionOptStatusDisabled && status != types.RegionOptStatusDisabling +}