<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MoveInfra]]></title><description><![CDATA[MoveInfra]]></description><link>https://moveinfra.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 10:02:19 GMT</lastBuildDate><atom:link href="https://moveinfra.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[DigitalOcean to UpCloud, Scaleway or Hetzner: a simple move]]></title><description><![CDATA[Moving from DigitalOcean to UpCloud, Scaleway, or Hetzner is straightforward because DigitalOcean relies on open standards like Linux, PostgreSQL, and]]></description><link>https://moveinfra.hashnode.dev/digitalocean-to-upcloud-scaleway-or-hetzner-a-simple-move</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/digitalocean-to-upcloud-scaleway-or-hetzner-a-simple-move</guid><category><![CDATA[DigitalOcean]]></category><category><![CDATA[upcloud]]></category><category><![CDATA[scaleway]]></category><category><![CDATA[Hetzner]]></category><category><![CDATA[Cloud Migration]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:24:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/c2e26386-42a7-4e78-a6c5-f1c50994993a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/digitalocean-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Moving from DigitalOcean to a European cloud provider like UpCloud, Scaleway, or Hetzner is one of the most straightforward infrastructure projects a small engineering team can undertake. Unlike the big US hyperscalers, DigitalOcean is built around standard, open-source primitives: Linux virtual machines, standard PostgreSQL and MySQL databases, S3-compatible object storage, and upstream Kubernetes. Because your applications are rarely tied to proprietary APIs, you do not need to rewrite your software to leave. You can replicate your setup on an EU-owned provider, synchronize your data over the network, and switch your traffic over a single planned maintenance window.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Low technical lock-in:</strong> DigitalOcean Droplets, Managed Databases, and Spaces map directly to standard services on European clouds without code changes.</li>
<li><strong>Three distinct EU targets:</strong> UpCloud offers a very similar developer experience with high-performance storage; Scaleway provides the broadest ecosystem of managed services and serverless tools; Hetzner delivers the lowest compute prices if you are willing to manage databases and Kubernetes yourself.</li>
<li><strong>App Platform requires a choice:</strong> If you use DigitalOcean App Platform, you will either move to Scaleway Serverless Containers or transition to a standard container setup using Docker or Kubernetes.</li>
<li><strong>Egress costs are manageable:</strong> Most DigitalOcean plans include a generous outbound data transfer pool, and under the EU Data Act, switching egress fees are capped at provider cost until January 12, 2027, when they are banned entirely.</li>
</ul>
<h2>Why leaving DigitalOcean is simpler than leaving a hyperscaler</h2>
<p>When companies migrate away from AWS, Google Cloud, or Azure, they spend most of their time untangling proprietary services. An application built on AWS often relies on IAM roles for internal authentication, DynamoDB for data storage, SQS for queuing, and Lambda for compute. Moving that application requires rewriting code and redesigning how services talk to each other.</p>
<p>DigitalOcean was designed differently. It became popular with startups and small teams specifically because it avoided that complexity. When you deploy on DigitalOcean, you are usually using standard Linux virtual machines (Droplets), standard open-source databases (PostgreSQL, MySQL, Redis/Valkey), an S3-compatible object store (Spaces), and standard Kubernetes (DOKS).</p>
<p>For a European company looking to bring its infrastructure under EU jurisdiction, this architecture is an advantage. Your application code speaks standard protocols: TCP/IP, SQL, Redis protocol, and the S3 HTTP API. European cloud providers speak these exact same protocols. </p>
<p>Instead of an application refactoring project, a move from DigitalOcean to Europe is a pure infrastructure migration. You build an equivalent environment on the new provider, copy your data, update your deployment pipelines, and switch your DNS records.</p>
<h2>Choosing your destination: UpCloud, Scaleway, or Hetzner</h2>
<p>European cloud infrastructure has matured significantly. For teams leaving DigitalOcean, three providers stand out depending on your budget, your reliance on managed services, and how much operations work your team wants to do.</p>
<h3>UpCloud: the closest match for DigitalOcean teams</h3>
<p>Headquartered in Finland, UpCloud is built for small and mid-sized engineering teams that want high reliability, predictable Euro billing, and a clean control panel without dozens of obscure services.</p>
<p>If your DigitalOcean setup consists of Droplets, Managed PostgreSQL or MySQL, Managed Redis/Valkey, Load Balancers, Managed Kubernetes, and Spaces, UpCloud has a direct one-to-one equivalent for every component. UpCloud is also well-known for its in-house MaxIOPS block storage, which offers noticeably faster disk read and write speeds than standard shared VPS storage. </p>
<p>For pricing, UpCloud offers entry-level Starter plans starting at approximately €3 per month for 1 vCPU and 1 GB of RAM as of 2026, alongside Cloud Native and High Performance tiers (check UpCloud's pricing page for current specifications and regional availability). UpCloud also includes zero-cost data egress under a fair transfer policy across its plans.</p>
<h3>Scaleway: the broadest managed ecosystem</h3>
<p>Based in France and part of the Iliad Group, Scaleway is the closest European equivalent to a full-featured cloud platform. Like UpCloud, it covers all the core DigitalOcean primitives: Virtual Instances, Managed Databases for PostgreSQL and MySQL, Managed Redis, Kubernetes Kapsule, Load Balancers, and S3-compatible Object Storage.</p>
<p>Scaleway stands out if your team uses higher-level platform services. If you rely on DigitalOcean Functions or DigitalOcean App Platform, Scaleway offers Serverless Functions, Serverless Containers, and Serverless Jobs. It also provides managed messaging and queuing systems, transactional email (TEM), and an integrated observability platform (Cockpit). If your team wants to minimize server maintenance and rely on managed platform tools, Scaleway is the strongest fit.</p>
<h3>Hetzner: maximum compute value for hands-on teams</h3>
<p>Based in Germany with data centers in Germany and Finland, Hetzner is famous across Europe for its price-to-performance ratio. If your primary goal is reducing your monthly infrastructure bill while keeping data in the EU, Hetzner is hard to beat.</p>
<p>However, there is a clear trade-off: Hetzner focuses strictly on core infrastructure. It provides Cloud Servers (VMs), Block Storage Volumes, Private Networks, Firewalls, Load Balancers, and S3-compatible Object Storage. <strong>Hetzner does not offer managed databases, managed Redis, or managed Kubernetes.</strong></p>
<p>If you move from DigitalOcean to Hetzner, any managed PostgreSQL clusters or DOKS (Kubernetes) clusters you currently run will need to be set up and maintained on Linux virtual machines. For teams with experienced DevOps or platform engineers, running PostgreSQL with automated backups or deploying a lightweight Kubernetes distribution (like k3s) on Hetzner VMs is routine. For teams without dedicated operations staff, the money saved on compute can easily be lost in engineering time spent managing database failovers and cluster upgrades.</p>
<h2>Service-by-service mapping</h2>
<p>The table below shows how DigitalOcean products map to UpCloud, Scaleway, and Hetzner.</p>
<table>
<thead>
<tr>
<th align="left">DigitalOcean Service</th>
<th align="left">UpCloud Equivalent</th>
<th align="left">Scaleway Equivalent</th>
<th align="left">Hetzner Equivalent</th>
<th align="left">Migration Complexity</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Droplets</strong> (Shared &amp; Dedicated)</td>
<td align="left">Cloud Servers (Starter, Cloud Native, High Performance)</td>
<td align="left">Virtual Instances (Development, General Purpose)</td>
<td align="left">Cloud Servers (Shared &amp; Dedicated vCPU)</td>
<td align="left"><strong>Low.</strong> Standard Linux VMs. Rebuild via Terraform or Ansible.</td>
</tr>
<tr>
<td align="left"><strong>Managed PostgreSQL / MySQL</strong></td>
<td align="left">Managed Databases (PostgreSQL, MySQL)</td>
<td align="left">Managed Databases for PostgreSQL and MySQL</td>
<td align="left"><em>No managed service.</em> Run on Cloud Servers (VMs).</td>
<td align="left"><strong>Low</strong> on UpCloud/Scaleway via logical replication. <strong>Medium</strong> on Hetzner (requires self-hosting setup).</td>
</tr>
<tr>
<td align="left"><strong>Managed Caching (Redis / Valkey)</strong></td>
<td align="left">Managed Valkey</td>
<td align="left">Managed Inference / Redis clusters</td>
<td align="left"><em>No managed service.</em> Run on Cloud Servers.</td>
<td align="left"><strong>Low.</strong> Often migrated by warming a new cache or syncing via replicaof.</td>
</tr>
<tr>
<td align="left"><strong>Spaces Object Storage</strong></td>
<td align="left">UpCloud Object Storage</td>
<td align="left">Scaleway Object Storage</td>
<td align="left">Hetzner Object Storage</td>
<td align="left"><strong>Low.</strong> All use the S3 API. Sync files with <code>rclone</code> and update endpoint URLs.</td>
</tr>
<tr>
<td align="left"><strong>Kubernetes (DOKS)</strong></td>
<td align="left">Managed Kubernetes (UKS)</td>
<td align="left">Kubernetes Kapsule / Kosmos</td>
<td align="left"><em>No managed service.</em> Run k3s/Talos on VMs.</td>
<td align="left"><strong>Low</strong> on UpCloud/Scaleway. Redeploy Helm charts and manifests. <strong>Medium</strong> on Hetzner.</td>
</tr>
<tr>
<td align="left"><strong>Load Balancers</strong></td>
<td align="left">Managed LoadBalancer</td>
<td align="left">Load Balancers</td>
<td align="left">Cloud Load Balancers</td>
<td align="left"><strong>Low.</strong> Recreate listeners, health checks, and TLS certificates.</td>
</tr>
<tr>
<td align="left"><strong>VPC &amp; Cloud Firewalls</strong></td>
<td align="left">SDN Private Networks &amp; Firewall</td>
<td align="left">VPC, Private Networks &amp; Security Groups</td>
<td align="left">Networks &amp; Cloud Firewalls</td>
<td align="left"><strong>Low.</strong> Translate IP ranges and port rules in Terraform.</td>
</tr>
<tr>
<td align="left"><strong>Volumes Block Storage</strong></td>
<td align="left">MaxIOPS / Standard Block Storage</td>
<td align="left">Block Storage (5K / 15K IOPS)</td>
<td align="left">Cloud Volumes</td>
<td align="left"><strong>Low.</strong> Attach new volumes and sync filesystem data with <code>rsync</code>.</td>
</tr>
<tr>
<td align="left"><strong>App Platform / Functions</strong></td>
<td align="left"><em>No direct PaaS.</em> Run on Kubernetes or Docker VMs.</td>
<td align="left">Serverless Containers &amp; Serverless Functions</td>
<td align="left"><em>No direct PaaS.</em> Run Coolify, Kamal, or Docker on VMs.</td>
<td align="left"><strong>Medium.</strong> Requires packaging apps as standard containers if not already containerized.</td>
</tr>
</tbody></table>
<h2>What about pricing and switching costs?</h2>
<p>Small teams often choose DigitalOcean for its predictable monthly pricing, where shared CPU Droplets start at approximately $4 to $7 per month and Spaces starts at a $5 per month base subscription as of 2026 (always check the provider's official pricing page for current rates).</p>
<p>When moving to an EU cloud, you gain two financial benefits:</p>
<ol>
<li><strong>Billing in Euros:</strong> For European companies, paying in USD introduces foreign exchange fees and monthly accounting variance. UpCloud, Scaleway, and Hetzner all bill natively in Euros.</li>
<li><strong>Lower or comparable resource costs:</strong> European providers are generally priced very competitively against US counterparts. Hetzner in particular often reduces raw compute and storage bills substantially, while UpCloud and Scaleway offer comparable or better performance per Euro spent, especially when factoring in network transfer.</li>
</ol>
<h3>Egress fees and the EU Data Act</h3>
<p>During a migration, you have to copy your databases and object storage over the internet to the new cloud provider. On some clouds, this outbound data transfer (egress) causes a painful final bill.</p>
<p>On DigitalOcean, this is rarely an issue for small and mid-sized teams. Droplets and Spaces plans include generous monthly outbound transfer allowances pooled across your account. Unless you are moving many terabytes of media files in a single month, your migration traffic will likely fit inside your existing included bandwidth pool.</p>
<p>Furthermore, European law protects companies switching cloud providers. Under Article 29 of the EU Data Act (Regulation (EU) 2023/2854), cloud providers may not charge switching fees—including data egress charges incurred to move to another provider—above their actual direct cost, and from January 12, 2027, all switching charges and switching egress fees are banned entirely across the EU.</p>
<h2>How to execute the migration: a 6-step checklist</h2>
<p>If you decide to move your DigitalOcean environment to UpCloud, Scaleway, or Hetzner, you do not need a six-month roadmap. Most small teams can complete the preparation in a few days and execute the switch during a quiet evening window.</p>
<h3>1. Inventory your DigitalOcean account</h3>
<ul>
<li>List all active Droplets, their CPU/RAM sizes, and any local data stored on their disks (outside of databases).</li>
<li>Check your Managed Databases: note the exact engine version (for example, PostgreSQL 15 or MySQL 8), database size, and extensions used.</li>
<li>Check Spaces buckets: note total storage size, public vs. private access permissions (ACLs), and whether you use the built-in Spaces CDN.</li>
<li>Document all Cloud Firewall rules, VPC subnet ranges, and Load Balancer health check settings.</li>
<li>Lower the TTL (Time-To-Live) on your DNS records to 60 or 300 seconds a few days before the cutover.</li>
</ul>
<h3>2. Provision the EU target environment as code</h3>
<ul>
<li>Even if you created your DigitalOcean resources by clicking around in the web console, use the migration as an opportunity to write Terraform (or OpenTofu) configurations for your new EU cloud. UpCloud, Scaleway, and Hetzner all maintain official, well-documented Terraform providers.</li>
<li>Create the private network, firewall rules, virtual machines, load balancers, and database clusters in your chosen EU region (such as Frankfurt, Amsterdam, Paris, Warsaw, or Helsinki).</li>
<li>Do not copy old virtual machine disk snapshots directly unless necessary. Instead, provision fresh Linux VMs on the EU cloud and deploy your application code to them.</li>
</ul>
<h3>3. Synchronize your object storage</h3>
<ul>
<li>Create the corresponding buckets on UpCloud, Scaleway, or Hetzner Object Storage.</li>
<li>Use a tool like <code>rclone</code> configured with both your DigitalOcean Spaces keys and your new EU S3 keys.</li>
<li>Run an initial background sync (<code>rclone sync</code> with checksum verification). Because this runs while your live application is still on DigitalOcean, it can take several hours or days without affecting users.</li>
<li>Just before cutover, you will run a final delta sync to catch any newly uploaded files.</li>
</ul>
<h3>4. Set up live database replication</h3>
<ul>
<li>Rather than taking your app offline for hours to run <code>pg_dump</code> and <code>pg_restore</code>, use logical replication (for PostgreSQL) or binary log replication (for MySQL).</li>
<li>Configure your new EU database to subscribe to changes from your DigitalOcean Managed Database over an encrypted connection, restricting access by IP address in your DigitalOcean database firewall.</li>
<li>Let the initial data copy complete, and verify that replication lag drops to near zero. Your EU database is now a live, up-to-date follower of your DigitalOcean database.</li>
</ul>
<h3>5. Point your CI/CD pipelines and test</h3>
<ul>
<li>Update your GitHub Actions, GitLab CI, or deployment scripts to deploy your application containers or binaries to the new EU servers or Kubernetes cluster.</li>
<li>Update your application's environment variables in the new environment so it points to the new EU database, the new Redis cache, and the new S3 object storage endpoints.</li>
<li>Test the new environment thoroughly using internal host file overrides or a staging domain before exposing it to public traffic.</li>
</ul>
<h3>6. Cut over traffic and keep a rollback path</h3>
<ul>
<li>Choose a low-traffic window for your users.</li>
<li>Put your application into a brief maintenance or read-only mode (so no new writes hit the DigitalOcean database).</li>
<li>Verify that database replication lag is zero and run a final fast <code>rclone</code> pass on your object storage.</li>
<li>Promote the EU database to be the primary writer.</li>
<li>Update your DNS records (or proxy targets in Cloudflare/bunny.net) to point to the new EU Load Balancer IP address.</li>
<li>Keep the old DigitalOcean environment running for a week or two (ideally with reverse replication configured if you need a fast rollback option) before deleting the old resources and closing out your bill.</li>
</ul>
<h2>Common pitfalls to watch out for</h2>
<p>Even in a simple migration, a few details can catch teams by surprise:</p>
<ul>
<li><strong>Hardcoded Spaces URLs:</strong> DigitalOcean Spaces URLs follow the pattern <code>bucket.region.digitaloceanspaces.com</code> (or <code>cdn.digitaloceanspaces.com</code>). If you stored full URLs in your database rows instead of relative paths, you will need to run a database migration script to update those strings, or use a custom domain for your object storage so the URL never changes again.</li>
<li><strong>Droplet metadata service:</strong> If your custom boot scripts query the DigitalOcean metadata IP (<code>169.254.169.254</code>) using DigitalOcean-specific JSON paths, you may need to adjust them to standard <code>cloud-init</code> formats used by UpCloud, Scaleway, and Hetzner.</li>
<li><strong>Database connection pools:</strong> DigitalOcean Managed Databases include built-in PgBouncer connection pooling configured in the control panel. Check how your target provider handles connection pooling (UpCloud and Scaleway offer managed pooling options, while on Hetzner you will need to install PgBouncer alongside PostgreSQL).</li>
<li><strong>SMTP port blocking:</strong> To prevent spam, DigitalOcean, UpCloud, Scaleway, and Hetzner all frequently block outbound ports 25, 465, and 587 by default on new accounts. If your servers send email directly or connect to an SMTP relay over those ports, request port unblocking from support <em>before</em> your migration night, or switch to an HTTP API or port 2525.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Will moving from DigitalOcean to an EU cloud require downtime?</h3>
<p>Most migrations require a short, planned write pause during the final cutover. Because your database and object storage are synchronized in the background while your app stays live, the actual cutover only requires pausing database writes, confirming replication lag is under a few seconds, promoting the new database, and switching DNS. For most small teams, this write pause takes between a few seconds and a few minutes.</p>
<h3>How do we migrate DigitalOcean App Platform?</h3>
<p>DigitalOcean App Platform is a Platform-as-a-Service (PaaS) that builds and runs code from your Git repository. If your app uses a Dockerfile, the easiest managed equivalent in Europe is Scaleway Serverless Containers. Alternatively, if you move to UpCloud or Hetzner, you can deploy your containers onto a Managed Kubernetes cluster (UpCloud) or use a lightweight deployment tool like Kamal, Docker Compose, or Coolify on a virtual machine.</p>
<h3>Can we keep Cloudflare in front of our new EU infrastructure?</h3>
<p>Yes, and doing so actually makes the cutover faster. If you proxy your traffic through Cloudflare (or a European alternative like bunny.net), you do not have to wait for global DNS caches to expire during the switch. When you change the origin IP address in your proxy dashboard from your DigitalOcean Load Balancer to your new EU Load Balancer, traffic shifts to the new environment almost immediately.</p>
<h3>Which provider is best if we need GDPR and DORA compliance?</h3>
<p>UpCloud, Scaleway, and Hetzner are all headquartered in the European Union (Finland, France, and Germany respectively) and operate EU data centers under European jurisdiction, avoiding US extraterritorial laws that apply to US-owned providers like DigitalOcean. If your company falls under the EU Digital Operational Resilience Act (DORA, which applied from January 17, 2025), moving to standard open-source infrastructure defined in Terraform also satisfies key requirements for documented ICT exit strategies and reduced vendor lock-in.</p>
<h2>How MoveInfra can help</h2>
<p>If your team wants to move off DigitalOcean without pulling engineers away from product work, MoveInfra handles the migration end-to-end for a fixed price. We analyze your current setup, rebuild your environment as clean Terraform code on UpCloud, Scaleway, or Hetzner, synchronize your databases and Spaces buckets with live replication, and coordinate the cutover with a 30-day rollback window. You can upload your cloud bill on moveinfra.eu to get a free inventory and compare your new monthly costs before granting any access.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (Digital Operational Resilience Act / DORA) on EUR-Lex</a></li>
<li><a href="https://www.digitalocean.com/pricing">DigitalOcean Pricing Overview</a></li>
<li><a href="https://upcloud.com/pricing/">UpCloud Pricing and Plans</a></li>
<li><a href="https://www.scaleway.com/en/pricing/">Scaleway Cloud Pricing</a></li>
<li><a href="https://www.hetzner.com/cloud">Hetzner Cloud Overview and Pricing</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/digitalocean-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Moving from Microsoft Azure to an EU-owned cloud]]></title><description><![CDATA[A practical guide to migrating VMs, PostgreSQL, AKS, and Blob Storage from Microsoft Azure to European cloud providers without losing data or control.]]></description><link>https://moveinfra.hashnode.dev/moving-from-microsoft-azure-to-an-eu-owned-cloud</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/moving-from-microsoft-azure-to-an-eu-owned-cloud</guid><category><![CDATA[Azure]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[eu cloud]]></category><category><![CDATA[data act]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:23:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/c0579511-ce45-4ca3-bc18-a2cd2dec8c6d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/azure-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Moving from Microsoft Azure to an EU-owned cloud requires rebuilding your compute and network configurations as code, replicating relational databases in real time, and shifting storage calls from Azure's proprietary APIs to standard S3-compatible endpoints. For most European software companies running Linux virtual machines, Kubernetes, PostgreSQL, and object storage, the migration takes a few weeks of preparation and a cutover pause of a few minutes. The main technical hurdles are decoupling Microsoft Entra ID from infrastructure access, swapping out the Azure Blob Storage SDK, and replacing proprietary services like Azure Service Bus or Cosmos DB with open-source equivalents.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Standard workloads move cleanly:</strong> Linux VMs, Azure Kubernetes Service (AKS), and Azure Database for PostgreSQL or MySQL map directly to EU providers like UpCloud, Scaleway, OVHcloud, and STACKIT.</li>
<li><strong>Object storage requires a code change:</strong> Unlike AWS and most European clouds that use the S3 API, Azure Blob Storage uses its own REST interface. You will need to update your application's storage client or use an S3-compatible abstraction library.</li>
<li><strong>Egress fees are disappearing:</strong> Under Article 29 of the EU Data Act, cloud providers can charge no more than their direct cost for switching egress until January 12, 2027, when switching fees are banned outright. Microsoft also offers a free egress credit program when you close your Azure subscriptions.</li>
<li><strong>Microsoft 365 can stay where it is:</strong> Moving production servers and customer databases to a European cloud does not mean you have to abandon Entra ID for employee single sign-on or Microsoft 365 for email.</li>
<li><strong>Rollback keeps the cutover safe:</strong> By using logical database replication, you can sync changes back to Azure after the DNS switch, preserving a clean fallback option while your team verifies the new environment.</li>
</ul>
<h2>Why European companies are reconsidering Azure</h2>
<p>Many European organizations adopted Azure because they already used Windows Server, Active Directory, or Office 365. Over time, however, the infrastructure footprint often grows into a standard Linux and open-source stack that does not depend on Microsoft software, while the bill and compliance questions continue to grow.</p>
<p>Three practical reasons drive teams to move production workloads from Azure to an EU-owned cloud:</p>
<ol>
<li><strong>Jurisdiction and sovereignty:</strong> Even when you select Azure regions in Frankfurt, Amsterdam, or Dublin, Microsoft Corporation remains a US-headquartered company subject to US extraterritorial laws such as the CLOUD Act. For companies serving public sector clients, healthcare, or regulated financial institutions, hosting on an EU-headquartered provider removes this legal conflict.</li>
<li><strong>Exit strategy mandates:</strong> The Digital Operational Resilience Act (DORA, Regulation (EU) 2022/2554), which has applied since January 17, 2025, requires financial entities and their critical ICT providers to maintain tested exit strategies and avoid concentration risk with hyperscalers.</li>
<li><strong>Predictable billing:</strong> Azure pricing involves complex tiers of vCPUs, Storage Transaction Units, Virtual Network peering fees, NAT Gateway processing charges, and outbound bandwidth tiers. European providers generally bundle network traffic or charge flat monthly rates for compute and storage.</li>
</ol>
<h2>Mapping your Azure stack to EU cloud equivalents</h2>
<p>Before moving any data, you need an accurate inventory of every resource group in your Azure subscriptions. Most architectures fall into three categories: components that translate directly, components that need minor code or configuration adjustments, and proprietary services that require architectural changes.</p>
<table>
<thead>
<tr>
<th align="left">Azure Service</th>
<th align="left">Open Standard / Protocol</th>
<th align="left">EU Cloud Equivalents (UpCloud, Scaleway, OVHcloud, Hetzner, IONOS, STACKIT)</th>
<th align="left">Migration Complexity</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Azure Virtual Machines</strong></td>
<td align="left">x86 / ARM Linux VMs</td>
<td align="left">Cloud Servers / Instances on all EU providers</td>
<td align="left"><strong>Low:</strong> Redeploy via Terraform and CI/CD.</td>
</tr>
<tr>
<td align="left"><strong>Azure Kubernetes Service (AKS)</strong></td>
<td align="left">Certified Kubernetes</td>
<td align="left">Managed Kubernetes on UpCloud, Scaleway, OVHcloud, IONOS, STACKIT; self-managed on Hetzner</td>
<td align="left"><strong>Low:</strong> Standard manifests and Helm charts port over; update storage and ingress annotations.</td>
</tr>
<tr>
<td align="left"><strong>Azure Database for PostgreSQL / MySQL</strong></td>
<td align="left">PostgreSQL / MySQL wire protocols</td>
<td align="left">Managed Databases on UpCloud, Scaleway, OVHcloud, IONOS, STACKIT; self-hosted on Hetzner</td>
<td align="left"><strong>Low:</strong> Live sync via native logical replication.</td>
</tr>
<tr>
<td align="left"><strong>Azure Cache for Redis</strong></td>
<td align="left">Redis / Valkey protocol</td>
<td align="left">Managed Redis/Valkey on UpCloud, Scaleway, OVHcloud; container or VM elsewhere</td>
<td align="left"><strong>Low:</strong> Point app to new endpoint; warm up cache or sync via replication.</td>
</tr>
<tr>
<td align="left"><strong>Azure Blob Storage</strong></td>
<td align="left">Proprietary Azure REST API</td>
<td align="left">S3-compatible Object Storage on all listed EU providers</td>
<td align="left"><strong>Medium:</strong> Data copies via <code>rclone</code>; app code must swap Azure SDK for S3 SDK.</td>
</tr>
<tr>
<td align="left"><strong>Azure Application Gateway / Load Balancer</strong></td>
<td align="left">TCP / HTTP / TLS</td>
<td align="left">Managed Load Balancers on all listed EU providers</td>
<td align="left"><strong>Low:</strong> Rebuild routing rules and TLS certificates in Terraform.</td>
</tr>
<tr>
<td align="left"><strong>Azure Functions</strong></td>
<td align="left">Proprietary triggers / C# / Node / Python</td>
<td align="left">Scaleway Serverless Functions, or containerize onto Kubernetes / VMs</td>
<td align="left"><strong>Medium:</strong> HTTP functions wrap easily in containers; event triggers need rewiring.</td>
</tr>
<tr>
<td align="left"><strong>Azure Service Bus / Event Hubs</strong></td>
<td align="left">AMQP 1.0 / Kafka API</td>
<td align="left">RabbitMQ or Kafka (Managed on OVHcloud/Scaleway, or self-hosted)</td>
<td align="left"><strong>Medium:</strong> If using AMQP or Kafka clients, change connection strings; SDK users must refactor.</td>
</tr>
<tr>
<td align="left"><strong>Azure SQL Database (MSSQL)</strong></td>
<td align="left">T-SQL / Tabular Data Stream</td>
<td align="left">Linux VM running SQL Server, or schema migration to PostgreSQL</td>
<td align="left"><strong>High:</strong> Licensing changes or application query rewrites required.</td>
</tr>
<tr>
<td align="left"><strong>Azure Cosmos DB</strong></td>
<td align="left">Proprietary APIs (NoSQL, Mongo, Cassandra)</td>
<td align="left">Managed MongoDB (OVHcloud, Scaleway) or self-hosted Cassandra / PostgreSQL JSONB</td>
<td align="left"><strong>High:</strong> Requires careful data modeling and application testing.</td>
</tr>
</tbody></table>
<p><em>Note on Hetzner:</em> Hetzner provides cost-effective virtual and dedicated servers, load balancers, networks, and S3-compatible object storage, but it does not offer managed databases or managed Kubernetes. When migrating to Hetzner, those services must be deployed and maintained on virtual machines.</p>
<h2>Four Azure-specific friction points (and how to handle them)</h2>
<p>Moving off Azure is slightly different from moving off AWS or Google Cloud because of how Microsoft couples identity, storage, and enterprise software.</p>
<h3>1. Replacing the Azure Blob Storage SDK with S3</h3>
<p>Every major European cloud provider builds its object storage around the Amazon S3 API standard. Azure Blob Storage uses a different structure (Storage Accounts, Containers, and Blobs) and its own SDK (<code>@azure/storage-blob</code> in Node.js, <code>azure-storage-blob</code> in Python, <code>Azure.Storage.Blobs</code> in .NET).</p>
<p>To migrate, you must update the storage layer in your application code to use a standard S3 client library (such as <code>boto3</code> for Python or the AWS SDK for .NET configured with a custom endpoint URL). If your application generates Shared Access Signature (SAS) URLs so users can upload or download files directly, you will replace that logic with S3 presigned URLs. They work the same way and take only a few lines of code, but you must account for this change in your sprint planning.</p>
<p>For the files themselves, open-source tools like <code>rclone</code> talk natively to both Azure Blob Storage and S3-compatible targets, verifying cryptographic checksums on every transferred file.</p>
<h3>2. Untangling Microsoft Entra ID (formerly Azure AD)</h3>
<p>Teams often worry that leaving Azure means rebuilding their company's entire identity setup. You need to separate two distinct uses of Entra ID:</p>
<ul>
<li><strong>Employee and customer authentication:</strong> If your back-office tools or web apps use Entra ID via OpenID Connect (OIDC) or SAML, nothing needs to change. OIDC works over the public internet regardless of where your servers live.</li>
<li><strong>Infrastructure Managed Identities:</strong> If your Azure VMs or AKS pods use Azure Managed Identities to authenticate to databases or storage without passwords, you will need to replace this mechanism. On an EU cloud, you typically move to Kubernetes secrets, HashiCorp Vault, database username/password authentication over private networks, or scoped S3 access keys.</li>
</ul>
<h3>3. Dealing with .NET, Windows, and SQL Server</h3>
<p>If your company writes applications in modern .NET (.NET 6, 8, or newer), your code runs natively on Linux containers and Linux VMs. Moving a modern C# application to a European Kubernetes cluster or Linux server is no different from moving a Go, Node.js, or Python app.</p>
<p>However, if you rely on legacy .NET Framework (4.8 and older) on Windows Server, or if your application depends heavily on Azure SQL Database (Microsoft SQL Server), the migration requires more planning. While some European providers offer Windows Server licensing, many engineering teams use an infrastructure move as the moment to migrate schemas from SQL Server to PostgreSQL using tools like <code>pgloader</code>, eliminating Microsoft licensing fees altogether.</p>
<h3>4. Rebuilding ARM or Bicep into Terraform</h3>
<p>If your infrastructure is defined using Azure Resource Manager (ARM) templates or Bicep, those files cannot be reused on another cloud. Even if you already use Terraform or OpenTofu, the <code>azurerm</code> provider blocks must be rewritten using the provider plugin of your chosen European cloud (such as <code>upcloud</code>, <code>scaleway</code>, or <code>ovh</code>). Treating the migration as a clean rebuild in Terraform gives you an auditable, documented environment from day one.</p>
<h2>Egress fees and your legal rights under the EU Data Act</h2>
<p>Historically, cloud providers charged steep outbound data transfer fees (around $0.08 to $0.087 per GB on Azure after the first 100 GB per month, as of 2026) when you copied terabytes of backups and object storage over the internet.</p>
<p>In the European Union, Regulation (EU) 2023/2854 (the EU Data Act) changes the rules for switching data processing services:</p>
<ul>
<li><strong>Transitional cap (until January 12, 2027):</strong> Providers may charge switching fees, including data egress fees incurred while moving to another provider, at no more than the direct cost incurred to perform the switch.</li>
<li><strong>Full ban (from January 12, 2027):</strong> Switching charges and data egress fees for switching between cloud providers are banned completely for EU customers.</li>
</ul>
<p>Following the introduction of the Data Act, Microsoft introduced two policies you can use today (check Microsoft's official documentation and bandwidth pricing pages for current terms as of 2026):</p>
<ol>
<li><strong>Free egress when leaving Azure:</strong> Microsoft offers credits to cover internet data egress over 100 GB/month when you are migrating all data off Azure to another cloud provider. To qualify, you must open an Azure Support ticket <em>before</em> starting the transfer, follow their instructions, and cancel the associated Azure subscriptions once the migration is complete.</li>
<li><strong>At-cost egress for parallel multi-cloud use:</strong> For EEA, EFTA, and UK customers running workloads across Azure and another provider in parallel, Azure offers reduced, at-cost data transfer rates upon submitting a support request with the destination provider's Autonomous System Number (ASN).</li>
</ol>
<h2>Step-by-step migration checklist</h2>
<p>A reliable cloud migration avoids copying messy, years-old virtual disks. Instead, rebuild the infrastructure cleanly, stream the data across, and deploy fresh application artifacts from your existing pipeline.</p>
<ul>
<li><input disabled type="checkbox" /> <strong>1. Audit and right-size:</strong> Export your Azure Cost Management billing data and list every active resource. Identify idle VMs, unattached Managed Disks, and oversized databases so you only pay for what you actually use on the new cloud.</li>
<li><input disabled type="checkbox" /> <strong>2. Refactor storage calls:</strong> Update application code that speaks directly to the Azure Blob Storage API so it supports standard S3 endpoints and presigned URLs.</li>
<li><input disabled type="checkbox" /> <strong>3. Write the target infrastructure as code:</strong> Define your new private networks, firewall rules, load balancers, Kubernetes clusters, and managed database instances in Terraform on your target EU cloud.</li>
<li><input disabled type="checkbox" /> <strong>4. Establish database replication:</strong> Set up a secure VPN or WireGuard tunnel between your Azure Virtual Network and the new EU cloud private network. Configure PostgreSQL logical replication (<code>CREATE PUBLICATION</code> on Azure, <code>CREATE SUBSCRIPTION</code> on the target) or MySQL binlog replication so the new database catches up and stays in live sync.</li>
<li><input disabled type="checkbox" /> <strong>5. Clone object storage:</strong> Run <code>rclone sync</code> from a worker node to copy all containers from Azure Blob Storage into your new S3 buckets. Re-run periodically to sync newly uploaded files.</li>
<li><input disabled type="checkbox" /> <strong>6. Point CI/CD to the new environment:</strong> Update your GitHub Actions, GitLab CI, or Azure DevOps pipelines to deploy your containers or application binaries to the new EU servers. Test the staging environment thoroughly.</li>
<li><input disabled type="checkbox" /> <strong>7. Execute the cutover:</strong> Lower your DNS TTLs 24 hours in advance. During a scheduled low-traffic window, put the application in brief maintenance mode (pausing writes), run a final incremental <code>rclone</code> pass, verify that database replication lag is zero, promote the EU database to primary, and update your DNS records.</li>
<li><input disabled type="checkbox" /> <strong>8. Maintain reverse replication before cleanup:</strong> Configure replication from your new EU primary database back to the old Azure database for 30 days. Once you are confident in the new setup, cancel the Azure subscriptions and claim any applicable egress credits.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Can we keep using GitHub Actions or Azure DevOps if we move our servers to an EU cloud?</h3>
<p>Yes. Your CI/CD runners only need network access or API credentials to deploy to your new servers or Kubernetes cluster. Many European teams keep their source code and pipelines on GitHub or Azure DevOps while moving production compute and customer databases to an EU provider.</p>
<h3>How much downtime is required to switch from Azure Database for PostgreSQL?</h3>
<p>Because PostgreSQL logical replication syncs data continuously in the background while your application stays online, you do not have to wait for a multi-hour dump and restore during cutover. Once replication lag is under a few seconds, you only need a short planned write pause—typically a few minutes—to let the last transactions flush, verify data consistency, and switch your application traffic.</p>
<h3>What if we use Azure Kubernetes Service (AKS)?</h3>
<p>Kubernetes is one of the easiest workloads to move. Standard Deployment, Service, and Ingress manifests work across any certified Kubernetes cluster. You will mainly need to change Azure-specific storage class names (for example, changing <code>managed-csi</code> to the CSI driver of UpCloud, Scaleway, or OVHcloud) and replace any Azure Key Vault CSI drivers with standard Kubernetes secrets or external secret operators.</p>
<h3>Is Microsoft's EU Data Boundary enough for European sovereignty?</h3>
<p>Microsoft's EU Data Boundary stores and processes customer data within European data centers, which helps with data residency requirements. However, data residency is different from legal jurisdiction. Because Microsoft is a US company, European residency does not insulate infrastructure from US legal jurisdiction in the same way that contracting with a wholly EU-owned cloud provider does.</p>
<h2>How MoveInfra can help</h2>
<p>If your team wants to move off Azure without pulling engineers away from product work for months, MoveInfra handles the migration end-to-end for a fixed price. We analyze your current Azure setup, rebuild your environment as clean Terraform code on an EU-owned cloud (such as UpCloud, Scaleway, OVHcloud, or Hetzner), keep your databases and object storage in live sync, and help your team switch over with a 30-day reverse-replication rollback window. Upload your cloud bill at moveinfra.eu for a free assessment of what can move automatically and what your new monthly infrastructure cost will look like.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 of the European Parliament and of the Council (EU Data Act) - EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 on digital operational resilience for the financial sector (DORA) - EUR-Lex</a></li>
<li><a href="https://azure.microsoft.com/en-us/pricing/details/bandwidth/">Bandwidth Pricing and Internet Egress FAQ - Microsoft Azure</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/data-transfer-fees">Azure Data Transfer Fees and European At-Cost Transfer - Microsoft Learn</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-logical">Logical Replication in Azure Database for PostgreSQL Flexible Server - Microsoft Learn</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/azure-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Leaving Google Cloud for an EU-owned provider: a practical plan]]></title><description><![CDATA[A step-by-step technical and regulatory guide for European companies migrating workloads from Google Cloud to EU-owned cloud providers.]]></description><link>https://moveinfra.hashnode.dev/leaving-google-cloud-for-an-eu-owned-provider-a-practical-plan</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/leaving-google-cloud-for-an-eu-owned-provider-a-practical-plan</guid><category><![CDATA[google cloud]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[eu cloud]]></category><category><![CDATA[data act]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:23:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/3fe7330a-fc73-463c-b291-595efeb49c85.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/google-cloud-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Leaving Google Cloud (GCP) for an EU-owned cloud provider is a straightforward process when your architecture relies on open standards like Linux virtual machines, PostgreSQL, Kubernetes, and S3-compatible object storage. By building parallel infrastructure as code on a European provider—such as UpCloud, Scaleway, OVHcloud, or Hetzner—and using logical replication to sync databases in real time, a typical 10-to-300-person company can switch production traffic during a short planned write pause of just a few minutes. The main obstacles are not servers or relational databases, but proprietary Google services like Firestore, Cloud Spanner, BigQuery, and IAM-coupled serverless workflows, which require code changes or architectural decisions before you move.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Standard workloads map cleanly:</strong> Compute Engine, GKE, Cloud SQL, Memorystore, and Cloud Storage have direct equivalents on EU-owned clouds like UpCloud, Scaleway, OVHcloud, and Exoscale.</li>
<li><strong>Proprietary services require a strategy:</strong> BigQuery, Firestore, and Pub/Sub do not have drop-in equivalents everywhere; you must decide whether to refactor them to open-source tools or keep BigQuery as an isolated analytics service.</li>
<li><strong>Egress fees are avoidable:</strong> Under the EU Data Act (Article 29), switching charges are capped at cost until January 12, 2027, and banned entirely after that date. Google Cloud also offers a formal exit program that waives data transfer fees when shutting down services.</li>
<li><strong>Parallel runs reduce cutover risk:</strong> Rebuilding your environment in Terraform, syncing data continuously, and keeping 30 days of reverse replication after the DNS switch gives you a tested rollback path.</li>
</ul>
<h2>Why European teams are reassessing Google Cloud</h2>
<p>For many European startups and mid-sized companies, Google Cloud was an attractive starting point. Its Kubernetes engine (GKE) is mature, its networking is fast, and startup credit programs often covered the first year or two of bills. </p>
<p>Once the credits expire and compliance requirements mature, three factors usually trigger a reassessment:</p>
<ol>
<li><strong>Cost predictability:</strong> Google Cloud’s pricing structure separates compute, persistent disk throughput, networking, NAT gateway processing, and load balancer rules. European providers typically bundle generous bandwidth allocations and charge flat monthly rates for compute and managed services. Check each provider's current pricing page for exact figures, as structures vary between bundled and metered bandwidth.</li>
<li><strong>Jurisdiction and sovereignty:</strong> Even when you select a Google Cloud region in Frankfurt, St. Ghislain, or Eemshaven, Google Cloud is operated by Alphabet Inc., a US corporation subject to US extraterritorial laws. So-called "sovereign" partnerships or controls on US clouds still leave ultimate corporate ownership outside Europe. Moving to an EU-owned provider ensures that both physical data centers and the legal parent entity reside under European jurisdiction.</li>
<li><strong>Regulatory exit mandates:</strong> For companies in the financial sector—or software vendors supplying them—the Digital Operational Resilience Act (DORA, Regulation (EU) 2022/2554), which has applied since January 17, 2025, requires documented and tested exit strategies for ICT services supporting critical functions. Meanwhile, the EU Data Act (Regulation (EU) 2023/2854) has removed long-standing contractual and financial barriers to switching cloud providers.</li>
</ol>
<h2>Service mapping: Google Cloud to EU-owned providers</h2>
<p>Before touching any infrastructure, map every active service on your Google Cloud invoice to its equivalent on an EU-owned cloud. </p>
<p>Providers like UpCloud, Scaleway, OVHcloud, IONOS, STACKIT, and Exoscale cover the standard infrastructure stack with managed services. Hetzner offers competitive raw compute, networking, and storage, though it does not offer managed databases or managed Kubernetes; if you choose Hetzner, those services must be deployed and maintained directly on virtual machines.</p>
<table>
<thead>
<tr>
<th align="left">Google Cloud Service</th>
<th align="left">Open Standard / Underlying Tech</th>
<th align="left">EU Cloud Equivalent (UpCloud, Scaleway, OVHcloud, etc.)</th>
<th align="left">Migration Complexity</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Compute Engine (GCE)</strong></td>
<td align="left">KVM / Linux / Windows VMs</td>
<td align="left">Cloud Servers / Instances</td>
<td align="left">Low. Rebuild via Terraform and deploy via CI/CD.</td>
</tr>
<tr>
<td align="left"><strong>Google Kubernetes Engine (GKE)</strong></td>
<td align="left">Kubernetes</td>
<td align="left">Managed Kubernetes (or self-hosted on VMs for Hetzner)</td>
<td align="left">Low to Medium. Replace GCP-specific ingress annotations and workload identity.</td>
</tr>
<tr>
<td align="left"><strong>Cloud SQL</strong></td>
<td align="left">PostgreSQL, MySQL</td>
<td align="left">Managed PostgreSQL / MySQL</td>
<td align="left">Low. Sync using native logical replication.</td>
</tr>
<tr>
<td align="left"><strong>Cloud Storage (GCS)</strong></td>
<td align="left">Object storage (S3 interoperability)</td>
<td align="left">S3-compatible Object Storage</td>
<td align="left">Low. Clone buckets with checksum verification.</td>
</tr>
<tr>
<td align="left"><strong>Memorystore</strong></td>
<td align="left">Redis / Valkey</td>
<td align="left">Managed Redis / Valkey</td>
<td align="left">Low. Usually rebuilt empty as a cache or synced via replication.</td>
</tr>
<tr>
<td align="left"><strong>Cloud Load Balancing</strong></td>
<td align="left">HTTP(S) / TCP Proxy</td>
<td align="left">Managed Load Balancers</td>
<td align="left">Low. Recreate routing rules and TLS certificates.</td>
</tr>
<tr>
<td align="left"><strong>Cloud Run</strong></td>
<td align="left">Knative / Containers</td>
<td align="left">Serverless Containers (Scaleway) or Kubernetes / VMs</td>
<td align="left">Medium. Package containers to run on K8s or standard container runners.</td>
</tr>
<tr>
<td align="left"><strong>Cloud Functions</strong></td>
<td align="left">Event-driven functions</td>
<td align="left">Serverless Functions (Scaleway) or worker processes</td>
<td align="left">Medium. HTTP triggers move easily; GCP event triggers require code edits.</td>
</tr>
<tr>
<td align="left"><strong>Pub/Sub</strong></td>
<td align="left">Message queueing</td>
<td align="left">Managed NATS/RabbitMQ/Kafka or self-hosted queues</td>
<td align="left">Medium. Requires updating client SDKs in application code.</td>
</tr>
<tr>
<td align="left"><strong>Firestore / Bigtable / Spanner</strong></td>
<td align="left">Proprietary NoSQL / NewSQL</td>
<td align="left">Self-managed MongoDB/Cassandra or refactor to PostgreSQL</td>
<td align="left">High. Requires schema migration and application data-layer rewrites.</td>
</tr>
<tr>
<td align="left"><strong>BigQuery</strong></td>
<td align="left">Proprietary Data Warehouse</td>
<td align="left">ClickHouse / PostgreSQL, or leave in place temporarily</td>
<td align="left">High. Requires rewriting SQL pipelines and BI connectors.</td>
</tr>
</tbody></table>
<h2>What moves cleanly vs. what needs engineering work</h2>
<p>A realistic migration plan separates infrastructure plumbing from application refactoring. </p>
<h3>Workloads that move without code changes</h3>
<p>Virtual machines, standard Docker containers, managed PostgreSQL and MySQL databases, Redis caches, virtual private networks, firewalls, and S3-compatible object storage move with minimal friction. If your application connects to its database via a standard connection string (<code>DATABASE_URL</code>) and writes files using an S3 client library, your developers barely need to touch the application code.</p>
<h3>Workloads that need assistance</h3>
<p>Serverless functions (Cloud Functions), container-as-a-service (Cloud Run), and message queues (Pub/Sub) sit in the middle. If you use Cloud Run strictly to run stateless HTTP containers, those containers can be deployed to a managed Kubernetes cluster or a European serverless container platform like Scaleway Serverless Containers. However, if your code imports <code>@google-cloud/pubsub</code> or relies on Eventarc triggers when a file lands in Cloud Storage, your engineering team will need to swap the Google SDK for a standard protocol like AMQP, Kafka, or Redis Streams.</p>
<h3>Workloads that require architectural decisions</h3>
<p>Proprietary databases and analytics engines are the hardest part of leaving Google Cloud:</p>
<ul>
<li><strong>Firestore and Datastore:</strong> Because these document databases use proprietary query APIs and client-side SDKs, leaving them requires migrating data to PostgreSQL (using <code>jsonb</code> columns) or an open-source document store like MongoDB, and rewriting your data access layer.</li>
<li><strong>BigQuery:</strong> Many European companies use PostgreSQL for production transactions and stream data into BigQuery for analytics. If BigQuery does not hold sensitive production state or create a regulatory blocker for your core product, you can migrate your core application infrastructure first and replace BigQuery later with ClickHouse or DuckDB.</li>
</ul>
<h3>Hidden Google Cloud dependencies to watch for</h3>
<p>Even in standard Kubernetes or VM setups, Google-specific glue often hides in configuration files:</p>
<ul>
<li><strong>Workload Identity and IAM:</strong> Applications often authenticate to Cloud Storage or Cloud SQL using Google service accounts injected at runtime rather than static credentials. On an EU cloud, you will transition to standard environment variables, Kubernetes secrets, or S3 access keys.</li>
<li><strong>Cloud SQL Auth Proxy:</strong> Many teams run the Cloud SQL Auth Proxy sidecar to handle database encryption and authentication. When moving to a European managed database, you will remove this sidecar and connect directly over private VPC networking using standard TLS certificates.</li>
<li><strong>Container Registry (Artifact Registry):</strong> Remember to update your CI/CD pipelines to push container images to an EU-hosted registry (or your existing GitHub/GitLab registry) so your new cluster does not pull images across the Atlantic during deployments.</li>
</ul>
<h2>Using the EU Data Act and Google's exit program for egress</h2>
<p>Historically, moving terabytes of object storage and database backups out of a US hyperscaler meant paying steep network egress fees. Today, both European law and Google’s own policies protect you from punitive switching costs.</p>
<p>Under <strong>Article 29 of the EU Data Act (Regulation (EU) 2023/2854)</strong>, cloud providers could only pass on the direct technical cost of switching until January 12, 2027. From January 12, 2027 onward, all switching charges—including data egress fees incurred when moving to another provider—are banned across the European Union.</p>
<p>In parallel, Google Cloud operates a formal <strong>Exit Program</strong> that waives network data transfer fees for customers migrating all workloads off relevant Google Cloud services. However, you cannot simply copy your data out and expect an automatic refund. You must follow their administrative process:</p>
<ol>
<li>Submit a formal "Exit Notice" form through Google Cloud support before starting the bulk transfer.</li>
<li>Wait for Google to assign a Billing Support agent (which takes up to 14 days).</li>
<li>Initiate and complete the migration within the defined window (typically starting within 30 days of approval) and terminate the covered services afterward.</li>
</ol>
<p>If you have less than a terabyte of data, standard egress charges may be small enough that you prefer to start copying immediately. If you store tens or hundreds of terabytes in Cloud Storage, file the exit notice during your planning phase so the 14-day review runs while you build your new environment.</p>
<h2>The 6-step migration plan</h2>
<p> Do not treat a cloud migration as a weekend "backup and restore" marathon. Moving infrastructure safely means running both environments in parallel and cutting over only when data is already in sync.</p>
<h3>Step 1: Analyze and inventory</h3>
<p>Start by exporting your Google Cloud billing report and listing every active resource across all projects. Identify VM sizes, disk capacities, database versions, and average network traffic. Map these to your target EU cloud to establish a clear before-and-after monthly cost comparison. Look for forgotten resources—unattached persistent disks, old snapshots, and staging environments—that do not need to be migrated.</p>
<h3>Step 2: Rebuild the environment as code</h3>
<p>Do not click around in the new provider's web console. Define your target European infrastructure in Terraform or OpenTofu. Set up the Virtual Private Cloud (VPC), private subnets, firewall rules, load balancers, managed databases, and Kubernetes clusters or VMs to match your Google Cloud capacity. At this stage, no application code or production data is moved; you are simply building an empty, reproducible shell.</p>
<h3>Step 3: Synchronize the data</h3>
<p>With the target infrastructure running, begin continuous data replication:</p>
<ul>
<li><strong>Object Storage:</strong> Enable the S3 interoperability API in Google Cloud Storage (creating HMAC keys) and use tools like <code>rclone</code> to copy buckets to your EU provider’s object storage. Run periodic sync passes with checksum verification so new files uploaded by users are copied over continuously.</li>
<li><strong>Relational Databases:</strong> Configure PostgreSQL or MySQL logical replication from Cloud SQL to your new managed database over an encrypted VPN or TLS connection. First, take a baseline snapshot to load existing tables, then let logical replication stream ongoing <code>INSERT</code>, <code>UPDATE</code>, and <code>DELETE</code> operations in real time.</li>
</ul>
<h3>Step 4: Point your deployments</h3>
<p>Work with your engineering team to update your CI/CD pipelines (GitHub Actions, GitLab CI, etc.). Add a deployment target for the new EU environment. Deploy your stateless applications, background workers, and web servers to the new infrastructure. Connect them to the replicated database (in read-only mode initially) and verify that health checks, TLS certificates, and logging work as expected.</p>
<h3>Step 5: Switch traffic</h3>
<p>Once your new environment is tested and database replication lag is consistently under 5 seconds, schedule a short maintenance window during low-traffic hours. </p>
<ol>
<li>Put your application on Google Cloud into maintenance or read-only mode to pause new database writes.</li>
<li>Wait a few seconds for the final transactions to replicate to the EU database, and run a final delta sync on object storage.</li>
<li>Promote the EU database to primary (read-write) and enable your background workers in the EU environment.</li>
<li>Update your DNS records (having lowered TTLs to 60 seconds a day earlier) to point to the EU load balancer.</li>
</ol>
<p>For most standard web applications, the actual write pause takes only a few minutes.</p>
<h3>Step 6: Keep rollback ready, then clean up</h3>
<p>Do not delete your Google Cloud project the day after cutover. Configure reverse logical replication from your new EU primary database back to Cloud SQL, and keep the old environment on standby for 30 days. If an unexpected edge case appears, you can switch DNS back without losing data written after the cutover. Once the 30-day window passes cleanly, decommission the Google Cloud resources and close the billing account.</p>
<h2>Practical pre-migration checklist</h2>
<p>Use this checklist before scheduling your cutover window:</p>
<ul>
<li><input disabled type="checkbox" /> <strong>Billing &amp; Egress:</strong> Submit Google Cloud’s Exit Notice form if transferring large data volumes, and verify committed use discount (CUD) expiration dates.</li>
<li><input disabled type="checkbox" /> <strong>Auth &amp; Secrets:</strong> Replace Google Workload Identity and Secret Manager calls with standard environment variables, Kubernetes Secrets, or HashiCorp Vault.</li>
<li><input disabled type="checkbox" /> <strong>Storage APIs:</strong> Verify whether application code uses the native <code>@google-cloud/storage</code> SDK or an S3-compatible client; refactor to S3 SDKs where necessary.</li>
<li><input disabled type="checkbox" /> <strong>Database Extensions:</strong> Check that all PostgreSQL extensions enabled in Cloud SQL (such as <code>pgvector</code>, <code>postgis</code>, or <code>pg_stat_statements</code>) are supported by your target EU provider's managed database.</li>
<li><input disabled type="checkbox" /> <strong>Email &amp; Outbound IPs:</strong> Update SPF records, webhook allowlists, and third-party API IP filters with the new outbound NAT IP addresses of your EU cloud.</li>
<li><input disabled type="checkbox" /> <strong>DNS Preparation:</strong> Lower DNS TTLs to 60–300 seconds at least 48 hours before the planned switch.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Can we keep BigQuery or Google Workspace while moving our core infrastructure?</h3>
<p>Yes. Google Workspace (Gmail, Drive, Docs) is completely separate from Google Cloud infrastructure and does not need to change. You can also keep BigQuery for historical data analytics if your team relies on it, while moving your production VMs, Kubernetes clusters, and transactional PostgreSQL databases to an EU provider. Just keep in mind that streaming data from an EU cloud into BigQuery will still subject that analytics data to US jurisdiction.</p>
<h3>How much downtime is required to move a Cloud SQL database?</h3>
<p>While migrations with no downtime at all do not exist when changing database primaries across clouds, logical replication keeps the required maintenance window very short. Because historical data is synced in advance while the app stays live, you only need to pause writes long enough for the last few seconds of replication lag to drain and for connections to switch to the new database—typically between 2 and 10 minutes.</p>
<h3>Do we have to rewrite our Terraform files from scratch?</h3>
<p>Yes, the resource blocks must change because Terraform providers are cloud-specific (<code>google_compute_instance</code> becomes <code>upcloud_server</code> or <code>scaleway_instance_server</code>). However, your overall module structure, network topology, variable definitions, and state management concepts carry over directly.</p>
<h3>What happens if we have active Committed Use Discounts (CUDs) on Google Cloud?</h3>
<p>Google Cloud’s free data transfer program waives network egress fees, but it does not automatically cancel fixed-term financial commitments like 1-year or 3-year CUDs. Review your billing console to see when your commitments expire. In many cases, the monthly savings on an EU provider offset the remaining commitment within a few months, or you can time your cutover to align with the CUD renewal date.</p>
<h2>How MoveInfra can help</h2>
<p>MoveInfra moves companies from Google Cloud to EU-owned providers like UpCloud, Scaleway, Hetzner, and OVHcloud for a fixed price. You can upload your Google Cloud bill for a free analysis and monthly cost comparison, after which we rebuild your infrastructure in Terraform, sync your databases and storage with checksums, and handle the cutover with 30 days of reverse replication for rollback. If you want to move off Google Cloud without derailing your engineering roadmap, request early access at moveinfra.eu.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (Digital Operational Resilience Act - DORA) on EUR-Lex</a></li>
<li><a href="https://cloud.google.com/terms/data-portability">Google Cloud Documentation: Data Portability and Switching Procedures</a></li>
<li><a href="https://upcloud.com/docs/">UpCloud Documentation</a></li>
<li><a href="https://www.scaleway.com/en/docs/">Scaleway Documentation</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/google-cloud-to-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[AWS to OVHcloud: planning the move]]></title><description><![CDATA[A practical guide to migrating cloud infrastructure from AWS to OVHcloud, covering service equivalents, networking, database replication, and EU rules]]></description><link>https://moveinfra.hashnode.dev/aws-to-ovhcloud-planning-the-move</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/aws-to-ovhcloud-planning-the-move</guid><category><![CDATA[AWS]]></category><category><![CDATA[ovhcloud]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[eu cloud]]></category><category><![CDATA[data act]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:22:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/1ba30e4c-1895-456c-801e-4b49626ddc3c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/aws-to-ovhcloud-migration/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Moving from AWS to OVHcloud is a practical route for European companies that want to bring their cloud infrastructure under EU jurisdiction while keeping managed services like Kubernetes, relational databases, and S3-compatible object storage. A successful migration requires mapping your AWS resources to OVHcloud Public Cloud equivalents, rebuilding your network and compute layer using Infrastructure as Code, syncing data continuously via logical replication, and switching DNS traffic during a brief, planned write pause. Most standard web applications, container clusters, and relational databases map directly between the two platforms, though proprietary AWS services like DynamoDB or SQS must be replaced with open-source alternatives during the transition.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Direct service mapping for core workloads:</strong> OVHcloud Public Cloud provides direct equivalents for EC2, RDS (PostgreSQL and MySQL), S3, EKS, and ElastiCache (via managed Valkey/Redis).</li>
<li><strong>Open standards under the hood:</strong> OVHcloud builds its Public Cloud on OpenStack and CNCF-certified vanilla Kubernetes, which makes it straightforward to manage via Terraform and standard APIs.</li>
<li><strong>More predictable bandwidth costs:</strong> Unlike AWS, which charges per gigabyte for internet egress, OVHcloud includes incoming and outgoing public network traffic in the base price of its Public Cloud instances and Managed Kubernetes worker nodes.</li>
<li><strong>Switching fees are regulated:</strong> Under Article 29 of the EU Data Act, AWS can charge no more than its direct cost for data egress when you switch providers until 12 January 2027, after which switching fees are banned entirely.</li>
<li><strong>Proprietary services require refactoring:</strong> If your architecture relies heavily on AWS Lambda, DynamoDB, or CloudFormation, you will need to adapt those components to open standards before or during the move.</li>
</ul>
<h2>Why European companies move from AWS to OVHcloud</h2>
<p>For companies with 10 to 300 employees, the decision to leave AWS for a European provider usually comes down to two factors: legal jurisdiction and cost predictability.</p>
<h3>Jurisdiction and compliance</h3>
<p>AWS operates several data center regions inside the European Union, as well as the AWS European Sovereign Cloud. While these options keep data and day-to-day operations inside the EU, Amazon remains a US parent company subject to extraterritorial US laws, such as the CLOUD Act. </p>
<p>OVHcloud is headquartered in Roubaix, France, and is subject to European and French law. For companies in regulated industries, or those dealing with public-sector procurement and strict enterprise vendor assessments, hosting on an EU-owned cloud simplifies compliance. Furthermore, for financial entities subject to the Digital Operational Resilience Act (DORA, Regulation (EU) 2022/2554), which has applied since 17 January 2025, having a tested exit strategy away from dominant ICT providers is a regulatory requirement.</p>
<h3>Cost structure and egress</h3>
<p>AWS pricing is highly granular. While base compute and storage prices are clear, monthly bills often grow unpredictable due to charges for NAT Gateways, cross-Availability Zone (AZ) data transfer, and public internet egress.</p>
<p>OVHcloud structures its pricing around bundled resources. On OVHcloud Public Cloud, standard public bandwidth (both ingress and egress) and private network traffic over vRack are included in the monthly or hourly price of compute instances. Similarly, the OVHcloud Managed Kubernetes Service (MKS) Free plan provides the cluster control plane at no charge, meaning you only pay for the underlying worker node instances, block storage, and load balancers. (OVHcloud also offers a paid MKS Standard plan with higher SLA guarantees and 3-AZ deployment options; check the official OVHcloud pricing page for current 2026 rates.)</p>
<h2>Mapping AWS services to OVHcloud equivalents</h2>
<p>Before moving any workloads, you need an accurate inventory of what you run on AWS and how each component translates to OVHcloud. Most infrastructure falls into OVHcloud’s "Public Cloud" product line, rather than their traditional bare-metal dedicated servers or VPS offerings.</p>
<table>
<thead>
<tr>
<th align="left">AWS Service</th>
<th align="left">OVHcloud Public Cloud Equivalent</th>
<th align="left">Migration Notes</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>EC2</strong></td>
<td align="left">Public Cloud Instances</td>
<td align="left">General purpose (<code>b3</code>), CPU-optimized (<code>c3</code>), and RAM-optimized (<code>r3</code>) flavors available.</td>
</tr>
<tr>
<td align="left"><strong>VPC &amp; Private Subnets</strong></td>
<td align="left">vRack &amp; Private Networks</td>
<td align="left">vRack connects Public Cloud instances, Kubernetes, and bare metal over private VLANs.</td>
</tr>
<tr>
<td align="left"><strong>Security Groups</strong></td>
<td align="left">OpenStack Security Groups</td>
<td align="left">Stateful firewall rules managed via the OVHcloud API or OpenStack CLI/Terraform.</td>
</tr>
<tr>
<td align="left"><strong>EBS (Elastic Block Store)</strong></td>
<td align="left">Block Storage (Cinder)</td>
<td align="left">High-speed and classic volume types attached to instances or mounted as Kubernetes Persistent Volumes.</td>
</tr>
<tr>
<td align="left"><strong>S3</strong></td>
<td align="left">Object Storage</td>
<td align="left">S3-compatible API supporting standard tools like <code>rclone</code>, AWS CLI, and standard SDKs.</td>
</tr>
<tr>
<td align="left"><strong>RDS (PostgreSQL / MySQL)</strong></td>
<td align="left">Public Cloud Databases</td>
<td align="left">Managed databases with automated backups and high-availability node options.</td>
</tr>
<tr>
<td align="left"><strong>ElastiCache (Redis/Valkey)</strong></td>
<td align="left">Public Cloud Databases for Valkey</td>
<td align="left">Managed in-memory caching compatible with Redis clients.</td>
</tr>
<tr>
<td align="left"><strong>EKS</strong></td>
<td align="left">Managed Kubernetes Service (MKS)</td>
<td align="left">CNCF-certified vanilla Kubernetes; uses Octavia Load Balancers and Cinder CSI storage.</td>
</tr>
<tr>
<td align="left"><strong>ALB / NLB</strong></td>
<td align="left">Public Cloud Load Balancer</td>
<td align="left">Managed OpenStack Octavia load balancers supporting HTTP/HTTPS and TCP traffic.</td>
</tr>
<tr>
<td align="left"><strong>SQS / SNS</strong></td>
<td align="left">Managed Kafka or self-hosted RabbitMQ</td>
<td align="left">OVHcloud offers managed Kafka, or you can run RabbitMQ/NATS on Kubernetes or VMs.</td>
</tr>
<tr>
<td align="left"><strong>DynamoDB</strong></td>
<td align="left">Managed MongoDB or PostgreSQL</td>
<td align="left">Requires data model migration; no direct drop-in replacement for DynamoDB's proprietary API.</td>
</tr>
</tbody></table>
<h2>Architectural differences to plan for</h2>
<p>While the service table shows strong parity for standard stacks, the underlying mechanics of AWS and OVHcloud differ in several ways that affect your engineering team.</p>
<h3>1. Region topology (1-AZ vs. 3-AZ)</h3>
<p>In AWS, every region consists of at least three Availability Zones by default, and architectures are built around multi-AZ subnets from day one. OVHcloud historically built its Public Cloud regions (such as Gravelines <code>GRA</code> and Strasbourg <code>SBG</code> in France, or Limburg <code>LIM</code> in Germany) as single-datacenter locations, oftenwith multiple independent rooms on the same campus. </p>
<p>However, OVHcloud has expanded its multi-availability-zone footprint, offering 3-AZ region deployments (starting with the Paris region) for Public Cloud and Managed Kubernetes Standard. When planning your move, check which specific services and database engines are available in your chosen OVHcloud region, and decide whether your availability requirements call for a 3-AZ region or multi-region replication.</p>
<h3>2. IAM and API credentials</h3>
<p>AWS relies on a single, unified IAM system across every service, allowing fine-grained role assumption (such as IAM Roles for Service Accounts in EKS). </p>
<p>OVHcloud uses a two-layer API structure for its Public Cloud:</p>
<ol>
<li><strong>The OVHcloud API:</strong> Used for account management, billing, vRack creation, Managed Kubernetes cluster provisioning, and Managed Databases.</li>
<li><strong>The OpenStack API:</strong> Because OVHcloud Public Cloud runs on OpenStack, low-level resources like compute instances, security groups, block storage volumes, and S3 object storage credentials can be managed directly through standard OpenStack APIs.</li>
</ol>
<p>In Terraform, it is common practice to configure both the <code>ovh</code> provider and the <code>openstack</code> provider side by side. This also means your applications cannot rely on AWS-specific IAM instance profiles; instead, you will pass standard S3 access keys or database connection strings via environment variables or Kubernetes secrets.</p>
<h3>3. Networking and vRack</h3>
<p>In AWS, a VPC is a software-defined network isolated to a single region. In OVHcloud, private networking is built on <strong>vRack</strong> (Virtual Rack). vRack allows you to create isolated Layer 2/Layer 3 private networks that can span across multiple OVHcloud data centers and even bridge Public Cloud virtual instances with dedicated bare-metal servers. </p>
<p>When translating an AWS VPC to OVHcloud, you will attach a vRack to your Public Cloud project, define private networks (subnets) with DHCP enabled, and deploy an OpenStack Gateway instance (which acts similarly to a combined AWS Internet Gateway and NAT Gateway) so private worker nodes can reach the outside internet.</p>
<h2>Step-by-step migration plan</h2>
<p>To avoid extended downtime or data loss, treat the migration as a parallel build followed by a controlled cutover, rather than a manual "backup and restore" weekend project.</p>
<h3>Step 1: Audit your bill and inventory resources</h3>
<p>Start by pulling your last three months of AWS bills and inspecting your live environment. List every active EC2 instance, RDS cluster, S3 bucket, load balancer, and DNS zone. </p>
<p>Pay special attention to hidden dependencies:</p>
<ul>
<li>Are your applications using AWS SES for transactional email? (You can keep SES while hosting compute on OVHcloud, or switch to an EU email provider.)</li>
<li>Are you using AWS KMS or Secrets Manager?</li>
<li>Are images stored in Amazon ECR?</li>
</ul>
<h3>Step 2: Rebuild the infrastructure as code</h3>
<p>Do not click through the OVHcloud Control Panel to build production environments. Translate your existing Terraform, OpenTofu, or CloudFormation templates into Terraform modules using the <code>ovh</code> and <code>openstack</code> providers.</p>
<p>Provision the foundational layer first:</p>
<ul>
<li>vRack, private subnets, and routing gateways.</li>
<li>Security groups mirroring your AWS ingress/egress rules.</li>
<li>Managed Kubernetes clusters or compute instances matching your current vCPU and RAM sizing.</li>
<li>Empty Managed PostgreSQL/MySQL databases and S3-compatible Object Storage buckets.</li>
</ul>
<h3>Step 3: Set up continuous data synchronization</h3>
<p>Moving gigabytes or terabytes of data takes time. Instead of stopping your application to take a snapshot, synchronize data while the AWS environment remains live:</p>
<ul>
<li><strong>Object Storage:</strong> Use a tool like <code>rclone</code> to copy objects from AWS S3 to OVHcloud Object Storage. Run an initial bulk sync, followed by periodic incremental syncs with checksum verification enabled.</li>
<li><strong>Relational Databases:</strong> Configure logical replication between AWS RDS and OVHcloud Public Cloud Databases. For PostgreSQL, use native <code>CREATE PUBLICATION</code> and <code>CREATE SUBSCRIPTION</code> after loading an initial schema and base backup. For MySQL, configure binlog replication from the AWS source to the OVHcloud replica.</li>
</ul>
<p>Keep this replication running until replication lag drops to near zero.</p>
<h3>Step 4: Point your CI/CD pipelines</h3>
<p>Update your GitHub Actions, GitLab CI, or ArgoCD pipelines to deploy your application code to the new OVHcloud environment alongside AWS. Verify that container images pull cleanly, environment variables and secrets are mounted properly, and internal services can communicate over the vRack private network. Run end-to-end tests against the OVHcloud staging URL or load balancer IP before routing real user traffic.</p>
<h3>Step 5: Execute the cutover and keep a rollback path</h3>
<p>Twenty-four hours before your planned switch, lower the TTL (Time to Live) on your DNS records (in Route 53, Cloudflare, or your DNS provider) to 60 seconds.</p>
<p>At the scheduled cutover window:</p>
<ol>
<li>Put your application into maintenance mode or pause database writes on the AWS side.</li>
<li>Wait until database replication lag reaches zero (typically under 5 seconds once writes stop) and run a final <code>rclone</code> pass on object storage.</li>
<li>Promote the OVHcloud database to primary (standalone writable).</li>
<li>Update your DNS records to point to the OVHcloud Load Balancer IPs.</li>
<li>Re-enable writes on the OVHcloud environment.</li>
</ol>
<p>For critical workloads, configure reverse logical replication from OVHcloud back to AWS for the first two to four weeks. Leaving the old AWS environment running (or scaled down with synced data) gives you a reliable rollback option before you permanently delete your AWS resources.</p>
<h2>Planning checklist: AWS to OVHcloud</h2>
<p>Use this checklist with your engineering and operations team before scheduling a cutover date:</p>
<ul>
<li><input disabled type="checkbox" /> <strong>EU Data Act fee waiver requested:</strong> If you are transferring significant data volume out of AWS, submit an exit switching request under the AWS EU Data Act Addendum in advance to have switching egress fees reduced or waived.</li>
<li><input disabled type="checkbox" /> <strong>Region and AZ requirements verified:</strong> Confirm whether a standard OVHcloud region (<code>GRA</code>, <code>SBG</code>, <code>LIM</code>, <code>BHS</code>) or a 3-AZ region (<code>PAR</code>) matches your resilience needs and supports all required managed services.</li>
<li><input disabled type="checkbox" /> <strong>Quota limits raised:</strong> New OVHcloud Public Cloud projects have default OpenStack quotas for vCPUs, RAM, and instances. Request quota increases via OVHcloud support before running your Terraform apply.</li>
<li><input disabled type="checkbox" /> <strong>S3 SDK compatibility tested:</strong> Ensure your application's S3 client libraries support custom endpoint URLs and path-style or virtual-hosted-style addressing as used by OVHcloud Object Storage.</li>
<li><input disabled type="checkbox" /> <strong>Database extensions checked:</strong> Compare installed PostgreSQL extensions or MySQL plugins on AWS RDS against the supported extensions list in OVHcloud Public Cloud Databases.</li>
<li><input disabled type="checkbox" /> <strong>SSL/TLS certificates provisioned:</strong> If you use AWS Certificate Manager (ACM) attached to an ALB, plan to replace it with Let's Encrypt (<code>cert-manager</code> on Kubernetes) or imported certificates on the OVHcloud Load Balancer, as ACM certificates cannot be exported.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Can I keep using S3 tools and SDKs with OVHcloud Object Storage?</h3>
<p>Yes. OVHcloud Object Storage supports the standard S3 API. You can continue using the official AWS SDKs (such as <code>boto3</code> for Python or <code>@aws-sdk/client-s3</code> for Node.js), the AWS CLI, and backup tools like <code>restic</code> or <code>velero</code>. You only need to change the endpoint URL, region identifier, and access credentials in your application configuration.</p>
<h3>Does AWS charge egress fees when I migrate to OVHcloud?</h3>
<p>Under Article 29 of the EU Data Act (Regulation (EU) 2023/2854), cloud providers may charge no more than direct costs for switching-related data egress until 12 January 2027, and must remove switching charges completely from 12 January 2027 onward. AWS provides a formal process under its EU Data Act Addendum to request reduced or waived data transfer fees when switching to another provider. Note that you must apply to AWS Support prior to migrating the data, and standard fees still apply if you keep running a permanent multi-cloud setup rather than completing a switch.</p>
<h3>What happens to my AWS ACM SSL certificates during the move?</h3>
<p>Public SSL/TLS certificates generated through AWS Certificate Manager (ACM) are bound to AWS services like Elastic Load Balancing and CloudFront and cannot be exported. When moving to OVHcloud, you will need to issue new certificates—typically by automating Let's Encrypt via <code>cert-manager</code> on Kubernetes or ACME clients on your load balancers—prior to switching your DNS records.</p>
<h3>How long does a typical AWS to OVHcloud migration take?</h3>
<p>For a small to mid-sized company running standard virtual machines, a managed Kubernetes cluster, PostgreSQL/MySQL, and S3 storage, the end-to-end process typically takes two to four weeks of calendar time. Most of that time is spent writing and testing the Terraform code, verifying CI/CD deployments, and letting initial database and storage replication complete in the background. The actual cutover window usually requires only a few minutes of paused writes.</p>
<h2>How MoveInfra can help</h2>
<p>MoveInfra automates the infrastructure transition from AWS to EU-owned clouds, including OVHcloud. You start by uploading your cloud bill for a free inventory and fixed-price quote, after which MoveInfra rebuilds your environment on OVHcloud as clean Terraform code, syncs your databases and object storage with live replication, and helps your team point your CI/CD pipelines to the new setup. Once replication lag is under five seconds, we coordinate the DNS switch during a brief write pause and maintain 30 days of reverse replication so you always have a safe rollback option.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (DORA) on EUR-Lex</a></li>
<li><a href="https://docs.ovhcloud.com/en/">OVHcloud Public Cloud Documentation</a></li>
<li><a href="https://www.ovhcloud.com/en-ie/public-cloud/prices/">OVHcloud Public Cloud Pricing</a></li>
<li><a href="https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer">AWS Data Transfer Pricing and Switching FAQs</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/aws-to-ovhcloud-migration/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[AWS to Scaleway: A Service-by-Service Migration Overview]]></title><description><![CDATA[Compare AWS services to their Scaleway equivalents and learn how to migrate compute, databases, storage, and networking to a French-owned EU cloud.]]></description><link>https://moveinfra.hashnode.dev/aws-to-scaleway-a-service-by-service-migration-overview</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/aws-to-scaleway-a-service-by-service-migration-overview</guid><category><![CDATA[AWS]]></category><category><![CDATA[scaleway]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[european cloud]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:22:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/0c0a3598-b777-4bf4-8d35-d9eab732e8ea.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/aws-to-scaleway-migration/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Migrating from AWS to Scaleway means moving from a sprawling catalog of over 200 proprietary services to a focused, European-owned cloud built on open standards. For most small and mid-sized engineering teams, Scaleway covers the core infrastructure stack directly: virtual machines, managed Kubernetes, managed PostgreSQL and MySQL, Redis-compatible caching, S3-compatible object storage, and even SQS/SNS-compatible messaging. The transition is straightforward for standard web applications and containerized workloads, while architectures heavily tied to AWS-specific services like DynamoDB or Redshift require either refactoring or a phased migration.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Direct mappings for core workloads:</strong> Compute (EC2 to Instances), containers (EKS to Kapsule), relational databases (RDS to Managed Databases), and storage (S3 to Object Storage) have direct equivalents on Scaleway.</li>
<li><strong>Built-in protocol compatibility:</strong> Scaleway supports the S3 API for storage and implements the AWS SQS and SNS protocols for queuing and messaging, reducing the need to rewrite application code.</li>
<li><strong>European jurisdiction:</strong> Scaleway is a French company (part of the Iliad Group) operating data centers in Paris, Amsterdam, Warsaw, and Milan under EU law.</li>
<li><strong>Predictable cost structure:</strong> Scaleway uses flat, resource-based pricing with free private network traffic, removing the complex per-gigabyte internal routing charges common on AWS.</li>
<li><strong>Clear boundaries on proprietary tools:</strong> AWS-specific services like DynamoDB, Cognito, and Redshift do not have drop-in managed equivalents on Scaleway and require open-source alternatives.</li>
</ul>
<h2>Why European teams move from AWS to Scaleway</h2>
<p>For companies of 10 to 300 people, AWS often provides more complexity than the business actually uses. Teams end up paying a premium—both in monthly bills and engineering time—to configure VPC peering, NAT gateways, IAM policy chains, and granular billing alarms.</p>
<p>Scaleway offers a middle ground between bare-bones server hosts and US hyperscalers. Founded in 1999 and headquartered in Paris as a subsidiary of the Iliad Group, Scaleway operates Multi-AZ regions in the European Union, including Paris (<code>fr-par</code>), Amsterdam (<code>nl-ams</code>), and Warsaw (<code>pl-waw</code>). Because it is EU-owned and operated, customer data stays within European jurisdiction without exposure to the US CLOUD Act. In contrast, even the AWS European Sovereign Cloud remains owned by Amazon, a US corporation.</p>
<p>Regulatory requirements also drive the move. The Digital Operational Resilience Act (DORA), which applies from January 17, 2025, requires financial entities and their critical ICT providers to maintain practical exit strategies and avoid concentration risk. Furthermore, under Article 29 of the EU Data Act, cloud switching charges—including data egress fees when moving to another provider—are capped at cost until January 12, 2027, and banned entirely from that date onward.</p>
<h2>Service-by-service comparison: AWS to Scaleway</h2>
<p>Before moving any workload, you need an accurate map of how your current AWS resources translate to Scaleway products. </p>
<table>
<thead>
<tr>
<th align="left">Category</th>
<th align="left">AWS Service</th>
<th align="left">Scaleway Equivalent</th>
<th align="left">Migration Effort &amp; Notes</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Virtual Machines</strong></td>
<td align="left">EC2</td>
<td align="left">Instances (General Purpose, Compute, Memory)</td>
<td align="left"><strong>Low.</strong> Standard Linux images; rebuild via Terraform and redeploy apps.</td>
</tr>
<tr>
<td align="left"><strong>Bare Metal</strong></td>
<td align="left">EC2 Bare Metal</td>
<td align="left">Elastic Metal</td>
<td align="left"><strong>Low.</strong> Dedicated physical servers billed hourly or monthly.</td>
</tr>
<tr>
<td align="left"><strong>Kubernetes</strong></td>
<td align="left">EKS</td>
<td align="left">Kubernetes Kapsule / Kosmos</td>
<td align="left"><strong>Low.</strong> Standard CNCF Kubernetes; Helm charts and manifests port directly.</td>
</tr>
<tr>
<td align="left"><strong>Serverless Compute</strong></td>
<td align="left">Lambda / Fargate</td>
<td align="left">Serverless Functions / Serverless Containers</td>
<td align="left"><strong>Medium.</strong> Event triggers and handler signatures differ; requires wrapper adjustments.</td>
</tr>
<tr>
<td align="left"><strong>Relational DBs</strong></td>
<td align="left">RDS / Aurora (PostgreSQL, MySQL)</td>
<td align="left">Managed Database for PostgreSQL and MySQL</td>
<td align="left"><strong>Low to Medium.</strong> Standard engines; migrate via logical replication (<code>pg_dump</code>/WAL).</td>
</tr>
<tr>
<td align="left"><strong>In-Memory Cache</strong></td>
<td align="left">ElastiCache (Redis / Valkey)</td>
<td align="left">Managed Database for Redis</td>
<td align="left"><strong>Low.</strong> Update connection strings and TLS settings; cache rebuilds naturally.</td>
</tr>
<tr>
<td align="left"><strong>Object Storage</strong></td>
<td align="left">S3</td>
<td align="left">Object Storage</td>
<td align="left"><strong>Low.</strong> S3-compatible API; change endpoint URL and credentials in your SDK.</td>
</tr>
<tr>
<td align="left"><strong>Block Storage</strong></td>
<td align="left">EBS</td>
<td align="left">Block Storage</td>
<td align="left"><strong>Low.</strong> Network-attached SSD volumes attached to Instances or Kubernetes.</td>
</tr>
<tr>
<td align="left"><strong>Load Balancing</strong></td>
<td align="left">ALB / NLB</td>
<td align="left">Load Balancers</td>
<td align="left"><strong>Low.</strong> Supports Layer 4 and Layer 7 routing, SSL termination, and health checks.</td>
</tr>
<tr>
<td align="left"><strong>Networking</strong></td>
<td align="left">VPC, Subnets, Security Groups</td>
<td align="left">VPC, Private Networks, Security Groups</td>
<td align="left"><strong>Low to Medium.</strong> Simpler model; Private Networks attach resources across AZs.</td>
</tr>
<tr>
<td align="left"><strong>Queues &amp; Pub/Sub</strong></td>
<td align="left">SQS / SNS</td>
<td align="left">Queues / Topics and Events ( plus NATS)</td>
<td align="left"><strong>Low to Medium.</strong> Implements AWS SQS and SNS protocols; point AWS SDK to Scaleway endpoints.</td>
</tr>
<tr>
<td align="left"><strong>Transactional Email</strong></td>
<td align="left">SES</td>
<td align="left">Transactional Email (TEM)</td>
<td align="left"><strong>Low.</strong> Supports SMTP and HTTP API; requires updating DNS SPF/DKIM records.</td>
</tr>
<tr>
<td align="left"><strong>Secrets &amp; Keys</strong></td>
<td align="left">Secrets Manager / KMS</td>
<td align="left">Secret Manager / Key Manager</td>
<td align="left"><strong>Medium.</strong> Requires updating CI/CD pipelines or external-secrets operators.</td>
</tr>
<tr>
<td align="left"><strong>NoSQL &amp; Warehouses</strong></td>
<td align="left">DynamoDB, Redshift</td>
<td align="left"><em>No direct managed equivalent</em></td>
<td align="left"><strong>High.</strong> Requires migrating to PostgreSQL (JSONB), self-hosted ClickHouse, or third-party SaaS.</td>
</tr>
</tbody></table>
<h2>Deep dive into key infrastructure areas</h2>
<h3>Compute and containers</h3>
<p>If you run virtual machines on EC2, Scaleway splits its Instances into Development (shared resources for staging and testing) and Production ranges (General Purpose <code>POP2</code>, Compute Optimized <code>COP</code>, and Memory Optimized <code>MOP</code> with dedicated vCPUs). Like AWS, Scaleway separates compute from network-attached Block Storage, allowing you to resize volumes independently.</p>
<p>For teams on Amazon EKS, Scaleway's <strong>Kubernetes Kapsule</strong> is often the easiest part of the migration. EKS relies heavily on AWS-specific IAM roles for service accounts (IRSA), custom VPC CNI plugins, and ALB Ingress Controllers. Kapsule runs certified, upstream Kubernetes with a free managed control plane. When migrating, you replace AWS-specific annotations on your Ingress and StorageClass manifests with Scaleway's CSI (Container Storage Interface) and Load Balancer annotations, then apply the same deployments.</p>
<h3>Relational databases and caching</h3>
<p>Scaleway offers Managed Databases for PostgreSQL and MySQL with standalone or High Availability (HA) configurations. An HA cluster provisions a standby node in a separate Availability Zone with synchronous replication.</p>
<p>Moving from RDS or Aurora PostgreSQL/MySQL does not require changing your database schema, provided you are not using proprietary Aurora extensions. The safest migration method is logical replication. You provision the target database on Scaleway, take an initial snapshot of your AWS database, and stream ongoing changes (Write-Ahead Logs in PostgreSQL or binlogs in MySQL) over an encrypted connection until the Scaleway database is in sync.</p>
<p>For caching, AWS ElastiCache maps to Scaleway's <strong>Managed Database for Redis</strong>. Because cache data is normally transient, most teams simply deploy a new Redis cluster in Scaleway's Private Network and let the application populate the cache after cutover.</p>
<h3>Object storage and CDN</h3>
<p>Scaleway Object Storage is built on the S3 API. If your application uses <code>boto3</code>, the AWS SDK for JavaScript, or any standard S3 client, you do not need to rewrite your storage logic. You only change the region (for example, <code>fr-par</code>) and the endpoint URL (<code>https://s3.fr-par.scw.cloud</code>) in your client configuration. </p>
<p>Scaleway also includes Multi-AZ redundancy as standard in its main regions and provides archival tiers (Scaleway Glacier) that respond to standard S3 restore commands. For content delivery, Scaleway Edge Services provides caching and custom TLS domains in front of buckets, replacing basic Amazon CloudFront setups.</p>
<h3>Networking and security</h3>
<p>Networking is where engineers notice the biggest philosophical difference between AWS and Scaleway. On AWS, designing a VPC requires calculating CIDR blocks for public and private subnets across each Availability Zone, configuring route tables, and paying hourly and per-gigabyte fees for NAT Gateways so private instances can reach the internet.</p>
<p>Scaleway simplifies this with <strong>VPC</strong> and <strong>Private Networks</strong>. A Private Network is a regional Layer 2/Layer 3 network that spans all Availability Zones in a region. You attach Instances, Kubernetes clusters, Managed Databases, and Load Balancers directly to the Private Network. For outbound internet access from private resources, Scaleway offers a Public Gateway (managed NAT), which is billed at a flat hourly/monthly rate without per-gigabyte processing charges.</p>
<h3>Queues, serverless, and application services</h3>
<p>Many European cloud providers lack application-level middleware, forcing teams to self-host RabbitMQ or Kafka when leaving AWS. Scaleway is an exception here. Its <strong>Queues</strong> and <strong>Topics and Events</strong> services are built as compatible implementations of the AWS SQS and AWS SNS protocols (alongside native support for CNCF NATS). In many cases, you can keep using the AWS SDK in your worker services by pointing the endpoint to Scaleway's messaging API, though you should check Scaleway's documentation for specific SQS parameters your app might rely on.</p>
<p>For serverless workloads, Scaleway provides Serverless Functions (supporting Python, Node.js, Go, PHP, and Rust) and Serverless Containers (comparable to AWS App Runner or Fargate). While the concepts are identical, event payloads and IAM bindings differ from AWS Lambda, so you will need to adapt your function entrypoints and Terraform definitions.</p>
<h2>What does not map directly</h2>
<p>Being realistic about what Scaleway cannot do is the most important part of migration planning. You will need to rethink your architecture if you rely on:</p>
<ul>
<li><strong>Proprietary NoSQL (DynamoDB):</strong> Scaleway does not have a managed key-value/document store equivalent to DynamoDB. Teams migrating off DynamoDB typically move the data into PostgreSQL using <code>JSONB</code> columns, or use a managed MongoDB/Cassandra service hosted on EU regions via a third-party provider.</li>
<li><strong>Cloud Data Warehouses (Redshift):</strong> Scaleway does not offer a managed petabyte-scale data warehouse. Teams usually migrate analytical workloads to self-hosted ClickHouse on Scaleway Instances/Kubernetes, or use PostgreSQL with analytical extensions for smaller datasets.</li>
<li><strong>Complex IAM and Cognito:</strong> Scaleway IAM supports users, groups, applications, and policy rules scoped to projects and resource types, which is sufficient for infrastructure access control. However, if you use Amazon Cognito for end-user authentication, you will need to migrate to an open-source identity provider like Keycloak or an EU-hosted auth service.</li>
</ul>
<h2>Practical migration checklist</h2>
<p>If you are planning a move from AWS to Scaleway, follow this sequence to keep risk low and rollback options open:</p>
<ol>
<li><strong>Audit your AWS bill and Terraform state:</strong> List every active service across all AWS regions. Flag any proprietary services (DynamoDB, Lambda, SQS, Cognito) that need specific compatibility checks.</li>
<li><strong>Choose your target Scaleway region:</strong> Select Paris (<code>fr-par</code>), Amsterdam (<code>nl-ams</code>), or Warsaw (<code>pl-waw</code>) based on user latency and data residency needs. Verify that all required instance types exist in your chosen Availability Zones.</li>
<li><strong>Rebuild infrastructure as code:</strong> Write new Terraform or OpenTofu configurations using the official <code>scaleway/scaleway</code> provider. Set up your VPC, Private Networks, Security Groups, and Public Gateways first.</li>
<li><strong>Provision and sync stateful stores:</strong> Launch Managed PostgreSQL/MySQL and Object Storage buckets. Start continuous logical replication from RDS to Scaleway, and use <code>rclone</code> or a similar checksum-verified tool to sync S3 buckets.</li>
<li><strong>Adapt CI/CD pipelines:</strong> Update your GitHub Actions or GitLab CI workflows to push container images to Scaleway Container Registry and deploy to your new Scaleway Instances or Kapsule cluster alongside AWS.</li>
<li><strong>Test in parallel:</strong> Run synthetic traffic and integration tests against the Scaleway environment using staging domains before touching production DNS.</li>
<li><strong>Execute the DNS cutover:</strong> Lower DNS TTLs ahead of time. During a scheduled maintenance window, pause writes on the AWS application, verify that database replication lag is near zero, promote the Scaleway database to primary, and update your DNS records.</li>
<li><strong>Maintain a rollback window:</strong> Keep the AWS environment alive (and ideally syncing data back from Scaleway) for two to four weeks before deleting AWS resources and closing the account.</li>
</ol>
<h2>Frequently asked questions</h2>
<h3>Can I keep using the AWS SDK for S3 and SQS on Scaleway?</h3>
<p>Yes. Scaleway Object Storage is compatible with the Amazon S3 API, and Scaleway Queues and Topics/Events implement the AWS SQS and SNS protocols. In most languages, you can continue using the official AWS SDK by overriding the <code>endpoint_url</code> and <code>region</code> parameters and supplying your Scaleway access and secret keys. Always test specific features like S3 lifecycle rules or SQS dead-letter queues in staging first.</p>
<h3>How does Scaleway pricing compare to AWS?</h3>
<p>Scaleway generally offers lower and more predictable pricing than AWS, particularly on bandwidth and Kubernetes management. The Kubernetes Kapsule control plane is free (you only pay for worker nodes), and egress traffic is significantly cheaper than standard AWS data transfer rates. Because prices vary by instance family and region, check the official Scaleway pricing page for current 2026 list prices.</p>
<h3>Does Scaleway support Terraform and OpenTofu?</h3>
<p>Yes. Scaleway maintains an official, well-documented provider in the Terraform and OpenTofu registries. You can manage almost all resources—including Instances, Kapsule clusters, Managed Databases, Object Storage buckets, and IAM policies—entirely through code.</p>
<h3>How much downtime is required to switch from AWS to Scaleway?</h3>
<p>For standard web applications using PostgreSQL, MySQL, and S3, the infrastructure is built and synced while AWS remains live. The actual switch only requires a brief planned write pause—typically a few minutes—to let the final database transactions replicate, run sanity checks, and flip the DNS records.</p>
<h2>How MoveInfra can help</h2>
<p>If your team wants to move from AWS to Scaleway without spending weeks writing new Terraform modules and managing live database replication by hand, MoveInfra can run the transition for you. Upload your AWS bill for a free analysis and fixed migration price, and we will rebuild your infrastructure as code on Scaleway, sync your databases and S3 buckets in the background, and help your team point your CI/CD pipelines to the new environment. When replication lag is under five seconds, we coordinate a short planned cutover and keep reverse replication running for 30 days so you always have a safe rollback option.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://www.scaleway.com/en/docs/">Scaleway Product Documentation</a></li>
<li><a href="https://www.scaleway.com/en/docs/queues/reference-content/queues-overview/">Scaleway Queues Overview (SQS Compatibility)</a></li>
<li><a href="https://www.scaleway.com/en/pricing/">Scaleway Pricing Overview</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (DORA) on EUR-Lex</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/aws-to-scaleway-migration/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to move your company's infrastructure to an EU cloud]]></title><description><![CDATA[A plain-English guide to migrating from US clouds to European providers like UpCloud, Scaleway, Hetzner, or OVHcloud, covering costs, steps, and risks]]></description><link>https://moveinfra.hashnode.dev/how-to-move-your-companys-infrastructure-to-an-eu-cloud</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/how-to-move-your-companys-infrastructure-to-an-eu-cloud</guid><category><![CDATA[Cloud Migration]]></category><category><![CDATA[eu cloud]]></category><category><![CDATA[Sovereignty]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[data act]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Tue, 03 Nov 2026 08:22:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/01df1864-9d6b-4e29-81e0-638626868a7b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/how-to-move-infrastructure-to-an-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Moving your company's infrastructure from a US cloud provider like AWS, Google Cloud, Azure, or DigitalOcean to a European provider is a structured engineering project that usually takes a few weeks of preparation and a brief, planned cutover window. Instead of moving everything at once by hand, the safest approach follows six clear steps: auditing your current bill and resources, rebuilding the servers and networks on the new European cloud using infrastructure-as-code, setting up live data synchronization for your databases and files, pointing your existing deployment pipelines to the new servers, switching your domain names over during a short maintenance pause, and keeping the old environment running in reverse sync for a few weeks as a safety net. For standard web applications built on Linux servers, PostgreSQL or MySQL, Redis, Kubernetes, and S3-compatible storage, the transition is straightforward; only deeply proprietary cloud services require code changes before you move.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Standard stacks move easily:</strong> If your application runs on virtual machines, containers, Kubernetes, PostgreSQL, MySQL, Redis, and S3-compatible object storage, you can move to a European cloud without rewriting your application code.</li>
<li><strong>Proprietary services take extra work:</strong> Databases like AWS DynamoDB, Google Firestore, or Azure Cosmos DB do not have drop-in equivalents on European clouds and require migrating to an open-source database first.</li>
<li><strong>You do not copy running applications:</strong> A good migration rebuilds clean infrastructure using code (like Terraform) and uses your existing CI/CD deployment pipeline to deploy your software to the new servers.</li>
<li><strong>Data moves while you stay online:</strong> By using logical replication for databases and checksum-verified syncing for object storage, you copy the bulk of your data in the background while your business continues operating normally.</li>
<li><strong>Switching fees are regulated:</strong> Under the EU Data Act, cloud providers can only pass on the actual direct cost of data egress when you switch providers, and all switching charges will be banned entirely starting January 12, 2027.</li>
</ul>
<h2>Why European companies are reconsidering where their infrastructure lives</h2>
<p>For the past decade, defaulting to AWS, Google Cloud, or Microsoft Azure was the standard path for European startups and mid-sized companies. Today, many founders, CFOs, and engineering leads at 10-to-300-person companies are reviewing that decision for three practical reasons: cost predictability, regulatory compliance, and vendor independence.</p>
<p>First, US hyperscaler bills often grow faster than the underlying business. While basic compute instances have predictable prices, auxiliary charges for network egress, managed NAT gateways, cross-zone traffic, and proprietary database inputs/outputs frequently make up a large portion of the monthly invoice. European cloud providers generally offer simpler pricing models, often bundling generous or unmetered network traffic with their virtual servers and managed services.</p>
<p>Second, legal and compliance teams face ongoing friction around data jurisdiction. Many US clouds offer EU regions—and Amazon has launched the AWS European Sovereign Cloud, which keeps data and operations inside the European Union—but these entities ultimately belong to US parent corporations subject to US extraterritorial laws like the CLOUD Act. For companies selling to European public sector bodies, healthcare organizations, or regulated financial institutions, using a cloud provider headquartered and owned within Europe simplifies vendor risk assessments. Furthermore, for financial entities and their critical ICT providers, the Digital Operational Resilience Act (DORA), which took effect on January 17, 2025, explicitly requires documented exit strategies and tested plans to move away from critical third-party infrastructure providers.</p>
<p>Finally, the financial barrier to leaving a cloud provider has dropped. Under Article 29 of the EU Data Act (Regulation (EU) 2023/2854), cloud providers are prohibited from imposing punitive egress fees when a customer switches to another provider. Until January 12, 2027, providers may charge no more than their actual, direct cost incurred for the data transfer, and from January 12, 2027 onward, switching charges—including data egress fees for switching—are banned completely. Importantly, major hyperscalers already offer specific fee-waiver programs if you notify their support teams before migrating off their platform.</p>
<h2>Choosing the right European cloud provider</h2>
<p>"EU cloud" is not a single category. Different European providers focus on different layers of the stack, ranging from raw, low-cost hardware to broad developer platforms. Choosing the right destination depends on which services your engineering team relies on today.</p>
<table>
<thead>
<tr>
<th align="left">Provider</th>
<th align="left">Headquarters</th>
<th align="left">Managed PostgreSQL / MySQL</th>
<th align="left">Managed Kubernetes</th>
<th align="left">S3-Compatible Storage</th>
<th align="left">Typical Best Fit</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>UpCloud</strong></td>
<td align="left">Finland</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">High-performance general workloads, balanced managed services, reliable support.</td>
</tr>
<tr>
<td align="left"><strong>Scaleway</strong></td>
<td align="left">France</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Cloud-native teams wanting AWS-like features (queues, serverless containers, IAM).</td>
</tr>
<tr>
<td align="left"><strong>Hetzner</strong></td>
<td align="left">Germany</td>
<td align="left">No (Self-hosted)</td>
<td align="left">No (Self-hosted)</td>
<td align="left">Yes</td>
<td align="left">Cost-conscious teams comfortable managing databases and Kubernetes on Linux VMs.</td>
</tr>
<tr>
<td align="left"><strong>OVHcloud</strong></td>
<td align="left">France</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Large footprint, dedicated bare-metal servers mixed with public cloud services.</td>
</tr>
<tr>
<td align="left"><strong>STACKIT / IONOS / Exoscale</strong></td>
<td align="left">Germany / Switzerland</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Enterprises and DACH-region businesses with strict local compliance mandates.</td>
</tr>
</tbody></table>
<p>If your team currently uses managed databases (like AWS RDS or Cloud SQL) and managed Kubernetes (like EKS or GKE), moving to <strong>UpCloud</strong>, <strong>Scaleway</strong>, or <strong>OVHcloud</strong> allows you to keep an equivalent operational model. If you choose <strong>Hetzner</strong> for its lower compute prices, your team—or your migration partner—will need to set up and maintain PostgreSQL, MySQL, or Kubernetes directly on virtual servers, including handling automated backups, patching, and failover.</p>
<h2>What moves easily—and what requires engineering work</h2>
<p>Before planning dates, you need an honest assessment of how tightly coupled your software is to your current provider. Cloud services generally fall into three migration buckets:</p>
<h3>1. Direct equivalents (Low effort)</h3>
<p>These components use open standards or open-source software under the hood. They can be recreated on a European cloud with no changes to your application code:</p>
<ul>
<li><strong>Virtual machines:</strong> Linux servers (EC2, Compute Engine, Droplets).</li>
<li><strong>Relational databases:</strong> Managed PostgreSQL and MySQL/MariaDB.</li>
<li><strong>Object storage:</strong> S3-compatible buckets (used for user uploads, backups, and static assets). Since European providers support the standard S3 API, you only need to change the endpoint URL and access keys in your application configuration.</li>
<li><strong>Caches:</strong> Redis-compatible in-memory stores (moving to managed Valkey or Redis).</li>
<li><strong>Containers and orchestration:</strong> Docker workloads running on standard Kubernetes clusters.</li>
<li><strong>Networking:</strong> Private networks (VPCs), firewall rules (security groups), and standard HTTP/TCP load balancers.</li>
</ul>
<h3>2. Services needing light adaptation (Medium effort)</h3>
<p>These components aren't always standardized, so moving them requires updating configuration files, deployment scripts, or small wrapper modules in your code:</p>
<ul>
<li><strong>Message queues and pub/sub:</strong> Moving from AWS SQS or Google Pub/Sub to either Scaleway's messaging services or a self-hosted/managed RabbitMQ, NATS, or Redis queue.</li>
<li><strong>Serverless functions:</strong> AWS Lambda or Cloud Functions usually need to be packaged into lightweight containers or moved to a European provider's serverless platform.</li>
<li><strong>Transactional email and DNS:</strong> Moving from AWS SES or Route 53 to independent European or specialized providers, updating DNS records and API credentials.</li>
<li><strong>CI/CD permissions:</strong> Updating GitHub Actions or GitLab CI pipelines to authenticate with the new cloud's container registry and deployment targets instead of AWS IAM or Google Cloud IAM.</li>
</ul>
<h3>3. Proprietary lock-in services (High effort)</h3>
<p>If your application relies heavily on proprietary databases or analytics engines, you cannot simply move them as-is. You must refactor that part of your application before or after the main infrastructure move:</p>
<ul>
<li><strong>Proprietary NoSQL:</strong> AWS DynamoDB, Google Firestore, and Azure Cosmos DB have unique APIs and data models. Moving off them requires rewriting your data access layer to use PostgreSQL (often using JSONB columns), MongoDB, or an open-source key-value store.</li>
<li><strong>Cloud data warehouses:</strong> Amazon Redshift, Google BigQuery, and Azure Synapse require migrating schemas and SQL queries to an alternative like ClickHouse, PostgreSQL, or an independent data platform.</li>
</ul>
<h2>The 6-step migration process</h2>
<p>A calm, predictable cloud migration does not involve freezing feature development for months or copying whole virtual hard drives across the internet. Instead, it separates building the environment, syncing the data, and switching the traffic into distinct steps.</p>
<h3>Step 1: Audit and analyze</h3>
<p>Start by reviewing your current cloud bill and granting read-only access to inspect your live cloud account. Billing invoices are useful because they reveal forgotten resources—like unattached storage volumes, old snapshots, or secondary regions—that engineers often overlook. Make a complete inventory of every server size, database version, storage bucket, network subnet, and firewall rule. At this stage, calculate your expected monthly bill on the target European cloud so management has a clear financial baseline.</p>
<h3>Step 2: Rebuild the environment as code</h3>
<p>Do not clone live virtual machines byte-for-byte. Old servers often carry configuration drift and outdated system packages. Instead, recreate your target infrastructure cleanly on the European cloud using Infrastructure as Code (such as Terraform or OpenTofu). Provision the virtual private networks, firewall rules, load balancers, empty managed databases, and empty object storage buckets to match the sizing and topology of your current setup.</p>
<h3>Step 3: Synchronize the data live</h3>
<p>Moving gigabytes or terabytes of data takes time, so it must happen while your existing system remains live and serving customers.</p>
<ul>
<li><strong>For object storage:</strong> Use synchronization tools that copy files from your old buckets to the new European buckets and verify every file using cryptographic checksums. Run an initial bulk sync, followed by periodic incremental syncs to catch newly uploaded files.</li>
<li><strong>For databases:</strong> Set up <strong>logical replication</strong> between your old database (the source) and your new European database (the destination). In plain English, logical replication first takes a consistent snapshot of your existing tables and copies them over; once that finishes, it continuously streams every new <code>INSERT</code>, <code>UPDATE</code>, and <code>DELETE</code> from the old database to the new one in real time.</li>
</ul>
<h3>Step 4: Point your deployment pipelines</h3>
<p>With the new servers running and the data syncing, work with your engineering team to update your CI/CD pipelines (such as GitHub Actions or GitLab CI). Add a new deployment target so that your exact same application code and container images are deployed to the European environment alongside your current production environment. Update environment variables on the new servers to point to the new database endpoints, Redis instances, and object storage URLs. You can now test the new environment thoroughly using internal domain names without affecting live users.</p>
<h3>Step 5: Execute the cutover switch</h3>
<p>A few days before the switch, lower the TTL (Time-To-Live) on your DNS records to 60 or 300 seconds so that internet routers do not cache your old IP addresses for long. </p>
<p>Wait until your database replication lag is consistently under 5 seconds and all automated health checks on the new environment pass. During a pre-announced, low-traffic maintenance window, follow a strict checklist:</p>
<ol>
<li>Put your application into a brief read-only or maintenance mode (pausing new database writes).</li>
<li>Verify that replication lag has reached zero—meaning every last transaction from the old cloud is now present in the European database.</li>
<li>Run a final delta sync on object storage buckets.</li>
<li>Promote the European database to be the primary standalone database.</li>
<li>Enable writes on the new European application environment.</li>
<li>Update your DNS records (or proxy targets in Cloudflare/similar) to point live user traffic to the new European load balancers.</li>
</ol>
<p>For most standard web applications, the actual write pause during this switch lasts only a few minutes.</p>
<h3>Step 6: Keep a rollback path, then clean up</h3>
<p>Never delete your old cloud environment the day after a migration. If an unexpected edge case appears three days later, you want a safe way back. By configuring <strong>reverse replication</strong>—streaming new database changes from the European cloud back to the old cloud—you keep the old environment warm and up to date. Keep this reverse sync running for 30 days. Once your team is completely confident in the stability and performance of the new setup, stop the sync, take final archival snapshots if required by your compliance policies, and shut down the old cloud resources so you stop paying for them.</p>
<h2>Common pitfalls to avoid</h2>
<ul>
<li><strong>Forgetting outbound IP allowlists:</strong> If your application connects to third-party partners (like payment gateways, banking APIs, or enterprise customer systems) that restrict access by IP address, give those partners your new European egress IP addresses well in advance of the cutover.</li>
<li><strong>SSL certificate rate limits:</strong> Make sure your new load balancers or ingress controllers can issue TLS/SSL certificates (for example, via Let's Encrypt HTTP or DNS challenges) before you switch live traffic, so users do not see browser security warnings during DNS propagation.</li>
<li><strong>Hardcoded region assumptions:</strong> Search your codebase for hardcoded AWS region strings (like <code>eu-central-1</code> or <code>amazonaws.com</code>) in file upload validators, Content Security Policy (CSP) headers, or image-processing workers.</li>
<li><strong>Ignoring email deliverability:</strong> If you send emails directly from your servers or move transactional email providers at the same time, ensure SPF, DKIM, and DMARC records are updated so password resets and invoices do not land in spam folders.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Will our customers experience downtime during the move?</h3>
<p>To avoid losing data when moving a relational database across two different cloud providers, you need a short planned pause on database writes during the final cutover. Because the bulk of the data is already synchronized in advance via logical replication, this maintenance window usually takes only a few minutes and can be scheduled during your quietest night or weekend hours.</p>
<h3>How much will we save by moving to an EU cloud?</h3>
<p>Savings vary depending on your workload, as hyperscalers and European providers price resources differently. Generally, raw compute, memory, managed databases, and especially outbound network bandwidth have lower list prices on providers like Hetzner, UpCloud, OVHcloud, and Scaleway compared to AWS, GCP, or Azure as of 2026. The most accurate way to know is to map your current resource inventory against the public pricing pages of your chosen European provider.</p>
<h3>What if we use AWS DynamoDB or Google BigQuery?</h3>
<p>Because European clouds do not offer drop-in clones of proprietary services like DynamoDB or BigQuery, you have two choices. You can either migrate those specific data stores to open-source alternatives (like PostgreSQL or ClickHouse) before moving your infrastructure, or you can move your main compute and standard databases to the EU cloud first while temporarily keeping the proprietary service where it is until your team refactors it.</p>
<h3>Do we have to pay high data egress fees to leave AWS, GCP, or Azure?</h3>
<p>No. Under Article 29 of the EU Data Act, providers cannot charge more than their direct cost for switching egress today, and all switching fees are banned from January 12, 2027. Most major US hyperscalers already provide a formal process to request credits or waivers for data transfer fees when you are permanently migrating workloads off their platform—just make sure to open that request with their support team <em>before</em> you start syncing large volumes of data.</p>
<h2>How MoveInfra can help</h2>
<p>MoveInfra handles this entire 6-step migration process for companies moving from AWS, Google Cloud, Azure, or DigitalOcean to European clouds like UpCloud, Scaleway, Hetzner, and OVHcloud. You can start by uploading your current cloud bill for a free analysis and fixed-price quote with no account access required. From there, MoveInfra rebuilds your infrastructure in Terraform, manages live database and storage replication, helps your team point your CI/CD pipelines to the new environment, and maintains a 30-day reverse-replication rollback window after the switch.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (Digital Operational Resilience Act - DORA) on EUR-Lex</a></li>
<li><a href="https://www.postgresql.org/docs/current/logical-replication.html">PostgreSQL Official Documentation: Logical Replication</a></li>
<li><a href="https://upcloud.com/pricing/">UpCloud Official Documentation and Pricing</a></li>
<li><a href="https://www.scaleway.com/en/docs/">Scaleway Official Documentation</a></li>
<li><a href="https://docs.hetzner.com/">Hetzner Official Documentation</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/how-to-move-infrastructure-to-an-eu-cloud/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[The EU Data Act and cloud switching: what changes on 12 January 2027]]></title><description><![CDATA[Under Article 29 of the EU Data Act, cloud providers must remove all switching and exit egress charges for EU customers starting 12 January 2027.]]></description><link>https://moveinfra.hashnode.dev/the-eu-data-act-and-cloud-switching-what-changes-on-12-january-2027</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/the-eu-data-act-and-cloud-switching-what-changes-on-12-january-2027</guid><category><![CDATA[EU Data Act]]></category><category><![CDATA[cloud switching]]></category><category><![CDATA[egress-fees]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[regulation]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Mon, 02 Nov 2026 22:11:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/237ca3a5-649c-416b-bdb6-571162162adc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/eu-data-act-cloud-switching-explained/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>On 12 January 2027, Article 29 of the EU Data Act (Regulation (EU) 2023/2854) takes full effect, making it illegal for cloud providers to charge switching fees—including data egress fees—when an EU customer moves to another provider or to on-premises infrastructure. Since 12 September 2025, providers have only been allowed to charge at-cost rates for switching and have been bound by strict contract rules, such as a maximum two-month notice period and a 30-day transition window. While the January 2027 deadline eliminates the financial penalty for exporting your data during a migration, it does not ban standard ongoing egress fees for everyday traffic, abolish fixed-term contract commitments, or solve the technical work of rebuilding your infrastructure on a new cloud.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Zero switching fees from 12 January 2027:</strong> Cloud providers can no longer charge data egress fees or administrative penalties when you export your data and metadata to switch providers.</li>
<li><strong>Contract rules already apply:</strong> Since 12 September 2025, Chapter VI of the EU Data Act has capped customer notice periods at two months and required a mandatory 30-day transition period.</li>
<li><strong>Everyday egress is still billed:</strong> The fee ban applies only to switching and parallel multi-cloud use (which remains capped at provider cost). Standard internet traffic and cross-region transfers in normal operations remain billable.</li>
<li><strong>Commitments still hold:</strong> Fixed-term contracts, reserved instances, and savings plans are not invalidated by the law. Early termination penalties remain legal if they are proportionate.</li>
<li><strong>Financial lock-in ends, technical work remains:</strong> Removing egress bills makes leaving a hyperscaler cheaper, but engineering teams still have to translate networks, IAM policies, and deployment pipelines.</li>
</ul>
<h2>What the EU Data Act actually does for cloud customers</h2>
<p>Regulation (EU) 2023/2854, known as the EU Data Act, entered into force in January 2024 and became generally applicable across the European Union on 12 September 2025. While much of the law deals with connected IoT devices and industrial data sharing, Chapter VI (Articles 23 to 31) targets a major operational headache for European software companies: cloud vendor lock-in.</p>
<p>In the text of the regulation, cloud platforms are called "data processing services". This definition covers Infrastructure-as-a-Service (IaaS), Platform-as-a-Service (PaaS), and Software-as-a-Service (SaaS). Importantly, the law applies based on where the customer is located, not where the provider has its headquarters. Whether you buy cloud infrastructure from AWS, Microsoft Azure, Google Cloud, DigitalOcean, or a European provider, Chapter VI applies to your contracts if your company is established in the EU.</p>
<p>The law breaks vendor lock-in down into three categories: contractual barriers, commercial barriers (fees), and technical barriers. Most of the contractual and technical rules took effect in September 2025. The commercial phase-out finishes on 12 January 2027.</p>
<h2>The timeline: 2024 to 2027</h2>
<p>The rollout of the cloud switching rules follows a three-stage schedule under Articles 29 and 50 of the regulation:</p>
<ol>
<li><strong>11 January 2024 – 12 January 2027 (Transitional period for fees):</strong> Under Article 29(2), providers were immediately barred from increasing switching charges and could only pass on the direct, actual costs incurred to execute a customer switch.</li>
<li><strong>12 September 2025 (General application):</strong> All contractual obligations under Article 25 and technical assistance obligations under Articles 26 through 30 took effect. Providers had to update their terms of service to allow switching upon request.</li>
<li><strong>12 January 2027 (Complete ban on switching charges):</strong> Under Article 29(1), switching charges drop to zero. Providers cannot charge for data egress, specialized export tooling, or support actions required to complete a migration to a new provider.</li>
</ol>
<h2>What changes on 12 January 2027 (and what does not)</h2>
<p>Many summaries of the EU Data Act claim that "cloud egress fees are banned in 2027". That is inaccurate and can lead to expensive mistakes in architecture planning. The regulation draws a sharp line between <strong>switching</strong> (leaving a service), <strong>in-parallel use</strong> (running a multi-cloud setup across providers), and <strong>ongoing operations</strong> (serving your application to users).</p>
<h3>1. Switching to another provider: Free from January 2027</h3>
<p>When you formally initiate a switch to move a workload from one cloud provider to another—or back to your own hardware—Article 29(1) prohibits the source provider from charging switching fees. This includes outbound data transfer (egress) fees for moving your databases, object storage buckets, virtual machine images, and configuration metadata to the destination provider.</p>
<h3>2. Multi-cloud and parallel use: Capped at cost permanently</h3>
<p>What if you are not leaving AWS or Google Cloud entirely, but want to run a database on one cloud and your Kubernetes cluster on an EU cloud? The Data Act calls this "in-parallel use". Under Article 34(2), providers are allowed to charge data egress fees for ongoing traffic between two clouds used in parallel, even after 12 January 2027. However, those fees cannot exceed the provider's actual technical cost of transferring the data. They cannot add a commercial markup to punish multi-cloud architectures.</p>
<h3>3. Normal operational egress: Still billed at standard rates</h3>
<p>The Data Act does not regulate what a cloud provider charges you to serve web traffic, software downloads, or video streams to your end users over the public internet. It also does not cap internal transfer charges, such as traffic crossing Availability Zones (AZs), NAT gateway processing fees, or inter-region replication within the same provider.</p>
<table>
<thead>
<tr>
<th align="left">Scenario</th>
<th align="left">Rule until 11 Jan 2027</th>
<th align="left">Rule from 12 Jan 2027</th>
<th align="left">Legal Reference</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>One-time data export to switch providers</strong></td>
<td align="left">Capped at provider's direct cost</td>
<td align="left"><strong>0 EUR</strong> (Banned)</td>
<td align="left">Article 29(1) &amp; (2)</td>
</tr>
<tr>
<td align="left"><strong>Provider support &amp; export tools for switching</strong></td>
<td align="left">Capped at provider's direct cost</td>
<td align="left"><strong>0 EUR</strong> (Banned)</td>
<td align="left">Article 29(1), Art. 2(36)</td>
</tr>
<tr>
<td align="left"><strong>Ongoing egress for multi-cloud (parallel use)</strong></td>
<td align="left">Capped at provider's direct cost</td>
<td align="left">Capped at provider's direct cost</td>
<td align="left">Article 34(2)</td>
</tr>
<tr>
<td align="left"><strong>Standard internet egress (serving end users)</strong></td>
<td align="left">Standard list price</td>
<td align="left">Standard list price</td>
<td align="left">Outside scope</td>
</tr>
<tr>
<td align="left"><strong>Cross-AZ or inter-region traffic within one cloud</strong></td>
<td align="left">Standard list price</td>
<td align="left">Standard list price</td>
<td align="left">Outside scope</td>
</tr>
<tr>
<td align="left"><strong>Early termination of fixed-term commitments</strong></td>
<td align="left">Proportionate penalty allowed</td>
<td align="left">Proportionate penalty allowed</td>
<td align="left">Article 25(2), Recital 89</td>
</tr>
</tbody></table>
<h2>Your contractual rights under Article 25</h2>
<p>While the removal of egress fees gets the most attention, the contractual timeline rules in Article 25 are just as important when planning an infrastructure migration. Every cloud contract with an EU customer must include these baseline terms:</p>
<ul>
<li><strong>Maximum 2-month notice period:</strong> You have the right to initiate a switch at any time by giving notice. The provider cannot require a notice period longer than two months.</li>
<li><strong>Mandatory 30-day transition period:</strong> Once the notice period ends, the provider must assist with the migration and complete the transition within a maximum of 30 calendar days. If the provider can prove that a 30-day transition is technically impossible, they must notify you within 14 working days and may extend the transition period once, up to seven months. As a customer, however, you always have the right to extend the transition period to a timeframe that fits your engineering schedule.</li>
<li><strong>Continuity and security:</strong> During the transition, the source provider must maintain business continuity, provide reasonable assistance, and keep a high level of security for your data and services.</li>
<li><strong>Minimum 30-day data retrieval window:</strong> After the transition period concludes, you have at least 30 calendar days to retrieve any remaining exportable data before the provider deletes it.</li>
<li><strong>Automatic termination:</strong> Your old contract terminates automatically once the switching process is successfully completed, or at the end of the two-month notice period if you decide not to migrate your data and simply want to close the account.</li>
</ul>
<h3>How hyperscaler exit programs work in practice</h3>
<p>In response to the regulation, AWS, Google Cloud, and Microsoft Azure introduced formal data transfer waivers for customers leaving their platforms. However, as of 2026, these waivers are rarely automatic at the billing level. </p>
<p>Instead of simply making outbound transfers free when you delete an S3 bucket or a Cloud Storage bucket, hyperscalers generally require you to open a support case before you begin the migration, declare your intent to switch under the EU Data Act terms, and specify the accounts and timeline involved. You then pay the standard egress invoice and receive a credit refund afterward, or operate under a time-limited fee waiver tied to account closure. If you copy 50 terabytes of object storage to a new provider <em>before</em> submitting the formal switching notice, you risk paying standard list prices for that transfer.</p>
<h3>The catch with Reserved Instances and Enterprise Agreements</h3>
<p>The EU Data Act gives you the right to exit a cloud contract with two months' notice, even if you signed a three-year enterprise commitment. However, Recital 89 and Article 2(36) explicitly state that <strong>proportionate early termination penalties</strong> are not considered switching charges.</p>
<p>If you signed a three-year spend commitment or bought three-year Reserved Instances in exchange for a 40% discount, the provider can still bill you an early termination fee to recoup the unearned discount or require you to pay out the remaining committed balance, depending on your contract terms. Furthermore, you must continue paying standard service fees for the compute and storage you consume while the migration is underway.</p>
<h2>Differentiating the EU Data Act, DORA, and data sovereignty</h2>
<p>For European founders, CFOs, and CTOs, the EU Data Act sits alongside two other major considerations: financial sector compliance (DORA) and foreign legal jurisdiction.</p>
<h3>DORA and cloud exit strategies</h3>
<p>If your company is a financial entity—or a critical ICT third-party provider selling to banks, insurers, or payment processors—the Digital Operational Resilience Act (Regulation (EU) 2022/2554, or DORA) has applied to you since 17 January 2025. DORA requires documented, tested exit strategies for ICT services supporting critical or important functions. </p>
<p>Previously, DORA created a frustrating mismatch: financial regulators required you to have a credible cloud exit plan, while cloud contracts and egress fees made executing that plan slow and expensive. The EU Data Act fixes the supplier side of this equation. By mandating a 30-day transition window, documented export formats, and zero switching charges from January 2027, the Data Act gives regulated companies the legal enforcement mechanism to make their DORA exit plans work in reality.</p>
<h3>Switching vs. sovereignty</h3>
<p>It is also helpful to separate data portability from legal sovereignty. In response to European regulatory pressure, US hyperscalers have launched specialized regions, such as the AWS European Sovereign Cloud. While the AWS European Sovereign Cloud keeps data and operations physically inside the EU and is run by EU-resident personnel, it still belongs to Amazon, a US parent company. As a result, it remains subject to US jurisdiction and extraterritorial laws like the US CLOUD Act.</p>
<p>The EU Data Act does not force you to leave US providers, nor does it solve US CLOUD Act exposure on its own. What it does is remove the financial penalty if you decide that moving to an EU-owned cloud—such as UpCloud, Scaleway, Hetzner, OVHcloud, STACKIT, IONOS, or Exoscale—is the right step for your company's compliance posture and infrastructure budget.</p>
<h2>Checklist: preparing for a cloud switch in 2027</h2>
<p>Because the commercial barriers drop to zero on 12 January 2027, late 2026 and early 2027 are practical windows to review your cloud infrastructure. However, the Data Act only requires providers to give you "functional equivalence" for basic IaaS (like virtual machines and block storage). For PaaS and managed services, providers only have to export your raw data and specify open interfaces—they do not have to rebuild your architecture on the new cloud.</p>
<p>Use this checklist before triggering a formal switch:</p>
<ul>
<li><input disabled type="checkbox" /> <strong>Audit commitment end dates:</strong> Check your billing console for active Reserved Instances, Savings Plans, Committed Use Discounts (CUDs), or multi-year enterprise discount agreements. Align your migration window with their expiration to avoid early termination fees.</li>
<li><input disabled type="checkbox" /> <strong>Separate portable services from proprietary lock-in:</strong> Identify which workloads run on open standards (Linux VMs, Docker/Kubernetes, PostgreSQL, MySQL, Redis, S3-compatible object storage) and which rely on proprietary services (such as AWS DynamoDB, Google BigQuery, or Azure Cosmos DB) that require application code changes before moving.</li>
<li><input disabled type="checkbox" /> <strong>Measure your total data volume:</strong> Calculate the exact size of your databases, persistent disks, and object storage buckets. Check how long a full initial sync and checksum verification will take over your available network bandwidth so you know if the standard 30-day transition window is sufficient.</li>
<li><input disabled type="checkbox" /> <strong>Read your provider's Data Act switching addendum:</strong> Locate the specific support ticket workflow your current provider requires to waive egress fees under Article 29. Do not start transferring large datasets before receiving written confirmation that your switching window is active.</li>
<li><input disabled type="checkbox" /> <strong>Plan for parallel run and rollback:</strong> Budget for running your old and new environments side-by-side during the cutover, and keep reverse replication active for at least a few weeks after switching DNS so you have a safe rollback option.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Are all cloud egress fees banned in the EU starting 12 January 2027?</h3>
<p>No. Only egress fees and administrative charges incurred as part of switching to another provider (or moving to on-premises infrastructure) are banned under Article 29(1). Standard outbound internet traffic to your end users, cross-AZ traffic, and inter-region transfers remain billable at your provider's normal rates. Egress for ongoing multi-cloud (in-parallel) use remains billable, though capped at the provider's actual technical cost.</p>
<h3>Does the EU Data Act apply to existing contracts signed before September 2025?</h3>
<p>Yes. The switching rules in Chapter VI of the EU Data Act apply to all contracts for data processing services provided to EU customers, regardless of when the contract was originally signed.</p>
<h3>Can I cancel a 3-year AWS or Azure commitment early without paying a penalty?</h3>
<p>You have the legal right under Article 25 to terminate the contract with a maximum of two months' notice to switch providers. However, the provider is still legally allowed to charge a proportionate early termination penalty to recover discounts granted for the fixed-term commitment.</p>
<h3>Does the EU Data Act apply in the UK, Norway, or Switzerland?</h3>
<p>The EU Data Act applies directly across the 27 EU Member States. For EEA countries (Norway, Iceland, and Liechtenstein), it takes effect once formally incorporated into the EEA Agreement. It does not apply in the United Kingdom or Switzerland, though UK regulators have conducted their own investigations into cloud switching barriers and many providers apply similar switching workflows across their European customer base.</p>
<h2>How MoveInfra can help</h2>
<p>While the EU Data Act removes the egress fee penalty for leaving a hyperscaler, your team still has to rebuild the infrastructure, sync the data, and cut over without losing writes. MoveInfra moves companies from AWS, Google Cloud, Azure, and DigitalOcean to EU-owned clouds like UpCloud, Scaleway, Hetzner, and OVHcloud for a fixed price. We rebuild your environment as clean Terraform code, keep your databases and object storage in live sync during the transition, help update your CI/CD pipelines, and maintain 30 days of reverse replication after the DNS switch so you always have a safe rollback.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 of the European Parliament and of the Council (EU Data Act) – EUR-Lex</a></li>
<li><a href="https://digital-strategy.ec.europa.eu/en/policies/data-act">European Commission – Data Act Explained (Official Policy &amp; FAQ Page)</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 on Digital Operational Resilience for the Financial Sector (DORA) – EUR-Lex</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/eu-data-act-cloud-switching-explained/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Migrating from AWS to UpCloud: what moves, what changes, what it costs]]></title><description><![CDATA[A practical guide to migrating from AWS to UpCloud, covering service mapping, architectural changes, European data sovereignty, and 2026 cost comparis]]></description><link>https://moveinfra.hashnode.dev/migrating-from-aws-to-upcloud-what-moves-what-changes-what-it-costs</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/migrating-from-aws-to-upcloud-what-moves-what-changes-what-it-costs</guid><category><![CDATA[AWS]]></category><category><![CDATA[upcloud]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[eu cloud]]></category><category><![CDATA[Cost Optimization]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Fri, 30 Oct 2026 18:27:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/53787a60-4405-4f08-8b7b-69da4dc225e3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/aws-to-upcloud-migration-guide/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Migrating from AWS to UpCloud is straightforward for companies running standard web architectures built on virtual machines, Kubernetes, relational databases, and S3-compatible object storage. Most core compute, storage, and networking resources map directly between the two platforms, while proprietary AWS services like DynamoDB, SQS, or Lambda require replacing with open-source equivalents or container workloads. Companies making this move typically reduce their monthly cloud spend by eliminating outbound data transfer fees, avoiding Kubernetes control plane charges, and switching to predictable, bundled server pricing.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Direct infrastructure mapping:</strong> EC2, RDS (PostgreSQL and MySQL), ElastiCache, S3, EKS, and Application Load Balancers all have direct managed equivalents on UpCloud.</li>
<li><strong>True European jurisdiction:</strong> UpCloud is headquartered in Helsinki, Finland, operating under EU and Finnish law rather than US extraterritorial jurisdiction.</li>
<li><strong>Predictable cost structure:</strong> UpCloud includes storage and outbound data transfer (under a Fair Transfer Policy) in its server plans, removing two of the most unpredictable items on an AWS bill.</li>
<li><strong>Proprietary services need adjustment:</strong> Workloads relying heavily on AWS Lambda, SQS, or DynamoDB must be refactored to run on containers, self-managed queues, or standard databases before or during the move.</li>
<li><strong>Egress fees for switching are regulated:</strong> Under the EU Data Act, cloud providers can charge no more than their actual cost for switching egress until January 12, 2027, when switching charges are banned altogether.</li>
</ul>
<h2>Why European companies move from AWS to UpCloud</h2>
<p>For most 10-to-300-person European companies, AWS offers far more services than the engineering team actually uses. You pay a premium—both in monthly invoices and in cognitive load—for a catalog of over 200 services when your application only needs compute, a relational database, a Redis-compatible cache, and object storage.</p>
<p>Three practical reasons usually trigger a move to UpCloud:</p>
<ol>
<li><strong>Cost predictability:</strong> AWS bills are composite. A single virtual machine involves separate charges for the EC2 instance, the EBS root volume, provisioned IOPS, public IPv4 addresses, NAT Gateway hourly fees,NAT Gateway data processing fees, and outbound internet traffic. UpCloud bundles CPU, memory, high-speed MaxIOPS block storage, and outbound data transfer into a single flat rate.</li>
<li><strong>Data sovereignty and compliance:</strong> UpCloud Ltd is a Finnish company. While AWS offers EU regions and an AWS European Sovereign Cloud that keeps data and operations inside the EU, Amazon remains a US parent corporation subject to the US CLOUD Act. For teams bound by strict customer contracts or regulations like DORA (Regulation (EU) 2022/2554), moving to an EU-owned provider simplifies compliance and risk assessments.</li>
<li><strong>Right-sized operational complexity:</strong> Managing AWS IAM policies, VPC route tables, and multi-layered security rules takes dedicated specialist time. UpCloud provides a cleaner API, native Terraform and OpenTofu providers, and straightforward private networking without losing production essentials.</li>
</ol>
<h2>Service mapping: what moves directly</h2>
<p>If your stack is built on open standards or Linux primitives, migrating from AWS to UpCloud is mostly an infrastructure-as-code translation exercise.</p>
<table>
<thead>
<tr>
<th align="left">AWS Service</th>
<th align="left">UpCloud Equivalent</th>
<th align="left">Migration Notes</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>EC2</strong></td>
<td align="left">Cloud Servers (Starter, Premium, Cloud Native)</td>
<td align="left">Rebuild via Terraform or Ansible; deploy existing Docker images or binaries.</td>
</tr>
<tr>
<td align="left"><strong>EBS (gp3 / io2)</strong></td>
<td align="left">MaxIOPS Block Storage</td>
<td align="left">Included in server plans or attached as extra volumes; no separate IOPS provisioning needed.</td>
</tr>
<tr>
<td align="left"><strong>RDS (PostgreSQL, MySQL)</strong></td>
<td align="left">Managed Databases (PostgreSQL, MySQL)</td>
<td align="left">Migrate using native logical replication (<code>pglogical</code> or MySQL binlog) for minimal cutover pause.</td>
</tr>
<tr>
<td align="left"><strong>ElastiCache (Redis / Valkey)</strong></td>
<td align="left">Managed Valkey</td>
<td align="left">Valkey is the open-source, drop-in successor to Redis. Standard Redis clients connect without code changes.</td>
</tr>
<tr>
<td align="left"><strong>S3</strong></td>
<td align="left">Managed Object Storage</td>
<td align="left">S3-compatible API. Update endpoint URLs and credentials in your application config; sync data via <code>rclone</code> or AWS CLI.</td>
</tr>
<tr>
<td align="left"><strong>EKS</strong></td>
<td align="left">UpCloud Kubernetes Service (UKS)</td>
<td align="left">CNCF-certified Kubernetes. Manifests and Helm charts move directly; update storage classes and ingress annotations.</td>
</tr>
<tr>
<td align="left"><strong>ALB / NLB</strong></td>
<td align="left">Managed Load Balancer</td>
<td align="left">Supports HTTP/HTTPS and TCP balancing, TLS termination, and health checks.</td>
</tr>
<tr>
<td align="left"><strong>VPC, Subnets, NAT Gateway</strong></td>
<td align="left">SDN Private Networks &amp; NAT Gateway</td>
<td align="left">Private Layer 2/3 networks between servers, databases, and Kubernetes clusters.</td>
</tr>
<tr>
<td align="left"><strong>EFS</strong></td>
<td align="left">File Storage (NFS)</td>
<td align="left">Shared network storage across multiple Cloud Servers.</td>
</tr>
<tr>
<td align="left"><strong>OpenSearch Service</strong></td>
<td align="left">Managed OpenSearch</td>
<td align="left">Direct managed equivalent for search and log analytics.</td>
</tr>
</tbody></table>
<h3>Compute and Block Storage</h3>
<p>On AWS, you choose between dozens of instance families (t3, m6i, c7g) and configure EBS volumes separately. As of 2026, UpCloud organizes its general compute primarily around <strong>Starter</strong> plans (aimed at development, testing, and lighter workloads), <strong>Premium</strong> plans (built on AMD EPYC hardware with bundled MaxIOPS storage for production), and <strong>Cloud Native</strong> plans (designed for Kubernetes and container nodes where you size storage separately). UpCloud also offers dedicated GPU servers for machine learning workloads.</p>
<h3>Managed Databases and Caches</h3>
<p>AWS RDS for PostgreSQL and MySQL map directly to UpCloud Managed Databases. UpCloud handles automated backups, point-in-time recovery, minor version upgrades, and high-availability failover. For caching, AWS ElastiCache users move to UpCloud Managed Valkey. Because Valkey maintains wire-protocol compatibility with Redis, your application libraries (<code>ioredis</code>, <code>redis-py</code>, <code>go-redis</code>) work by simply changing the connection string.</p>
<h3>Kubernetes (EKS to UKS)</h3>
<p>Migrating from Amazon EKS to UpCloud Kubernetes Service (UKS) often removes significant glue code. EKS relies heavily on AWS-specific IAM Roles for Service Accounts (IRSA), the AWS Load Balancer Controller, and the EBS CSI driver. On UKS, the UpCloud Container Storage Interface (CSI) and Cloud Controller Manager are pre-configured, so creating a standard Kubernetes <code>PersistentVolumeClaim</code> or a <code>Service</code> of type <code>LoadBalancer</code> automatically provisions UpCloud block storage or a Managed Load Balancer.</p>
<h2>What changes in your architecture</h2>
<p>Not every part of an AWS account has a 1-to-1 button on UpCloud. When planning your migration, expect to adjust the following areas.</p>
<h3>1. Identity and Access Management (IAM)</h3>
<p>AWS uses IAM not just for human users, but as a service-to-service authentication fabric (for example, allowing an EC2 instance role to write to an S3 bucket without static keys). UpCloud supports sub-accounts, workspace permissions, API tokens, and S3 user access policies, but it does not replicate AWS's cross-service IAM role assumption. </p>
<ul>
<li><strong>What to change:</strong> Use S3 access keys stored in secret managers or Kubernetes Secrets for Object Storage access, and rely on private SDN networks and firewall rules to restrict database and cache traffic to authorized compute nodes.</li>
</ul>
<h3>2. Queues, Emails, and Serverless Functions</h3>
<p>UpCloud focuses on core infrastructure (IaaS) and essential managed platforms (PaaS) rather than application-layer microservices. It does not offer native equivalents to AWS SQS, SNS, SES, or Lambda.</p>
<ul>
<li><strong>Serverless functions (Lambda):</strong> Most teams package their Node.js, Python, or Go functions as lightweight HTTP containers and deploy them onto their UKS cluster or a small Cloud Server, triggering them via standard cron jobs or webhooks.</li>
<li><strong>Message queues (SQS/SNS):</strong> If you use queues for background jobs, you can move the queue workload onto your UpCloud Managed Valkey instance (using BullMQ, Sidekiq, or Celery) or run RabbitMQ / NATS on your Kubernetes cluster.</li>
<li><strong>Transactional email (SES):</strong> Point your application to a dedicated European email provider (such as Scaleway Transactional Email or Mailjet) via standard SMTP or REST API.</li>
</ul>
<h3>3. Proprietary Databases and Warehouses</h3>
<p>Workloads tied to Amazon DynamoDB, Aurora Serverless features, or Amazon Redshift cannot be lifted and shifted without code changes. If DynamoDB is used simply as a key-value store or session cache, it can often be replaced with PostgreSQL (using <code>JSONB</code> columns) or Valkey. If your entire application data model is built around single-table DynamoDB designs, you will need a dedicated refactoring project before moving.</p>
<h3>4. DNS and CDN</h3>
<p>UpCloud does not operate an authoritative DNS service equivalent to Route 53, though it is rolling out its own Content Delivery Network. Most engineering teams keep DNS on an independent provider (like Cloudflare or DNSimple) or another European provider. Keeping DNS independent of your compute provider is good operational practice anyway, as it makes traffic switching and multi-cloud rollbacks much easier.</p>
<h2>What it costs: AWS vs. UpCloud in 2026</h2>
<p>Cloud pricing changes frequently, so you should always verify current numbers on the official AWS and UpCloud pricing pages. However, comparing the pricing structures as of 2026 highlights why bills look so different on the two platforms.</p>
<h3>Compute and Storage Pricing</h3>
<p>On AWS (eu-central-1, Frankfurt), a standard production general-purpose instance like an <code>m6i.xlarge</code> (4 vCPUs, 16 GB RAM) costs approximately $180 to $190 per month on-demand, before adding EBS storage (roughly $0.09/GB-month for <code>gp3</code>) and public IPv4 fees (approximately $3.65/month per IP).</p>
<p>On UpCloud, as of 2026, compute is priced in flat tiers with storage included:</p>
<ul>
<li><strong>Starter plans</strong> (for dev/test and lighter workloads) start at approximately €3/month (1 vCPU, 1 GB RAM, 10 GB storage) and run up to €28/month for 4 vCPUs, 16 GB RAM, and 50 GB storage.</li>
<li><strong>Premium plans</strong> (AMD EPYC production hardware with MaxIOPS storage) start at approximately €5/month. A production server with 4 CPU cores, 8 GB RAM, and 100 GB of MaxIOPS storage costs approximately €52/month, while 4 CPU cores, 16 GB RAM, and 150 GB of storage is approximately €92/month (excluding VAT).</li>
</ul>
<h3>The Hidden Multipliers: Egress and Control Planes</h3>
<p>Where European companies usually see the biggest savings is not raw CPU cost, but the elimination of AWS overhead fees:</p>
<ul>
<li><strong>Data egress (outbound traffic):</strong> AWS charges roughly $0.09 per GB for data transferred out to the internet after the first 100 GB, plus cross-AZ transfer fees ($0.01/GB in each direction) when instances talk to databases or load balancers in different Availability Zones. UpCloud includes zero-cost egress across its plans under a generous Fair Transfer Policy, and private SDN traffic between your servers within a data center is free.</li>
<li><strong>Kubernetes control plane:</strong> AWS charges $0.10 per hour (approximately $73/month) per EKS cluster just for the control plane—if you run separate dev, staging, and production clusters, that is over $215/month before booting a single worker node. UpCloud includes the UKS control plane at no additional cost as part of its "UpCloud Essentials" offering; you only pay for the worker nodes, load balancers, and storage you attach.</li>
<li><strong>One-time migration egress fees:</strong> Historically, AWS charged steep data transfer fees when copying terabytes of S3 data and database snapshots out to another provider. Under Article 29 of the <strong>EU Data Act (Regulation (EU) 2023/2854)</strong>, cloud providers may charge no more than their actual incurred cost for data egress when a customer is switching providers until January 12, 2027. Starting January 12, 2027, switching charges—including data egress fees for switching—are completely banned across the EU.</li>
</ul>
<h2>Pre-migration checklist: how to execute the move</h2>
<p>A disciplined migration avoids "big bang" rewrites. Build the new environment alongside the old one, synchronize the data, and switch traffic only when both environments match.</p>
<ol>
<li><strong>Audit your AWS bill and state:</strong> Export your last three AWS bills and your Terraform state. Flag any proprietary services (SQS, Lambda, SES) and decide how you will replace them before touching production.</li>
<li><strong>Choose your UpCloud region:</strong> Select a European data center close to your users—such as Frankfurt (<code>de-fra1</code>), Amsterdam (<code>nl-ams1</code>), Helsinki (<code>fi-hel1</code> / <code>fi-hel2</code>), Madrid (<code>es-mad1</code>), Warsaw (<code>pl-waw1</code>), Stockholm (<code>se-sto1</code>), Copenhagen, or Oslo.</li>
<li><strong>Rebuild infrastructure as code:</strong> Write new Terraform or OpenTofu configurations using the official <code>UpCloudLtd/upcloud</code> provider to provision SDN private networks, firewall rules, UKS clusters or Cloud Servers, and Managed Databases.</li>
<li><strong>Update CI/CD pipelines:</strong> Duplicate your GitHub Actions or GitLab CI deployment jobs so your team can deploy the exact same application build to both AWS and UpCloud simultaneously.</li>
<li><strong>Sync Object Storage:</strong> Use <code>rclone</code> or S3 migration tooling to copy objects from AWS S3 to UpCloud Managed Object Storage. Run periodic delta syncs with checksum verification to capture newly uploaded files.</li>
<li><strong>Set up live database replication:</strong> Configure logical replication from AWS RDS to UpCloud Managed Databases. This allows your UpCloud database to stay within seconds of your live AWS production database without taking your app offline.</li>
<li><strong>Lower DNS TTLs:</strong> At least 48 hours before cutover, reduce the Time-To-Live (TTL) on your DNS records to 60 seconds.</li>
<li><strong>Cut over with a short write pause:</strong> During a low-traffic window, put the AWS application into maintenance (read-only) mode, verify that database replication lag is zero, run a final object storage delta sync, promote the UpCloud database to primary, and update your DNS records to point to your UpCloud Load Balancer.</li>
<li><strong>Keep a rollback window:</strong> Do not delete your AWS environment on day one. Keep reverse replication or snapshots running for two to four weeks until your team is confident in the new setup, then decommission the AWS resources.</li>
</ol>
<h2>Frequently asked questions</h2>
<h3>Does UpCloud support multi-AZ deployments like AWS?</h3>
<p>UpCloud approaches availability differently than AWS. Instead of splitting every city into three separate Availability Zones and charging for cross-AZ traffic, UpCloud builds high redundancy directly into each data center (including triple-replicated MaxIOPS storage over InfiniBand and redundant networking) backed by a 99.99% uptime SLA. For Managed Databases and Managed Load Balancers, you can select multi-node High Availability plans that automatically handle node failures. For disaster recovery across physical locations, you can replicate across UpCloud's multiple European data centers.</p>
<h3>Do we need to rewrite our applications to move from S3 to UpCloud Object Storage?</h3>
<p>No. UpCloud Managed Object Storage is S3-compatible. You keep using the official AWS SDKs (<code>@aws-sdk/client-s3</code>, <code>boto3</code>, etc.) in your application code. You only need to change the <code>endpoint</code> configuration parameter to point to your UpCloud Object Storage URL and update your access key and secret key.</p>
<h3>How long does a typical AWS to UpCloud migration take?</h3>
<p>For a company with 10 to 300 employees running a standard web stack (VMs or Kubernetes, PostgreSQL/MySQL, Redis, and S3), the end-to-end process typically takes between two and four weeks. Most of that calendar time is spent testing the staging environment, updating CI/CD pipelines, and letting large initial data transfers complete in the background. The actual production cutover pause usually takes between 5 and 30 minutes.</p>
<h3>What happens to our AWS Reserved Instances or Savings Plans?</h3>
<p>If you have active 1-year or 3-year AWS Savings Plans or Reserved Instances, you remain financially committed to those hourly payments until the term expires (though some standard EC2 Reserved Instances can be listed on the AWS RI Marketplace). Before migrating, check the expiration dates in AWS Cost Explorer. Even with an active commitment, some companies move part of their workload early to eliminate high AWS NAT Gateway and data egress charges.</p>
<h2>How MoveInfra can help</h2>
<p>MoveInfra moves European companies from AWS to UpCloud—our default EU cloud target—for a fixed price. We analyze your AWS bill and read-only cloud metadata, rebuild your environment on UpCloud as clean Terraform code, and synchronize your RDS databases and S3 buckets in the background via logical replication and checksummed clones. Your team points your existing CI/CD pipelines to the new environment, and we execute the DNS switch when replication lag is under five seconds, keeping reverse replication active for 30 days so you always have a safe rollback.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://upcloud.com/pricing/">UpCloud Pricing and Server Plans</a></li>
<li><a href="https://upcloud.com/docs/">UpCloud Documentation: Managed Databases, Kubernetes, and Object Storage</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (Digital Operational Resilience Act - DORA) on EUR-Lex</a></li>
<li><a href="https://aws.amazon.com/ec2/pricing/on-demand/">Amazon EC2 On-Demand Pricing</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/aws-to-upcloud-migration-guide/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Moving from AWS to Hetzner: What You Gain and What You Must Build]]></title><description><![CDATA[Moving from AWS to Hetzner cuts compute and bandwidth costs under EU jurisdiction, but your team must manage databases, Kubernetes, and queues.]]></description><link>https://moveinfra.hashnode.dev/moving-from-aws-to-hetzner-what-you-gain-and-what-you-must-build</link><guid isPermaLink="true">https://moveinfra.hashnode.dev/moving-from-aws-to-hetzner-what-you-gain-and-what-you-must-build</guid><category><![CDATA[AWS]]></category><category><![CDATA[Hetzner]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[european cloud]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[MoveInfra]]></dc:creator><pubDate>Thu, 29 Oct 2026 10:06:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/gql/6ae312db986097eaa8a575c6/012c9f2c-96c1-4c1e-8292-3ef86411e2e2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally published on <a href="https://moveinfra.eu/blog/aws-to-hetzner-what-to-know/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>.</em></p>
<p>Moving from AWS to Hetzner gives European companies much lower compute and network costs, predictable monthly billing, and strict German legal jurisdiction, while requiring engineering teams to self-manage services that AWS runs for them. Hetzner provides core infrastructure building blocks—including virtual servers, dedicated bare-metal machines, block volumes, S3-compatible object storage, private networks, firewalls, and load balancers—at a fraction of hyperscaler prices. However, Hetzner does not offer managed relational databases (like AWS RDS), managed Kubernetes (like Amazon EKS), managed caching (like ElastiCache), or serverless queues and functions. If your architecture relies on these services, migrating to Hetzner means deploying and operating them yourself on virtual or dedicated servers, or choosing another European provider that offers managed platform services.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Substantial cost reductions on compute and egress:</strong> Hetzner bundles generous outbound data transfer (typically 20 TB per server in European locations) and charges a single flat rate for compute, removing the complex per-gigabyte NAT gateway and egress fees common on AWS.</li>
<li><strong>True European jurisdiction:</strong> Hetzner Online GmbH is headquartered in Germany and operates data centers in Nuremberg and Falkenstein (Germany) and Helsinki (Finland), keeping your infrastructure outside the reach of US extraterritorial laws.</li>
<li><strong>No managed databases or Kubernetes:</strong> Unlike AWS, Hetzner focuses strictly on Infrastructure as a Service (IaaS). You must run PostgreSQL, MySQL, Redis, and Kubernetes on your own cloud or dedicated instances using open-source tools and automation.</li>
<li><strong>Simpler networking and permissions:</strong> You trade AWS's sprawling IAM policies and multi-layered VPC billing for straightforward cloud firewalls, private networks, and project-based API tokens.</li>
<li><strong>Regulatory tailwinds for switching:</strong> Under the EU Data Act (Regulation (EU) 2023/2854), cloud providers can charge no more than their direct cost for switching egress until January 12, 2027, after which switching fees are banned completely.</li>
</ul>
<h2>Why European companies move from AWS to Hetzner</h2>
<p>For most 10-to-300-person companies in Europe, the initial push to evaluate Hetzner comes from looking at the monthly AWS bill. On AWS, compute is rarely the only major expense. Costs accumulate through managed service premiums, per-gigabyte charges for traffic passing through NAT gateways, cross-availability-zone data transfer fees, and outbound internet egress. </p>
<p>Hetzner structures its pricing around flat, predictable resource usage. Whether you rent shared-CPU virtual machines, dedicated-CPU cloud instances, or physical bare-metal servers through Hetzner Robot, the monthly ceiling is clear. In European regions, cloud servers include 20 TB of outbound traffic per month at no additional charge, and internal traffic over Hetzner Private Networks is free. You should always check Hetzner's official pricing page for current figures, especially following their June 2026 price adjustments on dedicated hardware, as exact numbers depend on server generation and location.</p>
<p>The second driver is legal and operational sovereignty. Even if you deploy workloads in the AWS Frankfurt (<code>eu-central-1</code>) region or use the AWS European Sovereign Cloud, the underlying provider remains Amazon, a US corporation subject to the US CLOUD Act. Hetzner Online GmbH is a privately owned German company founded in 1997. When you host in its German or Finnish data centers, both the physical hardware and the corporate parent fall strictly under EU and national law. For companies subject to strict GDPR interpretations by enterprise customers, or financial entities building exit strategies under the Digital Operational Resilience Act (DORA, Regulation (EU) 2022/2554), moving to a domestic European provider simplifies compliance audits.</p>
<p>Finally, there is engineering clarity. AWS offers over two hundred services, which often leads small engineering teams to build overly complex architectures. Moving to Hetzner forces a return to standard Linux servers, containers, and open-source software that can run anywhere.</p>
<h2>AWS to Hetzner service mapping</h2>
<p>Before planning a migration, both technical leads and finance teams need an honest view of how AWS components translate to Hetzner. Some services map directly, while others shift operational responsibility back to your team.</p>
<table>
<thead>
<tr>
<th align="left">AWS Service</th>
<th align="left">Hetzner Equivalent</th>
<th align="left">What Changes in Practice</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>EC2 (Virtual Servers)</strong></td>
<td align="left">Hetzner Cloud VMs / Dedicated Servers</td>
<td align="left">Direct replacement. Available in shared x86, Arm64 (Ampere), dedicated vCPU, and bare-metal options.</td>
</tr>
<tr>
<td align="left"><strong>EBS (Block Storage)</strong></td>
<td align="left">Hetzner Cloud Volumes</td>
<td align="left">Network-attached block storage expandable up to 10 TB per volume. Attached directly to Cloud VMs.</td>
</tr>
<tr>
<td align="left"><strong>S3 (Object Storage)</strong></td>
<td align="left">Hetzner Object Storage</td>
<td align="left">Native S3-compatible object storage. Supports standard S3 API calls, buckets, and access keys, though advanced AWS-specific features (like S3 Select or Glacier) are not present.</td>
</tr>
<tr>
<td align="left"><strong>ALB / NLB (Load Balancers)</strong></td>
<td align="left">Hetzner Cloud Load Balancers</td>
<td align="left">Managed Layer 4 (TCP) and Layer 7 (HTTP/HTTPS) load balancers with automated Let's Encrypt TLS certificates and health checks.</td>
</tr>
<tr>
<td align="left"><strong>VPC &amp; Security Groups</strong></td>
<td align="left">Private Networks &amp; Cloud Firewalls</td>
<td align="left">Simpler flat private routing across servers and stateful firewall rules applied via server labels or direct assignment.</td>
</tr>
<tr>
<td align="left"><strong>Route 53 (DNS)</strong></td>
<td align="left">Hetzner DNS Console</td>
<td align="left">Supports standard DNS zone management via UI and API, without complex geo-proximity or latency-based routing policies.</td>
</tr>
<tr>
<td align="left"><strong>RDS / Aurora (PostgreSQL, MySQL)</strong></td>
<td align="left"><strong>None (Self-managed on VMs)</strong></td>
<td align="left">You must install, configure, replicate, and back up databases on Hetzner servers yourself.</td>
</tr>
<tr>
<td align="left"><strong>EKS / ECS (Containers)</strong></td>
<td align="left"><strong>None (Self-managed on VMs)</strong></td>
<td align="left">You must bootstrap and maintain your own Kubernetes cluster (e.g., via k3s, Talos, or kubeadm) on Hetzner VMs.</td>
</tr>
<tr>
<td align="left"><strong>ElastiCache (Redis)</strong></td>
<td align="left"><strong>None (Self-managed on VMs)</strong></td>
<td align="left">Requires running Redis or Valkey directly on virtual machines with Sentinel or cluster configuration for high availability.</td>
</tr>
<tr>
<td align="left"><strong>SQS / SNS / EventBridge</strong></td>
<td align="left"><strong>None (Self-managed on VMs)</strong></td>
<td align="left">Requires deploying RabbitMQ, NATS, Redis streams, or database-backed job queues on your own compute instances.</td>
</tr>
<tr>
<td align="left"><strong>AWS IAM</strong></td>
<td align="left">Project Access &amp; API Tokens</td>
<td align="left">Hetzner uses team roles at the project level and read/write API tokens rather than granular per-resource policy documents.</td>
</tr>
</tbody></table>
<h2>What you must build and operate yourself</h2>
<p>The financial savings on Hetzner are real, but they are not free money. A portion of what you stop paying Amazon is traded for engineering ownership. Here is what your team must be prepared to build and maintain.</p>
<h3>1. Relational databases and high availability</h3>
<p>On AWS RDS, enabling Multi-AZ high availability, automated point-in-time recovery (PITR), and minor version upgrades takes a few clicks. Because Hetzner does not offer managed databases, you must build this resilience on top of Hetzner Cloud VMs or dedicated servers.</p>
<p>In a production environment, you should not simply run a single <code>apt install postgresql</code> instance without safeguards. To match RDS reliability, teams typically deploy a two- or three-node cluster managed by open-source orchestrators like <strong>Patroni</strong> (with etcd or Consul for consensus), or use automated provisioning stacks. You must also configure continuous Write-Ahead Log (WAL) archiving and daily base backups using tools like <strong>pgBackRest</strong> or <strong>WAL-G</strong>, pushing encrypted backups to Hetzner Object Storage (or an external backup destination). Crucially, you must test restoring these backups regularly.</p>
<h3>2. Kubernetes or container orchestration</h3>
<p>If you run microservices on Amazon EKS or AWS Fargate, moving to Hetzner means taking over the Kubernetes control plane. While EKS manages the API servers and <code>etcd</code> nodes for you, on Hetzner you will run both control-plane nodes and worker nodes on your own virtual machines.</p>
<p>Fortunately, the open-source ecosystem around Hetzner is mature. Many European teams run lightweight distributions like <strong>k3s</strong> or immutable Kubernetes operating systems like <strong>Talos Linux</strong> on Hetzner Cloud. Hetzner maintains official open-source integrations that make Kubernetes behave like a native cloud environment:</p>
<ul>
<li><strong>Hetzner Cloud Controller Manager (HCCM):</strong> Automatically provisions Hetzner Load Balancers when you create a Kubernetes <code>Service</code> of type <code>LoadBalancer</code> and configures private network routing between nodes.</li>
<li><strong>Container Storage Interface (CSI) Driver:</strong> Automatically creates, attaches, and resizes Hetzner Cloud Volumes when your pods request <code>PersistentVolumeClaims</code>.</li>
<li><strong>Cluster Autoscaler:</strong> Adds or removes Hetzner worker VMs based on pending pod resource requests.</li>
</ul>
<p>Even with these drivers, your team remains responsible for upgrading Kubernetes versions, rotating certificates, and monitoring <code>etcd</code> health.</p>
<h3>3. Caching, queues, and background jobs</h3>
<p>Many AWS architectures rely heavily on SQS for decoupling services, Lambda for cron jobs and webhooks, and ElastiCache for session storage. When moving to Hetzner, architectural simplification helps a great deal.</p>
<p>Instead of replacing every AWS primitive with a separate distributed system, evaluate whether your existing stack can absorb the workload. For example, if you run PostgreSQL, tools like <code>pg-boss</code> (Node.js), <code>Oban</code> (Elixir), or <code>Solid Queue</code> (Ruby) let you run reliable background jobs directly inside your database, removing the need for a separate SQS replacement. If you need high-throughput message brokering or caching, you will need to provision dedicated VMs running <strong>Valkey</strong>, <strong>Redis</strong>, or <strong>RabbitMQ</strong> via Terraform and Ansible, wired into your monitoring stack.</p>
<h3>4. Observability, logging, and alerting</h3>
<p>Without AWS CloudWatch collecting logs and metrics by default, you need a self-hosted or third-party observability stack. On Hetzner, teams normally deploy the <strong>Prometheus</strong> and <strong>Grafana</strong> stack (alongside <code>node_exporter</code> and <code>Loki</code> for logs) on a dedicated monitoring VM, or ship telemetry to a European-hosted observability service. You will also need to configure alert routing (via Alertmanager or similar) to wake up your on-call engineers if a disk fills up or a database node fails over.</p>
<h3>5. Access control and secret management</h3>
<p>AWS IAM lets you restrict a specific server to reading a single S3 bucket or writing to one DynamoDB table. Hetzner's Cloud API uses bearer tokens that grant access to an entire project. This means you must be careful about where you place Hetzner API keys (such as inside your Kubernetes cluster for the CSI driver). For application secrets that previously lived in AWS Secrets Manager or SSM Parameter Store, you will need to adopt encrypted secrets in Git (using <strong>SOPS</strong> or <strong>Sealed Secrets</strong>), use your CI/CD platform's secret injection, or host a vault service like <strong>HashiCorp Vault</strong> or <strong>OpenBao</strong>.</p>
<h2>When Hetzner is the right choice (and when to pick another EU cloud)</h2>
<p>Hetzner is an exceptional fit if:</p>
<ul>
<li>Your team has at least one engineer comfortable with Linux administration, Terraform, and Docker or Kubernetes.</li>
<li>You run compute-heavy, memory-heavy, or bandwidth-heavy workloads where AWS costs scale poorly.</li>
<li>Your architecture is relatively clean—such as a monolithic web application or a sensible set of containerized services backed by PostgreSQL, Redis, and S3 object storage.</li>
</ul>
<p>However, if your company has no dedicated DevOps or platform engineering capacity, and leadership does not want engineers spending time maintaining database replication or Kubernetes upgrades, Hetzner may require too much operational overhead. In that case, you do not have to stay on AWS. Other European cloud providers—such as <strong>UpCloud</strong>, <strong>Scaleway</strong>, or <strong>OVHcloud</strong>—offer managed PostgreSQL/MySQL databases and managed Kubernetes control planes out of the box. You will pay more per CPU core on those platforms than on Hetzner, but still generally less than on AWS, while keeping managed database convenience under European jurisdiction.</p>
<h2>Practical migration checklist: AWS to Hetzner</h2>
<p>If you decide to move to Hetzner, follow a structured process to keep downtime to a minimum and preserve a clean rollback path.</p>
<ol>
<li><strong>Audit your AWS footprint and egress:</strong> List every active resource across your AWS regions. Identify hidden dependencies like Lambda functions triggered by S3 events, hard-coded IAM role assumptions (<code>sts:AssumeRole</code>), and proprietary databases like DynamoDB. Note that under Article 29 of the EU Data Act, you can request switching terms from AWS where data egress fees are capped at direct cost until January 12, 2027, and eliminated thereafter.</li>
<li><strong>Define your Hetzner architecture in Terraform:</strong> Do not click around in the Hetzner Cloud Console to build production. Use the official <code>hcloud</code> Terraform provider to define your private networks, firewalls, load balancers, and compute nodes. Set up automated configuration management (such as Ansible or cloud-init) to bootstrap your database clusters and container hosts.</li>
<li><strong>Clone object storage with checksums:</strong> Create your buckets in Hetzner Object Storage. Use an S3 synchronization tool like <code>rclone</code> to copy objects from AWS S3 to Hetzner, verifying file integrity with checksums. Keep periodic syncs running until cutover day.</li>
<li><strong>Establish live database replication:</strong> Rather than taking a multi-hour downtime window to dump and restore your database, set up logical replication from AWS RDS to your new PostgreSQL or MySQL cluster on Hetzner. Connect the two environments over an encrypted VPN tunnel (such as WireGuard) so your Hetzner database stays within seconds of your live AWS database.</li>
<li><strong>Update your CI/CD pipelines:</strong> Adjust your GitHub Actions or GitLab CI workflows to deploy your application containers to the new Hetzner environment in parallel with AWS. Run end-to-end tests against the Hetzner staging endpoints.</li>
<li><strong>Lower DNS TTLs and execute the switch:</strong> A few days before migration, lower your DNS Time-To-Live (TTL) values to 60 seconds. During a planned low-traffic window, put your application into a brief maintenance/read-only mode, verify that database replication lag is zero, run a final S3 sync, promote the Hetzner database to primary, and update your DNS records to point to the Hetzner Load Balancer.</li>
<li><strong>Maintain a rollback option before cleanup:</strong> Keep your old AWS environment running and configure reverse replication from Hetzner back to AWS if possible, or maintain snapshots for at least 30 days. Once everything runs smoothly through a full monthly billing cycle, decommission your AWS resources.</li>
</ol>
<h2>Frequently asked questions</h2>
<h3>Does Hetzner have an equivalent to AWS S3?</h3>
<p>Yes. Hetzner offers native, S3-compatible Object Storage. You can interact with it using the standard AWS CLI, SDKs, or Terraform providers by changing the endpoint URL to Hetzner's regional object storage endpoint. It supports standard bucket operations, access keys, and public/private visibility, though it does not include AWS-specific extensions like S3 Glacier archival tiers or EventBridge notifications.</p>
<h3>How do we handle high-availability databases on Hetzner without RDS?</h3>
<p>Because Hetzner does not sell a managed database service, high availability is achieved by provisioning multiple Hetzner Cloud VMs across different physical availability zones or data center locations, attached to local NVMe disks or Cloud Volumes. You then run an automated failover manager like Patroni for PostgreSQL, combined with automated backup tools (such as pgBackRest) that stream backups continuously to S3-compatible object storage.</p>
<h3>Can we mix Hetzner Cloud VMs and Dedicated Servers in the same network?</h3>
<p>Yes. Through the Hetzner vSwitch feature, you can connect dedicated bare-metal servers from Hetzner Robot directly into your Hetzner Cloud Private Networks. This allows teams to run stateless web applications on flexible Cloud VMs while placing heavy, predictable database workloads on high-performance bare-metal NVMe servers over private internal IPs.</p>
<h3>Will we have to pay huge AWS data egress fees when moving our data to Hetzner?</h3>
<p>Data egress fees are shrinking due to European regulation. Under Article 29 of the EU Data Act (Regulation (EU) 2023/2854), cloud providers operating in the EU may only charge the direct cost incurred for switching data egress until January 12, 2027, and from January 12, 2027 onward, all switching charges—including data egress fees when moving to another provider—are banned. Furthermore, AWS offers a specific fee waiver program for customers permanently migrating off the platform under the Data Act framework.</p>
<h2>How MoveInfra can help</h2>
<p>If you want Hetzner's low monthly costs and German jurisdiction without spending weeks building database clusters, Kubernetes control planes, and migration scripts from scratch, MoveInfra handles the transition for a fixed price. We analyze your current AWS footprint, rebuild your infrastructure on Hetzner as clean Terraform code—setting up production-ready databases and Kubernetes directly on Hetzner servers—and synchronize your live data via logical replication and checksummed object storage clones. After we help point your CI/CD pipelines to the new environment and switch DNS during a brief planned write pause, we maintain reverse replication for 30 days so you have a safe rollback path before shutting down AWS.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://eur-lex.europa.eu/eli/reg/2023/2854/oj">Regulation (EU) 2023/2854 (EU Data Act) on EUR-Lex</a></li>
<li><a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">Regulation (EU) 2022/2554 (DORA) on EUR-Lex</a></li>
<li><a href="https://docs.hetzner.com/">Hetzner Official Documentation (Hetzner Docs)</a></li>
<li><a href="https://www.hetzner.com/cloud">Hetzner Cloud Product and Pricing Overview</a></li>
<li><a href="https://docs.hetzner.cloud/">Hetzner Cloud API Reference</a></li>
</ul>
<hr />
<p><em>Drafted with AI assistance and fact-checked by the MoveInfra team. The original, kept up to date, is at <a href="https://moveinfra.eu/blog/aws-to-hetzner-what-to-know/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu</a>. Free tools for pricing a move to an EU cloud: <a href="https://moveinfra.eu/tools/?utm_source=hashnode&amp;utm_medium=syndication">moveinfra.eu/tools</a>.</em></p>
]]></content:encoded></item></channel></rss>