Skip to content

Aloitus Terraformilla

Tämä opas pystyttää minimaalisen Frostmoln-konfiguraation Terraformilla.

1. Konfiguroi tarjoaja

Luo main.tf:

hcl
terraform {
  required_providers {
    frostmoln = {
      source = "frostmoln/frostmoln"
    }
  }
}

provider "frostmoln" {
  # Tunnukset luetaan tarjoaja-argumenteista tai ympäristömuuttujista.
  # Luo API-avain portaalissa kohdassa Settings -> API Keys.
}

Anna API-avaimesi ympäristön kautta, jotta se pysyy poissa versionhallinnasta:

bash
export FROSTMOLN_API_KEY=fmk_...

Tenantin valinta

Oletuksena tarjoaja hallitsee resursseja tilisi oletustenantissa. Kohdistaaksesi toiseen tenanttiin, aseta tenant_id tarjoajalle — tai ympäristömuuttuja FROSTMOLN_TENANT_ID:

hcl
provider "frostmoln" {
  tenant_id = "00000000-0000-0000-0000-000000000000"
}

Muuhun kuin oletustenanttiin kohdistaminen vaatii fm CLI- / OIDC-istunnon (fm auth login), jonka käyttäjä kuuluu useaan tenanttiin — API-avain on sidottu yhteen tenanttiin. Yksi tenant tarjoajainstanssia kohti; hallitaksesi useampaa kuin yhtä tenanttia samassa konfiguraatiossa, määritä toinen tarjoaja alias-määreellä. Älä osoita tenant_id-arvoa uudelleen tarjoajalle, joka jo hallitsee resursseja — käytä erillistä alias-tarjoajaa (ja terraform state mv), tai Terraform yrittää luoda ne uudelleen uuteen tenanttiin.

2. Määritä resurssit

Pienin konfiguraatio, joka todella antaa sinulle koneen, johon voit kirjautua, on VPC, sille yhdyskäytävä, aliverkko, turvaryhmä, SSH-avain ja itse instanssi. Lisää tämä tiedostoon main.tf:

hcl
resource "frostmoln_vpc" "main" {
  name = "tf-vpc"
  cidr = "10.0.0.0/16"
}

# A VPC is an isolated network until a gateway is declared for it: no outbound
# internet and no platform DNS. Leave this out and the instance below still
# boots, but cloud-init cannot reach anything and name resolution fails.
resource "frostmoln_gateway" "main" {
  vpc_id = frostmoln_vpc.main.id
  mode   = "public_ip"
}

resource "frostmoln_subnet" "main" {
  name   = "tf-subnet"
  vpc_id = frostmoln_vpc.main.id
  cidr   = "10.0.1.0/24"
  zone   = "falkenberg"
}

resource "frostmoln_security_group" "web" {
  name   = "tf-web"
  vpc_id = frostmoln_vpc.main.id
}

resource "frostmoln_security_group_rule" "ssh" {
  security_group_id = frostmoln_security_group.web.id
  direction         = "ingress"
  protocol          = "tcp"
  port_range_min    = 22
  port_range_max    = 22
  remote_cidr       = "203.0.113.4/32" # your own address, not 0.0.0.0/0
  description       = "SSH from the office"
}

resource "frostmoln_ssh_key" "laptop" {
  name       = "my-laptop"
  public_key = file(pathexpand("~/.ssh/id_ed25519.pub"))
}

data "frostmoln_image" "ubuntu" {
  name = "ubuntu-24.04"
}

resource "frostmoln_instance" "web" {
  name      = "tf-web"
  image_id  = data.frostmoln_image.ubuntu.id
  flavor_id = "gp1.small"
  zone      = "falkenberg"
  vpc_id    = frostmoln_vpc.main.id
  subnet_id = frostmoln_subnet.main.id

  security_groups = [frostmoln_security_group.web.id]
  ssh_key_names   = [frostmoln_ssh_key.laptop.name]
}

# An address of its own, so you can reach the instance from outside. The
# depends_on is what makes `terraform destroy` work: a gateway refuses to be
# removed while public IPs in its VPC still point at it, and without this edge
# nothing tells Terraform to release the address before the gateway.
resource "frostmoln_public_ip" "web" {
  instance_id = frostmoln_instance.web.id

  depends_on = [frostmoln_gateway.main]
}

