curl --request PATCH \
--url https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Nightly snapshots of the database volume",
"enabled": false,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"tags": {
"environment": "production",
"team": "backend"
}
}
'import requests
url = "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}"
payload = {
"description": "Nightly snapshots of the database volume",
"enabled": False,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"tags": {
"environment": "production",
"team": "backend"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Nightly snapshots of the database volume',
enabled: false,
interval_minutes: 1440,
retention_count: 7,
retention_days: 30,
tags: {environment: 'production', team: 'backend'}
})
};
fetch('https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Nightly snapshots of the database volume',
'enabled' => false,
'interval_minutes' => 1440,
'retention_count' => 7,
'retention_days' => 30,
'tags' => [
'environment' => 'production',
'team' => 'backend'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}"
payload := strings.NewReader("{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}"
response = http.request(request)
puts response.read_body{
"snapshot_policy": {
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"id": "3c9f1b2e-6d4a-4e8b-9f1c-2a3b4c5d6e7f",
"crn": "crn:storage:sa-saopaulo-1:my-account:snapshot-policy/nightly",
"volume_id": "5f8d2c1a-9b3e-4d7a-8c6f-1e2a3b4c5d6e",
"name": "nightly",
"description": "Nightly snapshots of the database volume",
"enabled": true,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"next_run_at": "2026-01-16T00:00:00Z",
"last_run_at": "2026-01-15T00:00:00Z",
"tags": {
"environment": "production",
"team": "backend"
},
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:30:00Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Actualizar la política de instantáneas
Cambie la programación, la ventana de retención o ponga en pausa la directiva. Cambiar interval_minutes re-bases la próxima ejecución ahora.
curl --request PATCH \
--url https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Nightly snapshots of the database volume",
"enabled": false,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"tags": {
"environment": "production",
"team": "backend"
}
}
'import requests
url = "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}"
payload = {
"description": "Nightly snapshots of the database volume",
"enabled": False,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"tags": {
"environment": "production",
"team": "backend"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Nightly snapshots of the database volume',
enabled: false,
interval_minutes: 1440,
retention_count: 7,
retention_days: 30,
tags: {environment: 'production', team: 'backend'}
})
};
fetch('https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Nightly snapshots of the database volume',
'enabled' => false,
'interval_minutes' => 1440,
'retention_count' => 7,
'retention_days' => 30,
'tags' => [
'environment' => 'production',
'team' => 'backend'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}"
payload := strings.NewReader("{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://storage.{region}.basaltic.sh/v1/snapshot-policies/{policy_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Nightly snapshots of the database volume\",\n \"enabled\": false,\n \"interval_minutes\": 1440,\n \"retention_count\": 7,\n \"retention_days\": 30,\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}"
response = http.request(request)
puts response.read_body{
"snapshot_policy": {
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"id": "3c9f1b2e-6d4a-4e8b-9f1c-2a3b4c5d6e7f",
"crn": "crn:storage:sa-saopaulo-1:my-account:snapshot-policy/nightly",
"volume_id": "5f8d2c1a-9b3e-4d7a-8c6f-1e2a3b4c5d6e",
"name": "nightly",
"description": "Nightly snapshots of the database volume",
"enabled": true,
"interval_minutes": 1440,
"retention_count": 7,
"retention_days": 30,
"next_run_at": "2026-01-16T00:00:00Z",
"last_run_at": "2026-01-15T00:00:00Z",
"tags": {
"environment": "production",
"team": "backend"
},
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:30:00Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}storage:UpdateSnapshotPolicy. Consulte permisos de almacenamiento para obtener la lista completa, lo que cubre cada una y un ejemplo de política.Autorizaciones
Un token bearer de OAuth 2.0, enviado como Authorization: Bearer <token>. Esta es la forma recomendada de autenticación.
Obtén el token intercambiando el par de claves de acceso de una cuenta de servicio en POST /v1/oauth/token con grant_type=client_credentials. Es el flujo estándar de credenciales de cliente; las bibliotecas compatibles con OAuth pueden obtener y renovar el token por ti.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Los tokens duran una hora por defecto. El mismo par de claves de acceso también sirve como credencial AWS SigV4 para el endpoint de objetos compatible con S3, que solo acepta ese método de autenticación.
Parámetros de ruta
ID de la política de instantáneas
Cuerpo
Los nombres se fijan en la creación porque forman el CRN utilizado por las directivas de IAM. El envío de nombre en una actualización, incluyendo un valor sin cambios, vacío o nulo, devuelve un error de validación. Semántica PATCH — un campo omitido mantiene su valor actual. Cambiar interval_minutes re-bases la siguiente ejecución ahora, por lo que acortar un horario diario a cada hora tiene efecto dentro de la hora.
"Nightly snapshots of the database volume"
false pausa la política, true la reanuda. Al pausar, se detiene toda la política: no se toman instantáneas ni se elimina ninguna, por lo que una programación en pausa no puede perder el historial. Reanudar aplica la ventana de retención de nuevo en la siguiente ejecución, por lo que cualquier cosa que se encuentre fuera de ella para entonces — porque bajaste retention_count mientras estabas en pausa, por ejemplo — se cosecha en esa ejecución.
false
Minutos entre instantáneas: un intervalo mínimo, no una cadencia exacta. Un pase periódico toma lo que haya vencido y re-basea la siguiente ejecución de cada política desde el momento en que se ejecutó, por lo que una instantánea aterriza en o después de interval_minutes y nunca antes, y puede aterrizar un minuto o dos más tarde cuando el pase está ocupado. Una ventana que el pase no consigue cuesta una instantánea en lugar de producir una ráfaga de recuperación después.
El mínimo es de un minuto, porque ese paso es lo que evalúa el horario y nada más fino puede ser honrado; el máximo es de 30 días. snapshots Por lo tanto, elija el intervalo más grande que cumpla con su objetivo de punto de recuperación.
1 <= x <= 432001440
Cuántas instantáneas de esta política se deben conservar. Cuando un incendio lleva la cuenta más allá de esto, el más viejo va primero.
1 <= x <= 2567
Opcional edad limitada, aplicada encima de retention_count: se recoge una instantánea fuera de la ventana EITHER. 0 significa que no hay edad limitada. La única instantánea más reciente está exenta de la edad limitada, por lo que un volumen que no se pudo instantanear durante más tiempo que la ventana nunca pierde todo su historial.
0 <= x <= 365030
Show child attributes
Show child attributes
{
"environment": "production",
"team": "backend"
}
Respuesta
Política de instantáneas actualizada
Un programa adjunto a un volumen: tomar una instantánea cada interval_minutes, luego mantener como máximo retention_count de las instantáneas creadas por esta política.
La retención solo elimina las instantáneas que la propia política ha creado (las que llevan su snapshot_policy_id) — una instantánea tomada a mano nunca se recoge. Tampoco elimina nunca una instantánea de la que algo depende: una instantánea de la que se creó un volumen, incluida una restauración todavía en curso, se omite y se vuelve a examinar más tarde.
Show child attributes
Show child attributes

