Skip to main content
POST
Create an AWS EC2 cluster

Authorizations

ankra_session
string
cookie
required

Browser session. Mutations also require X-Ankra-CSRF.

Headers

X-Ankra-CSRF
string
required

Must match the ankra_csrf browser cookie.

Body

application/json

POST /clusters/aws body. Nodes never receive a public IP; the bastion holds the elastic IP and is the SSH hop (and the NAT instance in bastion_nat mode).

name
string
required
credential_id
string<uuid>
required

An organisation aws credential: a keys credential, or a role onboarded with scope provisioning or self_managed (cost-scoped roles are refused).

ssh_key_credential_id
string<uuid>
required
region
string
required

Region slug, validated against ec2:DescribeRegions.

vpc_id
string
required
node_subnet_ids
string[]
required

Private subnets the nodes spread across; one or more, their zones become the cluster's zone pool.

Minimum array length: 1
bastion_subnet_id
string
required

A public subnet (internet-gateway default route) for the bastion.

bastion_allowed_ips
string[]
required

IPv4 CIDRs allowed to SSH to the bastion; 0.0.0.0/0 and ::/0 are refused.

Minimum array length: 1
description
string | null
egress_mode
enum<string> | null

Omitted: resolved by preflight. existing keeps the subnets' NAT routing; bastion_nat makes the bastion the NAT instance behind one Ankra-owned route table and is refused when a node subnet carries instances Ankra did not create.

Available options:
existing,
bastion_nat
bastion_instance_type
string
default:t3.small
control_plane_count
integer
default:1

At least 3 when the node subnets span more than one availability zone.

Required range: 1 <= x <= 9
control_plane_type
string
default:t3.medium
worker_count
integer
default:1
Required range: 0 <= x <= 100
worker_type
string
default:t3.medium
node_groups
object[] | null
distribution
enum<string>
default:kubeadm
Available options:
k3s,
kubeadm
kubernetes_version
string | null
etcd_topology
enum<string>
default:stacked
Available options:
stacked,
external
etcd_node_count
integer
default:3
etcd_type
string
default:t3.medium
cni
enum<string>
default:cilium

Defaults to cilium for both distributions: the AWS stack's IMDS guard is a network policy only Cilium and Calico enforce. flannel is accepted with a preflight warning; kubeadm requires cilium.

Available options:
flannel,
calico,
cilium
cni_features
object
k3s_disabled_components
string[] | null
ubuntu_series
string
default:24.04
architecture
enum<string>
default:amd64

arm64 is refused with a 422 naming the pending image-catalogue audit (ADR 0015 §6).

Available options:
amd64
root_volume_gib
integer
default:40

Encrypted gp3 root volume of every instance.

Required range: 20 <= x <= 2000
gitops_credential_name
string
gitops_repository
string
gitops_branch
string
default:master
include_networking
boolean
default:true
include_dns
boolean
default:true
retention_policy
enum<string>
default:retain
Available options:
delete,
retain
external_cloud_provider
boolean
default:true

Must be true when present: the AWS cloud-controller-manager is mandatory.

environment
string | null
criticality
string | null

Response

Successful response

cluster_id
string<uuid>
required
name
string
required
kind
string
required
Allowed value: "aws"
state
string
required
operation_id
string<uuid> | null
required