output "web_address" {
  value = frostmoln_public_ip.web.address
}

Muutama asia tuossa konfiguraatiossa kannattaa tietää ennen kuin ajat sen.

  • VPC:llä ei ole tietä ulos internetiin ennen kuin sille on määritelty yhdyskäytävä. frostmoln_vpc-resurssissa ei ole tarkoituksella yhteysargumenttia — Terraformissa yhteysvalinta on frostmoln_gateway -resurssin olemassaolo tai puuttuminen. Ilman yhdyskäytävää VPC on eristetty molempiin suuntiin, ja koska alustan DNS ja yhteys hallittuihin palveluihin kulkevat samaa reittiä, sen instanssit eivät myöskään pysty selvittämään nimiä. Tämä on tavallisin syy siihen, että ensimmäinen terraform apply näyttää onnistuvan ja cloud-init epäonnistuu sitten jokaisessa asennettavassa paketissa. Katso Gateway.
  • image_id ja flavor_id ottavat tunnisteita, eivät näyttönimiä. Flavorin tunniste on sen SKU, joten gp1.small voidaan kirjoittaa suoraan — katso tarjolla olevat komennolla fm compute flavor list, tai lue ne Terraformissa tietolähteillä frostmoln_flavor / frostmoln_flavors. Levykuvat tunnistetaan UUID:llä, joten hae sellainen nimellä frostmoln_image -tietolähteellä kuten yllä.
  • security_groups ratkaisee, mikä pääsee sisään. Jätä se pois tai aseta se arvoon [], niin instanssi palaa tenantin default-ryhmään, joka sallii kaiken lähtevän liikenteen mutta päästää sisään vain saman ryhmän instansseilta tulevan liikenteen — eli ei mitään internetistä, ei edes SSH:ta. Itse luomasi ryhmä alkaa samalla tavalla: lähtevä sallittu, ei yhtään sisääntulosääntöä, joten haluamasi sisääntuleva liikenne on kirjoitettava auki kuten frostmoln_security_group_rule.ssh tekee yllä.
  • ssh_key_names ottaa avainten nimiä. frostmoln_ssh_key tunnistetaan nimellään tenantin sisällä, joten frostmoln_ssh_key.laptop.name on välitettävä arvo. Terraformin file() ei laajenna ~-merkkiä itsestään — kääri polku pathexpand()-funktioon kuten yllä, tai anna absoluuttinen polku.
  • zone on valinnainen. Jätä se pois, niin alusta valitsee saatavuusvyöhykkeen ja tallentaa sen tilaan. Pidä aliverkko ja instanssi samassa vyöhykkeessä.

3. Sovella

bash
terraform init
terraform plan
terraform apply

Terraform seuraa tilaa, joten myöhemmät apply-ajot muuttavat vain sitä, mikä poikkeaa.

4. Pura ympäristö

terraform destroy poistaa resurssit takaisin, kolmen tarkoituksellisen pysäytyksen kera:

  • Yhdyskäytävä kieltäytyy tuhoutumasta, kunnes konfiguraatio kertoo, että yhteyden menetys on tarkoituksellinen. Lisää acknowledge_connectivity_loss = true resurssiin frostmoln_gateway.main, aja siitä terraform apply, ja pura vasta sitten — ja palauta rivi vasta kun seuraavan kerran tarvitset sitä, sillä paikalleen unohtunut true riisuu suojan aseista koko resurssin eliniäksi.
  • Yhdyskäytävä kieltäytyy myös niin kauan kuin sen VPC:n julkiset IP:t riippuvat siitä. Yllä oleva depends_on hoitaa asian tämän konfiguraation ainoan osoitteen osalta, mutta jokainen muu saman VPC:n julkinen IP — kuormantasaajan tai jokin, jota tämä konfiguraatio ei hallitse — on irrotettava ensin. Katso Julkiset IP:t.
  • frostmoln_public_ip-resurssin tuhoaminen vapauttaa osoitteen lopullisesti. Se palaa jaettuun altaaseen ja annetaan seuraavalle pyytäjälle, joten DNS:ssä julkaistu tai jonkun sallittujen listalla oleva osoite kannattaa suojata Terraformin omalla lifecycle { prevent_destroy = true } -lohkolla.

Aiheeseen liittyvät