
# 구성 리비전 복원

`POST /v1/config-revisions/{revision_id}:restore` · 권한 `config:write`, `config:read` 및 리비전 종류의 읽기 권한

리비전을 저장한 적용을 되돌리는 새 [계획](../config-plans/create.md)을 만듭니다. 아직 아무것도 변경되지 않습니다. 계획을 검토한 뒤 [`POST /v1/config-plans/{plan_id}:apply`](../config-plans/apply.md)로 적용하세요. 롤백도 다른 변경과 같은 계획 → 적용 경로를 거치므로, 같은 오래됨 검사, 삭제 확인, 시크릿 및 권한 규칙이 적용됩니다.

계획의 대상은 리비전입니다.

- 적용이 수정하거나 삭제한 리소스는 적용 전의 사양을 되돌려 받습니다. 삭제된 리소스는 다시 생성됩니다.
- 적용이 생성한 리소스는 삭제됩니다. 이 경우 계획에는 `prune: true`가 설정되고, 리비전 종류의 현재 모든 리소스를 포함합니다. 적용이 건드리지 않은 리소스는 `no_op`으로 계획되므로, 생성된 리소스만 삭제됩니다. 적용하려면 삭제가 포함된 모든 계획과 마찬가지로 `confirm_deletions`가 필요합니다.
- 리비전이 다루지 않는 종류는 변경되지 않습니다.

리비전에는 시크릿 값이 없습니다. 다시 생성되는 연결은 계획을 적용할 때 클라이언트 시크릿이 필요합니다(`requires_secret`, `secret_required` 경고). 원래 적용이 변경한 시크릿은 복원되지 않습니다.

## 요청

| 매개변수 | 설명 |
|---|---|
| `revision_id` | 리비전 ID, `cfgr_…`. [리비전 목록](list.md)에서 확인하세요. |

요청에는 본문이 없습니다. 빈 본문, `{}`, `null`은 허용되며, 어떤 필드든 거부됩니다. 재시도를 안전하게 하려면 `Idempotency-Key` 헤더를 보내세요.

## 응답

`201 Created`, `Location: /v1/config-plans/{plan_id}` 및 `Cache-Control: no-store` 포함. 본문은 [계획 생성 응답](../config-plans/create.md)과 같은 형식의 계획입니다. 계획은 1시간 동안 유효하며, 환경의 계획 요청 한도와 계획 할당량에 포함됩니다. 환경의 관리 로그 `config_plan.created` 항목에는 계획이 이 리비전에서 왔다는 기록이 남습니다.

## 오류

| HTTP | code | 발생 조건 |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | 본문이 비어 있지 않고, `{}`나 `null`도 아닙니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나, 잘못되었거나, 취소되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 계획이 필요로 하는 권한이 없습니다. `required_permissions`에 모두 나열됩니다. |
| 404 | `not_found` | 리비전이 없거나, 다른 환경에 속하거나, 90일보다 오래되었습니다. |
| 413 | `config_document_too_large` | 계획 문서가 5,000개 리소스 또는 10 MiB를 넘습니다. |
| 422 | `validation_failed` | 리비전을 더 이상 복원할 수 없습니다. 아래를 참고하세요. `errors[].pointer`는 리비전 내부(`/revision/<kind>/<key>/...`)를 가리킵니다. |
| 429 | `rate_limited` | 계획 요청 한도 또는 환경의 계획 할당량에 도달했습니다. `Retry-After` 기간 이후에 다시 시도하세요. |
| 503 | `service_unavailable` | 계획 처리 용량이 가득 찼거나 종속 서비스를 일시적으로 사용할 수 없습니다. `Retry-After` 기간 이후에 다시 시도하세요. |

| `errors[].code` | 의미 |
|---|---|
| `not_restorable` | `/revision_id`: 리비전이 더 이상 존재하지 않는 종류를 다룹니다. |
| `invalid` | 저장된 사양이 현재 구성 스키마와 더 이상 일치하지 않습니다. |
| `unresolved_reference` | 복원되는 리소스가 존재하지 않게 될 `key`를 참조합니다. |
| `key_in_use` | `key`가 이제 구성이 관리하지 않는 애플리케이션 또는 API에 속합니다. |
| `still_referenced` | `/revision/created`: 적용이 생성한 리소스를 남아 있는 리소스가 아직 참조합니다. |

## 예시

```bash
curl -X POST "https://api.eu.keenauth.com/v1/config-revisions/cfgr_01m4qpqtywfs7930tb6kqn5rc5:restore" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

keenauth config revisions restore cfgr_01m4qpqtywfs7930tb6kqn5rc5
keenauth config apply cfgp_01m4qpqtywfs7930tb6kqn5rc5
```
