Creating Labs

Infrastructure Options

VM images, machine types, and cloud account configuration for POV Demo labs.

VM Images

Choose an image that matches the technology your lab covers. The image determines what software is pre-installed on the VM when the lab provisions.

Image SlugDescription
hashistack2025HashiCorp tools: Nomad, Consul, Vault, Terraform. Ubuntu 22.04 base.
ubuntu2024Clean Ubuntu 22.04 with standard dev tools. General-purpose.
kubernetes-dev2025Kubernetes cluster node. Includes kubeadm, kubelet, kubectl, and container runtime.
docker2024Docker Engine + Docker Compose. Ubuntu 22.04 base.
awscli2024AWS CLI v2 + standard utilities. Ubuntu 22.04 base.
devtools2024Developer tools: Git, Node.js, Python, Go. Ubuntu 22.04 base.

Machine Types

TypevCPURAMUse case
small24 GBSingle-container tasks, CLI exercises, lightweight services.
medium48 GBMost labs. Kubernetes single-node, medium workloads.
large816 GBMulti-container orchestration, resource-intensive services.
proxmox48 GBDedicated bare-metal hypervisor. For nested virtualization scenarios.
Note: The medium machine type is the right choice for most labs. Only use large when you've verified that the lab actually needs more resources.

Cloud Account Restrictions

Labs run on shared cloud infrastructure. The following restrictions apply to keep costs controlled and prevent interference between learners.

AWS Restrictions

CategoryAllowed
Instance typest3.micro, t3.small, t3.medium, t3.large, t3.xlarge, t3.2xlarge
Storage (per instance)Up to 100 GB gp3 EBS
Regionsus-east-1, us-west-2, eu-west-1
Blocked servicesAmazon SageMaker, Amazon Redshift, Amazon EMR, AWS Batch

GCP Restrictions

CategoryAllowed
Machine typese2-micro through e2-standard-8
Storage (per instance)Up to 100 GB standard persistent disk
Regionsus-east1, us-west1, europe-west1

Azure Restrictions

CategoryAllowed
VM sizesStandard_B1s through Standard_D4s_v3
Storage (per instance)Up to 128 GB standard SSD
Regionseastus, westus2, westeurope

AWS IAM Policies

Labs that need AWS API access attach IAM policies to the lab VMs. There are two ways to specify policies in config.yml.

Option 1: Template policy

Uses a predefined policy template:

virtualmachines:
  - name: "ubuntu-1"
    image: "awscli2024"
    machine_type: "medium"
    environment: "aws"
    iam_policies:
      - template: "ReadOnlyAccess"

Option 2: Inline policy

Define a custom IAM policy document:

virtualmachines:
  - name: "ubuntu-1"
    image: "awscli2024"
    machine_type: "medium"
    environment: "aws"
    iam_policies:
      - inline_policy: |
          {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:ListBucket"
                ],
                "Resource": [
                  "arn:aws:s3:::lab-bucket-${ACCOUNT_ID}",
                  "arn:aws:s3:::lab-bucket-${ACCOUNT_ID}/*"
                ]
              }
            ]
          }
Note: Use ${ACCOUNT_ID} as a placeholder in inline policy ARNs. The platform substitutes the actual account ID at provision time.

GCP Cloud Projects

Add a gcp_projects block to config.yml to provision a temporary GCP project for each lab session.

gcp_projects:
  - count: 1
    apis:
      - "compute.googleapis.com"
      - "iam.googleapis.com"
      - "storage.googleapis.com"
    iam_roles:
      - "roles/editor"
    access_type: "service_account"
    provisioning_strategy: "pool_with_fallback"
FieldTypeDescription
countnumberNumber of GCP projects to provision. Always 1.
apisstring[]GCP service APIs to enable on the project (e.g. "compute.googleapis.com").
iam_rolesstring[]IAM roles granted to the lab's service account (e.g. "roles/editor").
access_typestringHow credentials are exposed. Always "service_account".
provisioning_strategystringHow projects are allocated. Always "pool_with_fallback".
Auto-injected credentials: The GCP project ID and service account credentials are automatically available as environment variables on lab VMs. Terraform's google provider picks them up without any extra configuration.

Azure Subscriptions

Add an azure_subscriptions block to config.yml to provision a temporary Azure subscription for each lab session.

azure_subscriptions:
  - count: 1
    access_type: "service_principal"
    rbac_role: "Contributor"
    provisioning_strategy: "pool_with_fallback"
FieldTypeDescription
countnumberNumber of subscriptions to provision. Always 1.
access_typestringHow credentials are exposed. Always "service_principal".
rbac_rolestringAzure RBAC role assigned to the service principal (e.g. "Contributor").
provisioning_strategystringHow subscriptions are allocated. Always "pool_with_fallback".
Auto-injected credentials: The subscription ID and service principal credentials are automatically available as environment variables on lab VMs. Terraform's azurerm provider picks them up without any extra configuration.