<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tom</title>
    <description>The latest articles on DEV Community by Tom (@toddyholiday).</description>
    <link>https://dev.to/toddyholiday</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4087630%2Fae5695ed-6f93-4de6-ac01-4ff5a4d167ce.png</url>
      <title>DEV Community: Tom</title>
      <link>https://dev.to/toddyholiday</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toddyholiday"/>
    <language>en</language>
    <item>
      <title>EC2-Compatible Compute on Bare Metal</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 21 Aug 2026 06:59:27 +0000</pubDate>
      <link>https://dev.to/toddyholiday/ec2-compatible-compute-on-bare-metal-df8</link>
      <guid>https://dev.to/toddyholiday/ec2-compatible-compute-on-bare-metal-df8</guid>
      <description>&lt;p&gt;"EC2-compatible" has become a somewhat diluted term. Local development tools use it to mean "we mock enough of the API that your code won't crash," and platform vendors use it to mean "we have a concept of virtual machines." What it should mean is that the EC2 API behaves identically to AWS, with the same endpoints, request format, response schema, and error codes, but running on hardware you control. That's what Spinifex implements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the API surface actually covers
&lt;/h2&gt;

&lt;p&gt;Spinifex covers a broad surface, and the depth goes well beyond basic instance management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EC2&lt;/strong&gt; covers instance management including create, start, stop, terminate, and describe; AMIs; security groups; and VPC networking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EBS&lt;/strong&gt; provides volumes, snapshots, and attach/detach operations with the same lifecycle semantics as AWS EBS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3&lt;/strong&gt; handles buckets, objects, and presigned URLs using the same SDK operations and path conventions as AWS S3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC&lt;/strong&gt; covers virtual networking, subnets, route tables, and security group rules so workloads run in isolated network environments without modification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM&lt;/strong&gt; enforces roles, policies, and instance profiles using the same role-based access model you use in AWS, applied at the API level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS&lt;/strong&gt; manages the Kubernetes control plane and node lifecycle with the same API as AWS EKS, including eksctl compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECR&lt;/strong&gt; provides a container registry compatible with the standard Docker and containerd pull flows, so image pipelines don't need changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECS&lt;/strong&gt; handles container scheduling and task management, making it possible to run ECS-based workloads on your own hardware without rewriting task definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS&lt;/strong&gt; exposes a database API compatible with standard AWS RDS tooling and connection strings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ALB and NLB&lt;/strong&gt; provide load balancer management with the same API as AWS Elastic Load Balancing, so Terraform modules that provision load balancers work unchanged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built tooling or automation against any of those AWS APIs, it transfers without modification.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one change your Terraform needs
&lt;/h2&gt;

&lt;p&gt;Redirecting Terraform from AWS to Spinifex is a single provider override, and everything else stays the same, including your resource definitions, modules, variable files, and state management:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;endpoints&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ec2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;iam&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;sts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;eks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;s3&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;ecr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
    &lt;span class="nx"&gt;acm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spinifex_endpoint&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Engineers who know Terraform for AWS already know how to operate a Spinifex deployment. The only new knowledge required is the endpoint address and the initial installation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any Terraform config you run against AWS today can be pointed at bare metal with one provider change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How this differs from local dev mocks
&lt;/h2&gt;

&lt;p&gt;Tools like LocalStack are genuinely valuable for local development, but they're not designed for production workloads and make no guarantees about behavioural parity at the margins, don't perform at scale, and are architected around the assumption that the real workload will eventually run in AWS. The mock is a convenience layer, not a production target.&lt;/p&gt;

&lt;p&gt;Spinifex is the opposite use case. It's designed for environments where AWS isn't the target and where the hardware you're running on is the production environment, permanently. That means actual virtual machine management on real bare metal, actual block storage with real persistence, and actual IAM enforcement across real network boundaries. The API compatibility is a consequence of running the same surface, not an approximation of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When bare metal is the right call
&lt;/h2&gt;

&lt;p&gt;There are three common reasons to run EC2-compatible compute on your own hardware:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost at scale.&lt;/strong&gt; Cloud egress and compute costs compound, and at sufficient scale, particularly for steady-state workloads without large demand spikes, owning the hardware is cheaper, sometimes substantially so. The break-even point is lower than most engineering teams expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sovereignty.&lt;/strong&gt; Regulatory requirements, contractual obligations, or operational security policies may prohibit data leaving infrastructure under your direct control. An EC2-compatible layer means those constraints don't require abandoning your cloud-native toolchain and rebuilding everything from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disconnected environments.&lt;/strong&gt; Tactical edge deployments, remote industrial sites, and secure facilities often have limited or no internet connectivity. Running the same EC2 API surface locally means the deployment and operational model stays consistent regardless of network conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Reference architectures, including a full EKS GPU cluster deployment on a Supermicro X14, are at &lt;a href="https://docs.mulgadc.com" rel="noopener noreferrer"&gt;docs.mulgadc.com&lt;/a&gt;. The source is on &lt;a href="https://github.com/mulgadc/spinifex" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, written in Go and MIT-licensed. Or &lt;a href="https://mulgadc.com/signup" rel="noopener noreferrer"&gt;sign up for our free sandbox&lt;/a&gt; to explore the API before deploying on your own hardware.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
