Skip to content

Deploy an AWS cluster from a custom AMI

When you finish, a three-node Qumulo cluster runs on your own Ubuntu or RHEL image instead of the default Ubuntu 24.04 image.

Before you start

  • An x86_64 AMI with cloud-init, running Ubuntu 24.04 or RHEL 8, 9, or 10, in the region you deploy to
  • A VPC and subnet that meet the AWS network prerequisites
  • AWS credentials with the AWS IAM permissions the provider needs
  • Terraform 1.11 or later

1. Choose the AMI

  • To run the nodes on your image, use its ID as ami_id. The short-lived provisioner instance runs the same image.
  • To run the provisioner on a different image, pick a second AMI for provisioner_ami_id. Changing it later never touches the nodes.
  • For RHEL, use the RHEL 8, 9, or 10 AMI ID for your region. aws ec2 describe-images lists them.
  • For an AMI owned by another account, have the owner grant your account cross-account AMI access first.
  • For an AMI registered in another region, copy it into your region with aws ec2 copy-image and use the copy's ID.

You now have one AMI ID for the nodes, and optionally a second one for the provisioner.

Warning

Changing ami_id on a running cluster replaces every node while the cluster stays in service, and every node IP address changes.

2. Copy the configuration

Save this as main.tf in an empty directory.

terraform {
  required_version = ">= 1.11"
  required_providers {
    qumulo = {
      source  = "qumulo-terraform-registry.s3.us-east-1.amazonaws.com/qumulo/qumulo"
      version = "~> 1.0"
    }
  }
}

provider "qumulo" {
  aws {}
}

resource "qumulo_filesystem_aws" "cluster" {
  cluster_name         = "qumulo"
  deployment_name      = "qumulo"
  region               = "us-east-1"                  # <-- Replace with your region
  subnet_ids           = ["subnet-0123456789abcdef0"] # <-- Replace with your subnet ID
  ami_id               = "ami-0123456789abcdef0"      # <-- Replace with your AMI ID
  node_count           = 3
  instance_type        = "m6idn.2xlarge"
  cluster_product_type = "HOT"
  admin_password       = "YourSecurePassword123!" # <-- Replace with your admin password
  allow_cidrs          = ["10.0.0.0/8"]           # <-- Replace with your client networks
  deletion_protection  = true
}

output "endpoint_ips" {
  value = qumulo_filesystem_aws.cluster.endpoint_ips
}

output "web_ui" {
  value = "https://${qumulo_filesystem_aws.cluster.endpoint_ips[0]}"
}

Replace the five values marked <-- Replace, and leave the rest as written. If you chose a separate provisioner image, add this line to the qumulo_filesystem_aws block.

provisioner_ami_id = "ami-0fedcba9876543210" # <-- Replace with your provisioner AMI ID

3. Apply

terraform init -upgrade
terraform plan
terraform apply

The plan ends with Plan: 1 to add, 0 to change, 0 to destroy. The apply typically runs 60 to 80 minutes and ends with Apply complete! Resources: 1 added, 0 changed, 0 destroyed., followed by the endpoint_ips and web_ui outputs.

4. Check the cluster

Open the web_ui address in a browser on a network inside allow_cidrs, and accept the cluster's self-signed certificate. Sign in as admin with the password you set, and the web UI shows the cluster named qumulo.

Next

Combine your image with multi-AZ, KMS, and a permissions boundary in Deploy a production AWS cluster. The qumulo_filesystem_aws reference lists every attribute, including ami_id and provisioner_ami_id.