Aloitus Terraformilla
Tämä opas pystyttää minimaalisen Frostmoln-konfiguraation Terraformilla.
1. Konfiguroi tarjoaja
Luo main.tf:
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:
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:
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:
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 onfrostmoln_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äinenterraform applynäyttää onnistuvan ja cloud-init epäonnistuu sitten jokaisessa asennettavassa paketissa. Katso Gateway. image_idjaflavor_idottavat tunnisteita, eivät näyttönimiä. Flavorin tunniste on sen SKU, jotengp1.smallvoidaan kirjoittaa suoraan — katso tarjolla olevat komennollafm 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_groupsratkaisee, mikä pääsee sisään. Jätä se pois tai aseta se arvoon[], niin instanssi palaa tenantindefault-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 kutenfrostmoln_security_group_rule.sshtekee yllä.ssh_key_namesottaa avainten nimiä.frostmoln_ssh_keytunnistetaan nimellään tenantin sisällä, jotenfrostmoln_ssh_key.laptop.nameon välitettävä arvo. Terraforminfile()ei laajenna~-merkkiä itsestään — kääri polkupathexpand()-funktioon kuten yllä, tai anna absoluuttinen polku.zoneon valinnainen. Jätä se pois, niin alusta valitsee saatavuusvyöhykkeen ja tallentaa sen tilaan. Pidä aliverkko ja instanssi samassa vyöhykkeessä.
3. Sovella
terraform init
terraform plan
terraform applyTerraform 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 = trueresurssiinfrostmoln_gateway.main, aja siitäterraform apply, ja pura vasta sitten — ja palauta rivi vasta kun seuraavan kerran tarvitset sitä, sillä paikalleen unohtunuttrueriisuu 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_onhoitaa 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 omallalifecycle { prevent_destroy = true }-lohkolla.