• Martin Atkins's avatar
    backend/local: create local state file if backend write fails · 9cda3720
    Martin Atkins authored
    In the old remote state system we had the idea of a local backup, which
    is actually still present for the legacy backends but no longer applies
    for the new-style backends like the s3 backend.
    
    It's problematic when an apply runs for long enough that someone's
    time-limited AWS STS credentials expire and then Terraform fails and can't
    persist state to S3.
    
    To reduce the risk of lost state, here we add some extra fallback code
    for the local apply operation in particular. If either state writing
    or state persisting fail then we attempt to write the state to a special
    backup file errored.tfstate, and produce an error message that guides the
    user on how to retry uploading this state.
    
    In the unlikely event that we can't write to local disk either (e.g.
    permissions problems) we take a last-ditch attempt to dump the JSON onto
    stdout and advise the user to manually copy it into a file for import.
    If even that doesn't work for some reason, we assume a critical Terraform
    bug (JSON-serialization problem with states?) and bail out with an
    apologetic error message.
    
    This is implemented for the apply command in particular because this is
    the one command where new objects are created in real APIs that we don't
    want to lose track of. For other operations it's less bad to just generate
    a simple error message and have the user retry.
    
    This fixes #14298.
    9cda3720