New to Kestra?
Use blueprints to kickstart your first workflows.
Download a zip archive, unzip it, and upload every extracted file to Amazon S3 concurrently with Kestra. Declarative YAML, parallel tasks, no boilerplate.
Loading many files into Amazon S3 one after another is slow and brittle: a large archive can hold dozens of objects, and a sequential upload leaves throughput on the table while each request waits its turn. This blueprint downloads a remote zip archive, decompresses it, and uploads every extracted file to an S3 bucket concurrently, turning a multi-step manual chore into a single declarative workflow you can schedule, retry, and reuse.
get_zip_file (io.kestra.plugin.core.http.Download) fetches a remote zip archive over HTTP and stores it in Kestra internal storage.unzip (io.kestra.plugin.compress.ArchiveDecompress) decompresses the archive using the ZIP algorithm and exposes each extracted file through outputs.unzip.files.parallel_upload_to_s3 (io.kestra.plugin.core.flow.Parallel) runs three io.kestra.plugin.aws.s3.Upload tasks at the same time, sending the CSV, PDF, and TXT files to keyed paths under powerplant/ in the target bucket.pluginDefaults block applies the AWS credentials, region, and bucket to every Upload task so you never repeat connection settings.bucket input (defaulting to declarative-data-orchestration) so the same flow targets any bucket.pluginDefaults, keeping each task clean.S3 has no native scheduler or workflow engine. Kestra adds event and schedule triggers, automatic retries on transient network or API failures, parallel execution out of the box, and full lineage across the download, unzip, and upload steps. Everything is declared in readable YAML and versioned in Git, so the pipeline is reproducible rather than buried in a one-off script.
AWS_ACCESS_KEY_ID: AWS access key with s3:PutObject permission on the target bucket.AWS_SECRET_ACCESS_KEY: matching AWS secret access key.AWS_DEFAULT_REGION: the region where the bucket lives, for example us-east-1.AWS_DEFAULT_REGION.bucket input to your bucket name (or keep the default).get_zip_file at your own archive and update the file keys in the parallel tasks.Upload tasks inside parallel_upload_to_s3 as your archive grows.Parallel for io.kestra.plugin.core.flow.ForEach to upload a dynamic list of extracted files.