Terraforming din AWS-infrastruktur

At skrive din infrastruktur som om det var kode er et stort skridt fremad fra fortidens dage. I et enkelt trin dokumenterer du hele din stack, mens du orkesterer oprettelsen af ​​sin infrastruktur. En anden, endnu større fordel, er evnen til at styre din infrastruktur. Forestil dig at være i stand til at stå op for en hel produktions- eller anlægsinfrastruktur på mindre end en time, snarere end dage.

I denne artikel vil jeg guide dig igennem processen med at stå op for en temmelig simpel, men almindelig infrastruktur, der hostes på Amazons webservice. Diagrammet nedenfor illustrerer, hvordan infrastrukturen vil se efter, at Terraform config er anvendt.

Terrafrom AWS

terraform

Terraform er et produkt, der udgives af HashiCorp, som abstrakterer væk fra din udbyders API-lag, som AWS i dette tilfælde, så du kan dokumentere hele din infrastruktur i et JSON-lignende sprog, der er let at læse og forstå.

Værktøjet selv går langt ud over Amazon AWS. Der er en række udbydere til rådighed, som for VMWare, DigitalOcean og Heroku for at nævne nogle få.

Kodning af vores infrastruktur

Installer Terraform og Git

  1. Installer Git.
    Debian \ Ubuntu

    sudo apt-get install git

    Redhat \ CentOS

    sudo yum install git

    Windows
    Download Git til Windows.

  2. Download Terraform fra Terraform hjemmeside på https://www.terraform.io/downloads.html
  3. Uddrag det downloadede Terraform-arkiv i et mappesæt i din PATH-miljøvariabel.
    Windows: C: \ Windows \ System32
    Linux: / Usr / bin.

Angiv leverandøren

Vi starter med at definere vores leverandør, som i vores tilfælde er AWS. Du skal indstille nogle værdier, der gør det muligt for Terraform at forbinde og kommunikere med Amazon.

  1. Opret en mappe til at holde dine Terraform-filer.
    mkdir-p ~ / terraform / myapp
  2. Opret en fil med udvidelsen ".tf". I dette eksempel oprettes filnavnet myapp.tf.
  3. Åbn tf filen i en tekst editor.
  4. Tilføj følgende indhold til det. Vi sætter udbyderen til "AWS" for at betegne det er for Amazons webservice. Vi angiver også en adgangstast, hemmelig nøgle, og regionen vi vil bygge infrastrukturen i.
    # Konfigurer AWS Provider-udbyderen "aws" {access_key = "$ {var.aws_access_key}" secret_key = "$ {var.aws_secret_key}" region = "os-øst-1"}
    

Definering af VPC-netværket

  1. Definer en VPC med navnet "myapp" og indstil CIDR-blokken til 10.100.0.0 / 16.
    ressource "aws_vpc" "myapp" {cidr_block = "10.100.0.0 / 16"}
    
  2. Tilføj to undernet til vores offentlige servere. Angiv eksplosionssonen for at sikre, at de to altid er oprettet i separate, da vi vil sikre overflødighed. Fordi de er begge offentlige, skal du sætte map_public_ip_on_launch til true.
    ressource "aws_subnet" "public_1a" {vpc_id = "$ {aws_vpc.myapp.id}" cidr_block = "10.100.0.0 / 24" map_public_ip_on_launch = "true" availability_zone = "os-øst-1a" tags {Name = "Offentlig 1A"} } ressource "aws_subnet" "public_1b" {vpc_id = "$ {aws_vpc.myapp.id}" cidr_block = "10.100.1.0 / 24" map_public_ip_on_launch = "true" availability_zone = "os-øst-1b" tags {Name = "Offentlig 1B" }}
    
  3. For at tillade internetadgang til vores servere skal du tilføje en internetgateway til konfigurationen.
    ressource "aws_internet_gateway" "gw" {vpc_id = "$ {aws_vpc.myapp.id}" tags {Name = "myapp gw"}}
    

