Apache SeaTunnel
Overview
Apache SeaTunnel is a high-performance, distributed, massively parallel data integration and ETL engine. It moves data from sources to sinks (databases, files, message queues, object stores) using its own Zeta engine, a Hazelcast-based distributed runtime, so you do not need a separate Spark or Flink cluster to run pipelines.
The SecureAnyCloud image installs Apache SeaTunnel 2.3.13 from the official Apache binary distribution to /opt/seatunnel and installs OpenJDK 17 as the runtime. It runs the Zeta engine as a single-node standalone cluster under a dedicated seatunnel system user and ships the demo connector plugins (connector-fake, connector-console, connector-jdbc). Checkpoints, job history and sample output are kept on a dedicated Azure data disk at /var/lib/seatunnel.
What you get:
- Apache SeaTunnel 2.3.13 (Apache-2.0) from the official Apache binary distribution at
/opt/seatunnel. - The Zeta engine running as a
systemdservice (seatunnel.service) under a dedicated unprivilegedseatunneluser. - OpenJDK 17 (Ubuntu 24.04 main) as the JVM runtime.
- The
connector-fake,connector-consoleandconnector-jdbcplugins pre-installed. - A loopback-only Zeta REST API on
127.0.0.1:8080with a Hazelcast health endpoint, not exposed publicly. - Checkpoints, job history and durable sample output on a dedicated 30 GiB Azure data disk at
/var/lib/seatunnel. - Two bundled sample jobs: FakeSource to Console, and FakeSource to local file.
- 24/7 SecureAnyCloud support.
This is an internal data-plane engine. The Zeta REST API and Hazelcast cluster port listen on 127.0.0.1 only, and SeaTunnel has no built-in authentication, so loopback is the security boundary. The port is not opened to the internet. Run jobs locally on the VM, or reach the REST API over an SSH tunnel.
Prerequisites
Before you deploy this image, make sure you have:
- An active Azure subscription.
- An SSH key pair.
- A VNet and subnet in the target region.
- A VM size of Standard_B4ms (4 vCPU / 16 GiB RAM), which is a good starting point for the JVM-based Zeta engine.
- An NSG inbound rule that allows
22/tcpfrom your management network. No inbound application ports are needed, because you reach the engine locally or over the SSH tunnel.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Apache SeaTunnel by SecureAnyCloud, and select Create.
On Basics, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) only.
Then choose Review + create and Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:apache-seatunnel-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name seatunnel \
--image sac1647283583153:apache-seatunnel-ubuntu-24-04:default:latest \
--size Standard_B4ms \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku StandardStep 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm SeaTunnel is installed and the engine is running
ls /opt/seatunnel/starter/seatunnel-starter.jar systemctl is-active seatunnel.serviceThe output shows the Zeta starter jar and active:
/opt/seatunnel/starter/seatunnel-starter.jar activeStep 5 - Read the per-VM endpoint notes
Each VM writes its endpoint details to an information file on first boot. SeaTunnel has no per-VM secret, because it has no built-in authentication. Print the file with:
cat /var/lib/sac/data/apache-seatunnel-endpoints.notesThe file records SEATUNNEL_HOME, the loopback REST endpoint, the cluster member port, the public IP, and the SSH-tunnel guidance.
Step 6 - Check the Zeta engine REST health endpoint
The Zeta engine exposes a REST overview endpoint on 127.0.0.1:8080. When the node is up, it returns HTTP 200 with the engine version and worker count:
curl -s http://127.0.0.1:8080/overview{"projectVersion":"2.3.13","gitCommitAbbrev":"a399ae8","totalSlot":"...","runningJobs":"0","finishedJobs":"0","failedJobs":"0","workers":"1"}The REST API binds to loopback only and is never exposed to the internet.
Step 7 - Review the bundled sample job
A sample FakeSource to Console job ships at /opt/seatunnel/config/sac-sample.streaming.conf. It generates rows with the FakeSource connector and prints them with the Console sink. Review it with:
cat /opt/seatunnel/config/sac-sample.streaming.confenv { parallelism = 1 job.mode = "BATCH" } source { FakeSource { row.num = 10 schema = { fields { id = "int" name = "string" score = "double" } } } } sink { Console { } }Step 8 - Run the sample job
Run the FakeSource to Console job through bin/seatunnel.sh in local mode. It submits the job to the engine, processes the rows and prints a completion summary:
sudo -u seatunnel /opt/seatunnel/bin/seatunnel.sh --config /opt/seatunnel/config/sac-sample.streaming.conf -m local 2>&1 | tail -20The job reaches a finished state, and the summary reports the read and write row counts:
*********************************************** Job Statistic Information *********************************************** Start Time : ... End Time : ... Total Time(s) : ... Total Read Count : 10 Total Write Count : 10 Total Failed Count : 0 ***********************************************Step 9 - Produce durable output on the data disk
A second sample job writes rows to a local-file sink under /var/lib/seatunnel/sample-output on the dedicated data disk. Run the job, then list the output:
sudo -u seatunnel /opt/seatunnel/bin/seatunnel.sh --config /opt/seatunnel/config/sac-sample.file.conf -m local 2>&1 | tail -5 find /var/lib/seatunnel/sample-output -type fThe job writes JSON rows to a file on the data disk. The output survives reboots, and you can resize the volume independently.
Step 10 - Connect to the REST API remotely over an SSH tunnel
The Zeta REST API listens on 127.0.0.1:8080 only and is not exposed publicly. This is the secure default. To reach it from your workstation, open an SSH tunnel and point a local client at localhost:8080:
# On your workstation:
ssh -L 8080:127.0.0.1:8080 azureuser@<vm-public-ip>
# In another terminal:
curl http://127.0.0.1:8080/overview
# -> {"projectVersion":"2.3.13",...}SeaTunnel has no built-in authentication, so never expose 8080 to the internet without an authenticating reverse proxy or a private NIC.
Maintenance
- Data: checkpoints, job history and the sample output live on the dedicated data disk at
/var/lib/seatunnel. Engine state survives reboots, and you can resize the volume independently. - Connectors: add more connector plugins by listing them in
/opt/seatunnel/config/plugin_configand runningsudo -u seatunnel /opt/seatunnel/bin/install-plugin.sh 2.3.13. Then restart the engine. - Tuning: edit
/opt/seatunnel/config/seatunnel.yaml(for example the checkpoint interval or slot service) and runsudo systemctl restart seatunnel.service. - Security patches: unattended-upgrades remains enabled, so the OS continues to receive security updates automatically.
- Security boundary: the REST API and cluster port bind to loopback only, and SeaTunnel has no built-in authentication. Keep
8080off the public internet and reach it over the SSH tunnel.
Support
SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.
Apache SeaTunnel and the Apache feather logo are trademarks of The Apache Software Foundation. This image is provided by SecureAnyCloud and is not affiliated with or endorsed by The Apache Software Foundation.
Deploy on Azure
Launch Apache SeaTunnel on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Apache SeaTunnel is an open source, high-performance, distributed data integration and ETL platform. It moves and transforms data across a very large catalogue of sources and sinks, including relational databases, files, object stores and message queues. It uses its own built-in distributed engine (Zeta), so you do not need a separate Apache Spark or Apache Flink cluster to run production data pipelines.
You define jobs declaratively in configuration files and submit them through a command line client or the engine's REST API.
What you get:
- Apache SeaTunnel 2.3.13, installed from the official Apache binary distribution under
/opt/seatunneland running on OpenJDK 17. - The Zeta engine as a standalone single-node cluster, supervised by systemd as the
seatunnel.serviceunit under a dedicated unprivilegedseatunnelservice account. - An authenticated HTTPS endpoint on port 443 as the only way to reach the engine from off the instance.
- Per-instance credentials, a TLS certificate and a cluster secret, generated on first boot.
- A dedicated EBS data volume for checkpoints, job history, job logs and job output.
The engine is never exposed unauthenticated
The Zeta engine's REST API can submit and run arbitrary data jobs, which makes it high privilege, and SeaTunnel's REST API has no built-in authentication. This image therefore never exposes it directly:
- The Zeta REST API (port 8080) and the Hazelcast cluster member port (5801) bind the loopback interface only. A host firewall (nftables) additionally drops any non-loopback traffic to those ports, and neither port is opened in the security group.
- An nginx reverse proxy on port 443 fronts the REST API over HTTPS with HTTP Basic authentication (user
admin). This authenticated HTTPS endpoint is the only way to reach the engine from off the instance. - The only inbound ports are SSH (22) and the authenticated HTTPS endpoint (443).
Per-instance credentials
The admin password, the TLS certificate and the Hazelcast cluster join secret are all generated fresh on the first boot of every deployed instance. Two instances launched from the same Amazon Machine Image never share a password, a certificate or a cluster secret, and no usable default credential ships in the image.
The generated password is written to /root/seatunnel-credentials.txt with mode 0600, so that only the root user can read it.
Data volume
Checkpoints, job history, job logs and job output live on a dedicated EBS data volume mounted at /var/lib/seatunnel. The volume is separate from the operating system disk, so you can resize the data tier independently and checkpoint state survives restarts.
Prerequisites
Before you deploy this image, make sure you have:
- An Amazon Web Services account where you can launch EC2 instances.
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products.
- An EC2 key pair in the target Region for SSH access to the instance.
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network and inbound port 443 from the trusted networks that will reach the REST API.
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line.
Launch the Instance from the AWS Marketplace
- Open the product page in the AWS Marketplace. Choose Continue to Subscribe, then Continue to Configuration.
- Select the Region and the delivery option (the Ubuntu 24.04 AMI), then choose Continue to Launch.
- Choose an instance type. Apache SeaTunnel's Zeta engine is a JVM application, so
m5.large(2 vCPU, 8 GiB RAM) is a sensible starting point. Scale up for heavier pipelines. - Select your VPC, subnet and key pair.
- Configure the security group to allow inbound TCP 22 (SSH) and TCP 443 (HTTPS REST API) from your trusted source ranges only. Do not open these ports to
0.0.0.0/0in production. - Launch the instance.
Launch from the AWS CLI (Alternative)
If you prefer the command line, launch the AMI directly. Replace the example identifiers with values for your account and Region.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <your-key-pair> \
--security-group-ids <your-security-group-id> \
--subnet-id <your-subnet-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=apache-seatunnel}]'Connect to the Instance over SSH
Connect as the default login user for your operating system variant. The password, the cluster secret and the TLS certificate are generated on first boot, so allow a minute or two after launch before the REST API answers.
OS variant SSH login user
Ubuntu 24.04 ubuntu
ssh -i /path/to/your-key.pem ubuntu@<public-ip>Retrieve Your Per-Instance Credentials
The first boot service writes the generated admin password to a root-only file. Retrieve it with:
sudo cat /root/seatunnel-credentials.txtThe file shows the REST endpoint, the admin user and the unique password for this instance:
SEATUNNEL_REST_URL=https://<public-ip>/overview SEATUNNEL_REST_USER=admin SEATUNNEL_REST_PASSWORD=<generated-per-instance> SEATUNNEL_HOME=/opt/seatunnel SEATUNNEL_DATA=/var/lib/seatunnelConfirm the Engine Is Running
systemd supervises the Zeta engine. Confirm that the engine and the HTTPS front are active:
systemctl is-active seatunnel.service nginx.serviceactive activeThe engine exposes a status endpoint on the loopback interface. From the instance itself, query it directly:
curl -s http://127.0.0.1:8080/overview{ "projectVersion": "2.3.13", "gitCommitAbbrev": "a399ae8", "totalSlot": "0", "unassignedSlot": "0", "runningJobs": "0", "finishedJobs": "0", "failedJobs": "0", "pendingJobs": "0", "cancelledJobs": "0", "workers": "1" }Reach the REST API over HTTPS
From off the instance, the engine is reachable only through the authenticated HTTPS reverse proxy. Requests without valid credentials are refused with 401:
# No credentials -> refused curl -sk -o /dev/null -w '%{http_code}\n' https://<public-ip>/overview
# 401
# With the per instance admin credential -> accepted curl -sk -u admin:<password> https://<public-ip>/overview
# {"projectVersion":"2.3.13", ...}The certificate is self-signed and unique to this instance, so you must use curl -k or import the certificate into your trust store.
For production, place your own TLS certificate at /etc/nginx/ssl/seatunnel.crt and /etc/nginx/ssl/seatunnel.key and reload nginx. Keep port 443 restricted to trusted source ranges in your security group.
Run Your First Data Pipeline
The image ships two ready-to-run sample jobs so you can confirm an end-to-end ETL round trip immediately. Both use a FakeSource that generates deterministic rows.
Run the FakeSource to Console job (10 rows) in local mode:
sudo -u seatunnel /opt/seatunnel/bin/seatunnel.sh \
--config /opt/seatunnel/config/sac-sample.streaming.conf -m localThe engine prints a job statistic summary confirming the rows processed:
Job Statistic Information Start Time : 2026-07-24 21:30:43 End Time : 2026-07-24 21:30:47 Total Time(s) : 3 Total Read Count : 10 Total Write Count : 10 Total Failed Count : 0The second sample writes durable JSON output to the data volume:
sudo -u seatunnel /opt/seatunnel/bin/seatunnel.sh \
--config /opt/seatunnel/config/sac-sample.file.conf -m local ls -l /var/lib/seatunnel/sample-output/Build Your Own Jobs
A SeaTunnel job is a single configuration file with three sections: env, source and sink, with optional transform steps. Create your own under /opt/seatunnel/config/ and submit it the same way:
sudo -u seatunnel /opt/seatunnel/bin/seatunnel.sh --config /opt/seatunnel/config/my-job.conf -m localThe image ships only redistributable, Apache-2.0-licensed connectors: connector-fake, connector-console, connector-jdbc (the JDBC framework) and connector-file-local.
To add any other SeaTunnel connector, list it in /opt/seatunnel/config/plugin_config and run /opt/seatunnel/bin/install-plugin.sh 2.3.13.
Adding a proprietary JDBC driver
To keep the image redistributable, no proprietary database driver (for example Oracle ojdbc or MySQL Connector/J) is bundled. When you use the JDBC connector with such a database, download the vendor driver JAR yourself and place it in /opt/seatunnel/lib. Then restart the engine:
sudo cp mysql-connector-j-8.x.x.jar /opt/seatunnel/lib/
sudo chown seatunnel:seatunnel /opt/seatunnel/lib/mysql-connector-j-8.x.x.jar
sudo systemctl restart seatunnel.serviceData Volume Layout
The dedicated EBS data volume is mounted at /var/lib/seatunnel by filesystem UUID, so it survives reboots and re-launch:
Path Contents
/var/lib/seatunnel/checkpoint Zeta engine checkpoint storage
/var/lib/seatunnel/logs Engine job logs
/var/lib/seatunnel/sample-output Output written by the sample local-file job
/opt/seatunnel holds the binaries and configuration (config/seatunnel.yaml, config/hazelcast.yaml).
To grow the data tier, expand the EBS volume in the console and run sudo resize2fs /dev/nvme1n1.
Security Hardening
- Keep the engine off the public network. Ports 8080 and 5801 bind loopback only, and the host firewall drops traffic to them from any non-loopback source. Keep it that way.
- Restrict port 443. In the security group, allow inbound 443 only from the specific CIDRs that need the REST API.
- Bring your own TLS certificate for production instead of the per-instance self-signed certificate. Consider fronting the endpoint with an Application Load Balancer that terminates TLS.
- Rotate the admin password by re-running the first boot rotation, or update the nginx htpasswd directly with
sudo htpasswd /etc/nginx/.seatunnel_htpasswd admin, then runsudo systemctl reload nginx. - Restrict SSH to your management network.
Backups
Take periodic EBS snapshots of the data volume (/var/lib/seatunnel) to preserve checkpoint state and job output. Keep the job configuration files under /opt/seatunnel/config in your own version control.
Troubleshooting
- The REST API returns 401 with the right password. Confirm that you are using the
adminuser and the exact password from/root/seatunnel-credentials.txt, and that first boot has completed (test -f /var/lib/sac/data/apache-seatunnel-firstboot.done). - A job fails with a driver error. Confirm that the vendor JDBC driver JAR is present in
/opt/seatunnel/liband that you restartedseatunnel.serviceafterwards. - Inspect the engine logs. Run
sudo journalctl -u seatunnel.service -n 200 --no-pager, and read the per-job logs under/var/lib/seatunnel/logs.
Support
This Amazon Machine Image is provided by SecureAnyCloud with 24/7 technical support by email and live chat. Our engineers assist with SeaTunnel deployment, connector and job configuration, engine tuning and upgrades. Critical issues receive a one-hour average response time. Contact sales@secureanycloud.com.
Apache SeaTunnel, SeaTunnel and Apache are trademarks of the Apache Software Foundation. All other product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Apache SeaTunnel on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com