Provision the ARM Ampere¶
The VM.Standard.A1.Flex shape (Ampere ARM64) is where most of the work
happens in an OCI free-tier lab. You get 4 OCPU and 24 GB RAM to
distribute across up to 4 instances however you like — this guide uses
one instance with everything (4 OCPU / 24 GB) as the workhorse.
Capacity constraints¶
ARM Ampere capacity is the single hardest thing about the OCI free tier. Oracle over-subscribes the capacity because free-tier users are sticky, so in popular regions you'll often see:
when you try to provision. Coping strategies, in order of desirability:
- Try during off-peak hours. North American evenings and early European mornings are often clearer than mid-day.
- Try repeatedly. A rejected request doesn't consume anything — you can hit "Create" every few minutes. There are unofficial scripts that automate this (search GitHub for "oci-arm-host-capacity") — use at your own risk and mind Oracle's terms of service.
- Pick a less popular region. If you set your home region and it's perpetually full, switching regions requires a new account.
- Split the allocation. Sometimes a
4 OCPU / 24 GBrequest fails but2 OCPU / 12 GBsucceeds. Provision two instances at half size instead of one at full.
Once you do get an ARM instance, don't terminate it lightly — you might not get it back easily.
Provision¶
Compute → Instances → Create instance.
| Field | Value |
|---|---|
| Name | arm-1 (or workhorse, or whatever) |
| Compartment | root |
| Placement — Availability Domain | Pick one and stick with it. If it fails on AD-1, try AD-2 or AD-3. |
| Image | Change image → Canonical Ubuntu → Ubuntu 24.04 Minimal — make sure the architecture pill says aarch64 |
| Shape | Change shape → Virtual machine → Ampere tab → VM.Standard.A1.Flex |
| OCPU | 4 (the max always-free allocation) |
| Memory (GB) | 24 (the max always-free allocation) |
| Primary VNIC | Same VCN, same public subnet |
| Assign a public IPv4 address | ✓ Yes |
| Boot volume size | 47 GB or more (up to your remaining block-volume budget). ARM Ubuntu is fine at 47 GB; bump to 100 GB if you plan to run containers or a database. |
| SSH keys | Paste the same ~/.ssh/oci_lab.pub you used for the AMD |
Click Create.
When it fails¶
If provisioning fails with "Out of host capacity", don't despair:
- Wait 5-10 minutes and click Create again with the same settings. Oracle's capacity is spot-market-ish for Always-Free.
- Try different ADs if your region has multiple.
- If it consistently fails, try requesting 2 OCPU / 12 GB instead of 4/24 — capacity is fractional, and a smaller ask often succeeds.
Some users report months of no capacity in us-ashburn-1. Others get it
in 30 seconds. It varies wildly.
Verify¶
Once running:
Sanity checks:
First commands¶
Same first-time setup as the AMD instances:
sudo apt update && sudo apt upgrade -y
sudo hostnamectl set-hostname arm-1
sudo timedatectl set-timezone America/New_York
sudo reboot
Then SSH back in.
ARM caveats¶
Most Ubuntu packages have ARM builds. A few things to know:
- Docker images: many are multi-arch, some aren't. If a
docker pullfails withno matching manifest for linux/arm64/v8, that image is x86-only. Look for an alternative or alinux/arm64build. - Binary tools: if you
curl | bashan installer, verify it detects ARM. Most modern tools (gh CLI, kubectl, Caddy, etc.) do this correctly. - Emulation:
qemu-user-staticlets you run x86 binaries in a pinch (apt install qemu-user-static+ register with binfmt). Slow but works.
None of these matter for the specific pattern this guide teaches (Caddy + systemd + static or Go/Node services) — all of that runs natively on ARM.
Boot volume expansion (later, if needed)¶
You can grow the boot volume online without rebooting:
# In the OCI console: Instance → Boot volume → Resize (specify new size)
# Then in the instance:
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1
Verify with df -h. This is one of OCI's genuinely nice quality-of-life
features.
Next¶
Head to SSH and first hardening to lock down all three instances properly before you start exposing services.