New to Kestra?
Use blueprints to kickstart your first workflows.
Automate a weekly Azure Blob backup archive with Kestra. Copy blobs into a dated archive prefix, 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.archive_each_blob (io.kestra.plugin.core.flow.ForEach) 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.