Sikkerhedsgrupper

  1. Opret en ny sikkerhedsgruppe, der giver adgang til SSH
    ressource "aws_security_group" "allow_ssh" {name = "allow_all" description = "Tillad indgående SSH-trafik fra min IP" vpc_id = "$ {aws_vpc.myapp.id}" indkomst {from_port = 22 to_port = 22 protokol = "tcp" cidr_blocks = ["123.123.123.123 / 32"]} tags {Name = "Tillad SSH"}}
    
  2. Opret en sikkerhedsgruppe for at tillade webserver adgang til offentligheden.
    ressource "aws_security_group" "web_server" {name = "webserver" description = "Tillad HTTP og HTTPS trafik i, browser adgang ud." vpc_id = "$ {aws_vpc.myapp.id}" indgangsknuder {from_port = 80 to_port = 80 protokol = "tcp" cidr_blocks = [ "0.0.0.0 / 0"]} egress {from_port = 1024 to_port = 65535 protokol = "tcp" cidr_blocks = ["0.0.0.0 / 0"]}}
    
  3. Opret en sikkerhedsgruppe for at tillade MySQL RDS Adgang til webservere.
    ressource "aws_security_group" "myapp_mysql_rds" {name = "webserver" beskrivelse = "Tillad adgang til MySQL RDS" vpc_id = "$ {aws_vpc.myapp.id}" indtrængen {from_port = 3306 to_port = 3306 protokol = "TCP" cidr_blocks = ["$ {aws_instance.web01.private_ip}", "$ {aws_instance.web02.private_ip}"]} udgang {from_port = 1024 to_port = 65535 protokol = "tcp" cidr_blocks = ["0.0.0.0 / 0"]}}
    

Opret EC2 Instances

Når netværksinfrastrukturen er på plads, er det tid til at begynde at definere vores EC2-forekomster.

  1. Opret to forekomster for webtjenesten, med en i hvert offentligt undernet defineret ovenfor. Tilfældene vil begge være t1.micro, og de vil begge køre Ubuntu 14.04 LTS.
    ressource "aws_instance" "web01" {ami = "ami-408c7f28" example_type = "t1.micro" subnet_id = "$ {aws_subnet.public_1a.id}" vpc_security_group_ids = ["$ {aws_security_group.web_server.id}", "$ {aws_security_group.allow_ssh.id} "] KEY_NAME = "mitpgm nøglepar" tags {Name = "web01"}} ressource "aws_instance" "web02"{ami = "ami-408c7f28" instance_type = "t1.micro" subnet_id =" $ {aws_subnet.public_1b.id}" vpc_security_group_ids = [ "$ {aws_security_group.web_server.id}", "$ {aws_security_group.allow_ssh.id}"] KEY_NAME = "mitpgm nøglepar" tags {name = "web02"}}
    

Tilføj ELB til belastningsbalancering

  1. Definer en ELB, der skal tilknyttes de to offentlige undernet, tilføj begge web-EC2-forekomster, og indstil en HTTP-lytter.
    ressource "aws_elb" "web-elb" {name = "web-elb" availability_zones = ["os-øst-1a", "os-øst-1b"] lytter {instance_port = 80 instance_protocol = "http" lb_port = 80 lb_protocol = "http"} health_check {sund_threshold = 2 unhealthy_threshold = 2 timeout = 3 target = "HTTP: 80 /" interval = 30} forekomster = ["$ {aws_instance.web01.id}", "$ {aws_instance.web02.id } "] cross_zone_load_balancing = true idle_timeout = 400 connection_draining = sand connection_draining_timeout = 400 tags {Name =" Web ELB "}}
    

Definer MySQL RDS Instance

  1. Opret DB Subnet Group.
    ressource "aws_db_subnet_group" "myapp-db" {name = "main" description = "Vores hovedgruppe af undernet" subnet_ids = ["$ {aws_subnet.public-1a.id}", "$ {aws_subnet.public-1b.id } "] tags {Name =" MyApp DB subnet gruppe "}}
    
    

  1. Opret RDS Instance.
    ressource "aws_db_instance" "web-rds-01" {identifikator = "myappdb-rds" allocated_storage = 10 engine = "mysql" engine_version = "5.6.17" example_class = "db.t1.micro" name = "myappdb" brugernavn = "foo "password =" bar "vpc_security_group_ids = [" $ {aws_security_group.myapp_mysql_rds.id "] db_subnet_group_name =" $ {aws_db_subnet_group.myapp-db.id} "parameter_group_name =" default.mysql5.6 "}

Version Kontrollér dine filer

Med den grundlæggende infrastruktur defineret, skal den tilføjes til versionskontrol. Ved hjælp af Git skal du initialisere lageret og forpligte ændringerne.

  1. Hvis din tekstfil stadig er åben, skal du gemme den og derefter lukke den.
  2. Initialiser depotet.
    git init.
  3. Tilføj ".tf" til depotet.
    git tilføj myapp.tf
  4. Opret den oprindelige begåelse for din infrastruktur.
    git commit -m "Initial commit"
  5. Vores infrastruktur er nu under versionskontrol og klar til at blive implementeret for første gang!

Administrere din infrastruktur

Implementér din infrastruktur

Kør følgende kommando for at implementere din infrastruktur ved hjælp af Terraform.

terraform gælder

Ødelæg din infrastruktur

Kør følgende kommando for at slette alle ressourcer, der er oprettet af Terraform.

terraform ødelægge

Giv en kommentar

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.