Skip to content

Terraform Provider (Beta)

The GPCORE Terraform provider lets you manage your infrastructure as code using Terraform. You can declare projects, nodes, SSH keys, and other resources in configuration files and have Terraform provision and update them automatically. This is particularly useful for teams that want repeatable, version-controlled infrastructure setups. The provider is currently in beta — the core functionality is working, but some features may change and edge cases may still surface.

You can find our Terraform provider on Github or directly on the Terraform registry here.

Beta

Please keep in mind our Terraform provider is currently in beta. We are working hard to make it stable and provide a great experience for our users. If you find any bugs or have any suggestions, please let us know by creating an issue on our Github page.

Documentation

You can find our full Terraform provider documentation here.

Usage Example

terraform {
  required_providers {
    gpcore = {
      source = "G-PORTAL/gpcore"
      version = "0.2.2"
    }
  }
}

# How many nodes should be created
variable "node_count" {
  default = "1"
}

# Define credentials for the API, please contact sales
# to get your credentials.
provider "gpcore" {
  client_id     = "<example-client-id>"
  client_secret = "<example-client-secret>"
  username      = "<example-user-email>"
  password      = "<example-user-password>"
}

# Create a new project
# If you like to use an existing project, please use the
# the following command "terraform import gpcore_project.project <id>"
resource "gpcore_project" "project" {
  name = "example-project"
  description = "my example project"
  environment = "PROJECT_ENVIRONMENT_DEVELOPMENT"
}

# Create a new SSH public key
resource "gpcore_sshkey" "sshkey" {
  name = "my-public-key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9S52MGGlI+JyJ+2szNXJA70j9C1O1vuICAW5RZRdLrss1H7dCsItQiUbopvrsN8GkRE9WMbcu4moUfm+wsXmc4cBbNQu5xQKzBYbYLraBwn6Ptaww5lSpUTUxLKYCy+64YPooLb4leiboZSkHj/fA9maeONU6bT7WZXA7itqCD5QvwuGEO+E5zgzEDQATg5Tp2eq2RDM3AvgZVdE5STR6xMwXpD0FGK62AvSahCzSmeuDhwV5Csb8/ESBdrfBgL+IeAiU+CBlYTmofHFfSSmn0/jfc4uz7dVTmwBkKDAJD59Fb8SI+v8S7q+MXY6przQxZdo86s9srpNDRE53BbOYuH7aHK3PvnaMJTxjP3b3tFVtv/Rr89Bblm5/k5yGaBLGDb0OyAGtMn4yAn+vxhaMd5HEdKmGGiBoSL7GA3BT7b/5Q5tKF72pKkY+dzuiywbEyn0uKUV7mfpqZWwVcxxDeStCgi3ov0Vs3c/Eq2mF5bq3SJv5sWP/UMf8CLCh3NYD68tuTKhzz1nGYvw0ppO/GGsbtOjKipHwX+d3/BvgGfQq8e1sZ0ttdUsXFoMEu0a7rLwLeTmM6I/UHivDDt5PiBZeGXw3IoNr7h3Y1pzZySkjE63bpqeSdFOnW8rpUbeWAwcgfrHX4+kCewQsjIuuZjuYBObhP8A7xPakB/oekQ=="
}

# Define the datacenter.
data "gpcore_datacenter" "fra01" {
  short = "fra01"
}

# Define the flavour and image.
data "gpcore_flavour" "e2288g" {
  name = "xeon.e2288g.128"
  project_id = gpcore_project.project.id
  datacenter_id = data.gpcore_datacenter.fra01.id
}

# Define which image you want to use.
data "gpcore_image" "ubuntu" {
  name = "Ubuntu 20.04 LTS"
  flavour_id = data.gpcore_flavour.e2288g.id
}

# Create the nodes
resource "gpcore_node" "node" {
  count          = var.node_count
  project_id     = gpcore_project.project.id
  fqdn           = "tf-instance-${count.index + 1}"
  image_id       = data.gpcore_image.ubuntu.id
  ssh_key_ids    = [gpcore_sshkey.sshkey.id]
  flavour_id     = data.gpcore_flavour.e2288g.id
  datacenter_id  = data.gpcore_datacenter.fra01.id
  billing_period = "BILLING_PERIOD_MONTHLY"
  tags = {
    "key" = "value"
  }
}