New to Kestra?
Use blueprints to kickstart your first workflows.
Archive Azure Blob backups weekly with Kestra into dated prefixes, notify Slack, and gate the destructive retention cleanup behind human approval.
A backup process that runs unattended end to end, including the deletion step, is one bad prefix away from destroying data nobody can recover. This blueprint splits the two halves of a backup rotation: the archive copy runs fully automated every week, and only the genuinely destructive step, deleting backups past retention, waits for a named reviewer to resume the execution. Azure Storage's own geo-redundant replication (GRS or RA-GRS on the storage account) already handles copying the data to the paired region; this flow's job is the archive bookkeeping, the notification, and the approval gate around the one step that cannot be undone.
weekly io.kestra.plugin.core.trigger.Schedule fires every Sunday at 03:00.list_container (io.kestra.plugin.azure.storage.blob.List) enumerates the backups container, up to 1,000 blobs per run.loop_blobs (io.kestra.plugin.core.flow.Loop) iterates the listed blob names, and copy_to_archive (io.kestra.plugin.azure.storage.blob.Copy) copies each one into a dated archive/{{ execution.startDate | date('yyyy-MM-dd') }}/ prefix in the same container, an ordinary same-account copy the plugin genuinely supports.notify_archived posts the archived count to Slack, so the team sees the run happened before the approval step is even reached.approval_gate (io.kestra.plugin.core.flow.Pause) stops the execution. This is the one step in the whole flow that a human reviews, because it precedes the destructive delete.delete_expired (io.kestra.plugin.azure.storage.blob.DeleteList) only runs after a reviewer resumes the execution, removing blobs under the archive/expired/ prefix.Azure Storage lifecycle management policies can expire blobs automatically, but they cannot notify a team first, pause for a named human review, or tie the archive copy and the eventual cleanup to one execution history. Kestra runs the archive copy unattended, notifies Slack with the count, then uses a Pause task to stop before the one irreversible step, recording exactly who resumed it and when, all in one auditable execution.
backups container to archive.AZURE_STORAGE_CONNECTION, AZURE_STORAGE_ENDPOINT: Storage account credentials.SLACK_WEBHOOK_URL: Slack incoming webhook URL.container to your real backup container name.archive/expired/.weekly schedule trigger, and assign a reviewer who is expected to resume the execution after checking the Slack notification.copy_to_archive that spot-checks a sample blob's checksum before notifying.Flow trigger so archiving runs right after your primary backup job finishes.