- Introduksjon
- Hvordan funker Terraform
- Provider (vi bruker AWS)
- State-fil (eller lagre annet sted)
- Resources
- Varibler og referanser
- Moduler
- Bruk
- Input
- Output
- Provisioners
Her skal vi sette opp Terraform for å bruke den med AWS.
Gå inn i AWS-konsollet, og generer en "Access Key" på brukeren din. Gå inn i Identity and Access Management (IAM), finn brukeren din under "Users", velg Security Credentials, og "Create Access Key". Last ned fila, så du er sikker på å ikke miste keyene.
Hvis du bruker din egen konto, lag en bruker under "Users" først, og gi brukeren nødvendig tilganger (man kan godt bruke full admin i workshoppen).
Neste steg er å sette opp miljøvariabler med Access Key-en, slik at Terraform
kan logge seg på AWS. Dette gjøres ved å sette AWS_ACCESS_KEY_ID
og
AWS_SECRET_ACCESS_KEY
. Dette kan enten gjøres ved å legge det inn i
.bashrc
, eller ved å kjøre export-kommandoene i shellet du bruker.
export AWS_ACCESS_KEY_ID="<din access key>"
export AWS_SECRET_ACCESS_KEY="<din secret key>"
Det første man må gjøre er å definere opp en provider for AWS.. Her kan man sette opp hvilken region man vil ha som default.
Vi begynner med å lage en VPC i Terraform.
Bruk 10.0.0.0/16
som cidr_block
, og tag med ditt eget navn som Name
, så
blir det lettere å vite hvem som eier hvilken VPC. Vi har en limit på 5 VPC-er
per region, så velg en region i USA eller Frankfurt (hvis du ikke bruker din
egen konto).
For å sjekke hvilke endringer Terraform har tenkt til å gjøre, kjør terraform plan
. Hvis alt ser riktig
ut, bruk terraform apply
for å utfør endringene.
Instansene må også ha mulighet til å koble seg til internett. For å få tilgang til internett trenger vi en Internet Gateway. Sett opp en slike gateway.
Ved å refere til
VPC-en definert
tidligere, kan man hente ut ID-en, og bruke den når man definerer opp
subnettene. Id-en kan hentes ut med synaksen ${aws_vpc.navn.id}
. Se
Interpolation
for mer informasjon.
Nå skal vi sette opp to subnet i
VPC-en vår. Husk å
sette map_public_ip_on_launch
til true, så maskinene i subnettet får public
IP. Vi kommer bare til å kjøre to subnet i denne workshoppen, og ikke fire som
har gjort tidligere. La vært subnet være i hver sin availability_zone
. La et
subnet bruke cidr_block
10.0.1.0/24
og det andre bruke 10.0.2.0/24
.
Pass også på å legge på en tag på subnettene, så du vet hvilke som er dine.
For at maskiner på subnettet skal kunne koble seg til internett trenger man å
lage en route
table, og så
assosiere tabellen med
subnettet.
Så man skal route 0.0.0.0/0
til internet gatewayen. Sett gateway_id
i en
route
til ID-en til Internet Gateway-en du lagde i forrige oppgave.
Nå skal vi sette opp to webservere og en lastbalanserer til å serve innholdet ut på internet. Istedenfor å kjøre opp serverene manuelt, så lager vi en autoscalinggroup for serverene. Prøve å lag all infrastrukturen i denne oppgaven inn i en Terraform modul, ved å sende inn all informasjonen du trenger via inputs til modulen.
For at lastbalanserer skal være tilgjengelig på nett, trenger den en Security
Group med
åpning inn (ingress
) på port 80
med TCP mot alle IP-adress (0.0.0.0/0
).
Husk at du i Terraform også må legge til en regel med full åpning ut fra
lastbalansereren også (egress
). Husk å spesifisere VPC-ID på den nye Security
Group-en, siden SG-er er tilordnet en VPC.
# Åpent ut mot alt
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
Vi begynner med å lage en
lastbalanserer for
webapplikasjonen. Lastbalansereren skal lytt på port 80
, og kjøre helsesjekk
mot applikasjonen på port 80
på URL-en /healthcheck.txt
. Applikasjonen
kjører også på port 80
. Man må også definere hvilke subnet som
lastbalansereren skal være koblet på. Bruk variabelreferanser til de subnettene
vi definerte i den tidligere oppgaven. Lister defineres slik i Terraform:
["${modul.navn.variabel}", "${modul.navn.variabel}"]
. Huske å definer opp en
listener
- og en health_check
-blokk.
Husk å spesifisere security_groups
når du oppretter lastbalansereren.
Legg til adressen (DNS-navnet) til lastbalansereren som en
output både fra
modulen, og fra hovedoppskriften. Når du kjører terraform apply
skal du få ut URL-en til lastbalanseren helt til slutt.
Prøv å gå på URL-en i browseren. Siden vi ikke har noen app som kjører skal du få en helt blank side, som returnerer 503 Service Unavailable.
Siden vi har lyst til å logge inn på serverene for å sjekke at alt kom riktig
opp, må vi lage et Key
Pair først.
Terraform støtter ikke å generere et nøkkelpar, så vi kan bruke kommandoen
ssh-keygen -f terraform-workshop
. Innholdet i terraform-workshop.pub
skal da
legges inn i feltet public_key
i terraform-fila vår. Man kan enten kopiere
innholdet manuelt, eller bruke
file()
-funksjonen
Et tips kan være å kjøre ssh-add terraform-workshop
for å slippe å
spesifisere nøkkel når du skal prøve å logge deg inn på serverene senere.
Vi må også sette opp en Security
Group for å
kontrollere hvilke porter som er tilgjengelig. Maskinene vi skal sette opp
trenger port 22
(så vi kan bruke SSH inn) tilgjengelig fra overalt
(0.0.0.0/0
), og port 80
(så lastbalansereren får tilgang til webappen)
tilgjengelig for lastbalansereren. Webappen skal kun være tilgjengelig for
lastbalanseren, og ikke hele verden. Man kan bruke en security group som
source, istedenfor en IP-adresse i AWS. Tips er derfor å bruke
source_security_group_id
som er en variabel fra lastbalansereren, for å angi tilgang fra
lastbalansereren uten å måtte oppgi IP.
Husk å spesifisere VPC-ID på den nye Security Group-en, siden SG-er er tilordnet en VPC.
An autoscaling group (AG) trenger en Launch
Configuration
for å kunne vite hva slags type instancer som skal startes. image_id
finner
man ved å logge inn på AWS-konsollet, og begynne å starte en EC2 instans i
regionen man bruker. Hver region har sine egne AMI-ider.
Hvis man legger til et script i user_data
, så blir dette kjørt når instansen
kommer opp. Les inn innholdet fra startup.sh
ved hjelp av
file()
-funksjonen, og putt det inn i user_data
-feltet.
Det kan også være en god ide å sette
create_bebfore_destroy
til true
, siden man ikke kan endre Launch Configuration. Da vil Terraform
lage en ny LC, oppdatere AG, og så lette den gamle LC igjen helt til slutt. På
den måten så får man ikke feil når man endrer Launch Configuration.
NB! Ikke glem å legg til keypair og Security group.
Helt til slutt skal vi lage en auto-scaling
group
som skal kjøre opp maskinene våre. Vi skal ha to instanser basert på launch
configuration fra forrige oppgave, fordelt på de to subnettene fra tidligere
(via vpc_zone_identifier
). Husk også å spesifisere hvilken load_balancer
som maskinene skal meldes inn i.
Når du kjører terraform apply
så auto-scaling groupen blir laget, så skal du
AWS Console se at det starter opp to maskiner, og du vil etterhvert få opp en
side i browseren hvis du går inn på URL-en til lastbalansereren.
Prøv gjerne også å logge deg inn på serverene via SSH. IP-adressene finner du i AWS Console.
Antagelig ikke helt. Fjern alt du har laget:
terraform destroy