New to Kestra?
Use blueprints to kickstart your first workflows.
Schedule an hourly Kestra flow that downloads a ZIP over HTTP, unzips the CSV, and uploads it to Amazon S3 with a timestamped object key.
Automate hourly ingestion from any public HTTP endpoint into Amazon S3. This Kestra blueprint downloads a ZIP archive, extracts a CSV from it, and uploads the file to an S3 bucket under a date and time partitioned key, giving you a reproducible, append-only landing zone for downstream pipelines (Snowflake, Athena, DuckDB, dbt, Spark, Glue). It is the missing scheduler and orchestrator between an external data source and your S3 data lake: no cron jobs to babysit, no Lambda glue code, no ad hoc EC2 scripts.
io.kestra.plugin.core.trigger.Schedule trigger fires every hour using cron @hourly.get_zip_file runs io.kestra.plugin.core.http.Download to fetch the source ZIP archive over HTTPS. By default it pulls the Global Power Plant Database sample, but the URI is a one-line change.unzip runs io.kestra.plugin.compress.ArchiveDecompress with algorithm: ZIP against the downloaded file, exposing each extracted file as an internal storage URI on outputs.unzip.files.csv_upload runs io.kestra.plugin.aws.s3.Upload and pushes global_power_plant_database.csv to the bucket from inputs.bucket, using the key powerplant/{{ trigger.date ?? execution.startDate | date('yyyy_MM_dd__HH_mm_ss') }}.csv so every run lands in its own object.yyyy_MM_dd__HH_mm_ss) that are safe for backfills and replays.Amazon S3 has no scheduler, no retry engine, and no lineage. AWS EventBridge plus Lambda can trigger jobs, but you still end up writing and maintaining Python or Node glue, IAM roles, and CloudWatch wiring. Kestra gives you:
Schedule trigger and event-based triggers in one place.bucket input (defaults to declarative-data-orchestration).pluginDefaults for io.kestra.plugin.aws).This blueprint does not reference Kestra secret() values directly. For production, wire your AWS credentials through pluginDefaults or environment variables, for example AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, and keep them out of the flow YAML.
company.team.bucket input default to your S3 bucket.io.kestra.plugin.aws.s3.Upload task (instance profile or pluginDefaults).s3://<bucket>/powerplant/<timestamp>.csv.uri on get_zip_file for any public or authenticated HTTP endpoint (add headers for tokens).ArchiveDecompress with io.kestra.plugin.compress.ArchiveExtract for TAR or GZIP sources.io.kestra.plugin.aws.s3.List or Copy step to fan out to multiple buckets or regions.COPY INTO, Athena query, or dbt run right after the upload.io.kestra.plugin.core.trigger.Webhook to ingest on demand instead of on a clock.