Tavoitteena luoda kuvan mukainen suljettu verkko (Virtual Private Cloud, VPC), johon on kytketty kuormantasaaja (ELB) ulkoa tulevan liikenteen ohjaukseen ja jos pääsee internetiin vain NAT-koneen kautta.
Kuvasta näkee, että aliverkko 10.0.1.0/24 on yksityinen verkko, josta ei pääse ulos kuin NAT-koneen kautta. Verkko 10.0.2.0/24 puolestaan on julkinen verkko, jonne sijoitetaan ELB, internet gateway ja NAT-kone. On syytä huomata (jotain mitä en itse heti tajunnut), että ELB:llä on kaksoisrooli internetissä sekä VPC:ssä: ELB näkyy internetiin julkisella IP:llä ja VPC:n sisällä puolestaan VPC:n IP:llä. ELB:n pitää olla VPC:ssä, josta pääsee IGW:n kautta ulos tai ELB ei toimi. Koska NAT-koneelle on annettu julkinen Elastic IP, sekin näkyy ulos suoraan internetiin.
Tekstikuvaus ei johda ihan suoraviivaisesti kuvan tilanteeseen, joten kannattaa lukea huolella, jos jotain kohtaa ajattelee hyödyntää.
Huomaathan, että tämän tekstin ohjeiden kokeilu maksaa! Itselleni kokeilu kustansi $0,93, koska käytin kahta small-instanssia 4 tunnin ajan.
VPC-verkon luominen yhdellä aliverkolla
Luodaan VPC 10.0.0.0/16 CIDR-lohkolla (Classless Inter-Domain Routing).
$ ec2-create-vpc 10.0.0.0/16
VPC vpc-1cb6db75 pending 10.0.0.0/16 dopt-10b6db79 default
Luodaan aliverkko 10.0.1.0/24. Aliverkossa on 256 IP-osoitetta, joista Amazon varaa 4 ensimmäistä ja viimeisen eli käytettäväksi jää 251 IP-osoitetta.
$ ec2-create-subnet --vpc vpc-1cb6db75 -i 10.0.1.0/24SUBNET subnet-f3b1dc9a pending vpc-1cb6db75 10.0.1.0/24 251 eu-west-1c
Aliverkko luotiin Amazonin valitsemaan saatavuusalueeseen (Availability Zone, AZ) eu-west-1c.
Internet-yhdyskäytävän luominen VPC:lle
VPC:ssä olevilla koneilla ei ole pääsyä internetiin ilman, että niille on luotu internet-yhdyskäytävä (Internet gateway, IGW). Luodaan VPC:lle yhdyskäytävä ja liitetään se VPC:hen.
$ ec2-create-internet-gateway
INTERNETGATEWAY igw-ef86eb86 $ ec2-attach-internet-gateway igw-ef86eb86 --vpc vpc-1cb6db75 ATTACHMENT vpc-1cb6db75 attaching
AWS on luonut automaattisesti reititystaulun. Katsotaan taulun tiedot.
$ ec2-describe-route-tables ROUTETABLE rtb-1eb6db77 vpc-1cb6db75 ROUTE local active 10.0.0.0/16 ASSOCIATION rtbassoc-11b6db78 main
Lisätään IGW reititystauluun.
$ ec2-create-route rtb-1eb6db77 -r 0.0.0.0/0 --gateway igw-ef86eb86 ROUTE igw-ef86eb86 0.0.0.0/0
EC2-instanssin luominen aliverkkoon
Luodaan aluksi pääsyoikeusryhmä, jolla sallitaan pääsy VPC:ssä oleviin koneisiin. Huomaa, että pääsyoikeusryhmä on VPC-kohtainen. Määritetään samalla SSH-portti (22) ja HTTP-portti (80) aukinaisiksi tässä ryhmässä.
$ ec2-add-group vpc_public_access -d "VPC access from public Internet" -vpc vpc-1cb6db75 $ ec2-authorize sg-06acb16a -P tcp -p 22 -s 0.0.0.0/0 GROUP sg-06acb16a PERMISSION ALLOWS tcp 22 22 FROM CIDR 0.0.0.0/0 ingress $ ec2-authorize sg-06acb16a -P tcp -p 80 -s 0.0.0.0/0 GROUP sg-06acb16a PERMISSION ALLOWS tcp 80 80 FROM CIDR 0.0.0.0/0 ingress
Luodaan aliverkkoon 32-bittinen Ubuntu 10.04-palvelin (AMI löytyy täältä: http://uec-images.ubuntu.com/releases/lucid/release/), jolla pyörii Apache. Käytetään palvelimen luonnissa aiemmin tehtyä (http://pedanttinen.blogspot.com/2011/12/amazon-web-services-ilmainen-kokeilu_29.html) testkeypair-avainta. Annetaan palvelimelle aliverkon ensimmäinen vapaa osoite.
$ ec2-run-instances ami-c00e3cb4 --instance-count 1 --instance-type m1.small --key testkeypair --group sg-06acb16a --subnet subnet-f3b1dc9a --private-ip-address 10.0.1.4 RESERVATION r-3eb35377 093338577702 INSTANCE i-8cb527c5 ami-c00e3cb4 pending testkeypair 0 m1.small 2011-12-30T08:54:45+0000 eu-west-1c aki-4deec439 monitoring-disabled 10.0.1.4vpc-1cb6db75 subnet-f3b1dc9a ebs paravirtual xen sg-06acb16a default
Kuten yltä nähdään, luotu instanssi on tyyppiä small. Small-tyyppinen palvelin maksaa Euroopassa $0,095 tunnilta. Small-tyyppinen palvelin on 32-bittinen ja siksi myös käyttöjärjestelmäksi valittiin 32-bittinen versio.
Tässä vaiheessa luodulle koneelle ei pääse mistään käsiksi. Sille pitää siis antaa hetkeksi julkinen IP-osoite eli VPC Elastic IP -osoite. Huomaa, että myös VPC Elastic IP on maksullinen, mikäli sitä ei ole sidottu mihinkään ajossa olevaan instanssiin ($0.01 tunnilta, jos IP ei ole käytössä kokonaisen tunnin aikana)!
$ ec2-allocate-address -d vpc ADDRESS 176.34.130.141 vpc eipalloc-d186ebb8 $ ec2-associate-address --allocation-id eipalloc-d186ebb8 --instance i-8cb527c5 ADDRESS i-8cb527c5 eipalloc-d186ebb8 eipassoc-b486ebdd
Nyt voidaan tehdä yhteyskokeilu palvelimelle SSH:lla.
$ ssh -i ~/aws/certs/testkeypair_private.key ubuntu@176.34.130.141Jos kaikki meni putkeen, luotu instanssi vastaa huuteluihin.
Apachen virittäminen instanssille
Kirjaudu sisään instanssille em. komennolla. Jostain syystä nimipalvelu antaa 10-verkon osoitteita Ubuntun päivityspalvelimen osoitteeksi:
$ nslookup eu-west-1.ec2.archive.ubuntu.com Server: 217.30.180.230 Address: 217.30.180.230#53 Non-authoritative answer: Name: eu-west-1.ec2.archive.ubuntu.com Address: 10.228.171.176 Name: eu-west-1.ec2.archive.ubuntu.com Address: 10.226.230.15 $ nslookup archive.ubuntu.com Server: 217.30.180.230 Address: 217.30.180.230#53 Non-authoritative answer: Name: archive.ubuntu.com Address: 91.189.92.183 ...
Tämän takia tehdään "pieni" säätö instanssin hosts-tiedostoon, että päästään sujuvasti eteenpäin. Lisää alla oleva rivi.
91.189.92.183 eu-west-1.ec2.archive.ubuntu.com
Aja seuraavat komennot.
$ sudo apt-get update $ sudo apt-get install apache2
Nyt Apachen pitäisi vastata osoitteesta http://176.34.130.141/.
Kuormantasaajan luominen
Luodaan kuormantasaaja (ELB), jonka kautta pitäisi Apachen tarjoilemat sivut näkyviin.
elb-create-lb vpc-lb --subnets subnet-f3b1dc9a --groups sg-06acb16a --listener "protocol=HTTP, lb-port=80, instance-port=80" elb-create-lb: Service error: InvalidSubnetID.NotFound AWSRequestId:690642d8-32db-11e1-a58c-ab42d741c3e0
Jostain syystä yllä oleva komento epäonnistuu, mutta täsmälleen sama onnistuu AWS Management Consolen kautta ilman ongelmia. Luodaan kuormantasaaja em. parametrein AWS Management Consolesta (ohjeita täällä: http://docs.amazonwebservices.com/ElasticLoadBalancing/2011-11-15/DeveloperGuide/USVPC_creating_basic_lb.html). Hassua kyllä, netistä ei löytynyt mitään tietoa miksi komentoriviltä homma ei luonnistu.
Kuormantasaajan käynnistymisessä saattaa mennä jonkin aikaa. Joskus instanssit eivät näy heti ELB:llä ja ELB vain sanoo "instance registration is still in progress". Kun kuormantasaaja toimii, näkyy Apache kuormantasaajan läpi: http://vpc-lb-ui-1608557811.eu-west-1.elb.amazonaws.com/.
Palvelu näkyy kuormantasaajan kautta, vaikka Ubuntu-instanssilta poistaisi julkisen IP:n. Kuormantasaajan kautta voi siis päästä käsiksi VPC:n sisälle, vaikka sinne ei muutoin olisi julkista pääsyä.
Ulospäin menevän liikenteen ohjaus NAT:n kautta
Luodaan ensiksi Amazonin tarjoaman VPC NAT AMI:n pohjalta uusi instanssi.
$ ec2-run-instances ami-095b6c7d --instance-count 1 --instance-type m1.small --key testkeypair --group sg-06acb16a --subnet subnet-f3b1dc9a --private-ip-address 10.0.1.5 RESERVATION r-a69272ef 093338577702 INSTANCE i-3c5dcf75 ami-095b6c7d pending testkeypair 0 m1.small 2011-12-30T12:15:36+0000 eu-west-1c aki-4deec439 monitoring-disabled 10.0.1.5 vpc-1cb6db75 subnet-f3b1dc9a ebs paravirtual xen sg-06acb16a default
Poistetaan SrcDestCheck-attribuutti NAT-instanssilta.
$ ec2-modify-instance-attribute --source-dest-check false i-3c5dcf75 sourceDestCheck i-3c5dcf75 false
Siirretään aiemmin luotu julkinen IP-osoite NAT-instanssille.
$ ec2-describe-addresses ADDRESS 176.34.130.141 i-8cb527c5 vpc eipalloc-d186ebb8 eipassoc-979cf1fe $ ec2-disassociate-address --association-id eipassoc-979cf1fe ADDRESS eipassoc-979cf1fe $ ec2-associate-address --allocation-id eipalloc-d186ebb8 --instance i-3c5dcf75 ADDRESS i-3c5dcf75 eipalloc-d186ebb8 eipassoc-2899f441
Kirjaudutaan sisään NAT-instanssille. SSH valittaa todennäköisesti tässä kohtaa vastapään tunnisteen vaihtuneen. Ongelma ratkeaa .ssh/known_hosts-tiedostoa editoimalla.
ssh -i ~/aws/certs/testkeypair_private.key ec2-user@176.34.130.141
Tämän jälkeen voi kopioida testkeypair_private.key-tiedoston NAT-koneelle ja tehdä seuraavan tempun.
[ec2-user@ip-10-0-1-5 ~]$ ssh -i testkeypair_private.key ubuntu@10.0.1.4
Aliverkon sisällä liikenne toimii siis ok.
NAT-aliverkon luominen
Luodaan uusi aliverkko NAT:lle.
$ ec2-create-subnet --vpc vpc-1cb6db75 -i 10.0.2.0/24 SUBNET subnet-249af74d pending vpc-1cb6db75 10.0.2.0/24 251 eu-west-1c
Poistetaan vanha NAT-kone ja tehdään uusi tilalle uuteen aliverkkoon.
$ ec2-terminate-instances i-3c5dcf75 INSTANCE i-3c5dcf75 running shutting-down $ ec2-run-instances ami-095b6c7d --instance-count 1 --instance-type m1.small --key testkeypair --group sg-06acb16a --subnet subnet-249af74d --private-ip-address 10.0.2.4 RESERVATION r-189c7c51 093338577702 INSTANCE i-3648da7f ami-095b6c7d pending testkeypair 0 m1.small 2011-12-30T13:10:09+0000 eu-west-1c aki-4deec439 monitoring-disabled 10.0.2.4 vpc-1cb6db75 subnet-249af74d ebs paravirtual xen sg-06acb16a default
Poistetaan IGW 1-verkon reititystaulusta.
$ ec2-describe-route-tables ROUTETABLE rtb-1eb6db77 vpc-1cb6db75 ROUTE local active 10.0.0.0/16 ROUTE igw-ef86eb86 active 0.0.0.0/0 ASSOCIATION rtbassoc-11b6db78 main $ ec2-delete-route rtb-1eb6db77 --cidr 0.0.0.0/0 RETURN true
Lisätään NAT-kone 1-verkon reititystauluun.
$ ec2-create-route rtb-1eb6db77 -r 0.0.0.0/0 --instance i-3648da7f ROUTE i-3648da7f 0.0.0.0/0
Luodaan uusi reititystaulu uudelle aliverkolle.
$ ec2-create-route-table vpc-1cb6db75 ROUTETABLE rtb-cd95f8a4 vpc-1cb6db75 ROUTE local active 10.0.0.0/16
Lisätään uuteen reititystauluun aiemmin luotu IGW.
$ ec2-create-route rtb-cd95f8a4 -r 0.0.0.0/0 --gateway igw-ef86eb86 ROUTE igw-ef86eb86 0.0.0.0/0
Liitetään uusi reititystaulu uuteen aliverkkoon.
$ ec2-associate-route-table rtb-cd95f8a4 --subnet subnet-249af74d ASSOCIATION rtbassoc-5f94f936 rtb-cd95f8a4 subnet-249af74d
Asetetaan NAT-koneelle julkinen IP.
$ ec2-associate-address --allocation-id eipalloc-d186ebb8 --instance i-3648da7f ADDRESS i-3648da7f eipalloc-d186ebb8 eipassoc-6894f901
Poistetaan SrcDestCheck-attribuutti NAT-instanssilta.
$ ec2-modify-instance-attribute --source-dest-check false i-3648da7f sourceDestCheck i-3648da7f false
Nyt pitäisi olla mahdollista mennä NAT-koneen kautta julkisella IP:llä NAT-koneelle ja siitä suoraan Ubuntu-koneelle. Tämän jälkeen pitää vielä liikuttaa ELB julkiseen (uuteen) aliverkkoon eli samaan, missä NAT-kone asustaa. Kun tämä on tehty, pitäisi liikenteen kulkea myös kuormantasaajan kautta. Kuten aiemmin, uusi kuormantasaaja luodaan AWS Management Consolen kautta.
Lopuksi poistetaan kaikki käytetyt resurssit
$ ec2-terminate-instances i-8cb527c5 i-3648da7f INSTANCE i-8cb527c5 running shutting-down INSTANCE i-3648da7f running shutting-down $ elb-delete-lb vpc-lb-ui $ ec2-release-address --allocation-id eipalloc-d186ebb8 176.34.130.141 ADDRESS eipalloc-d186ebb8 $ ec2-disassociate-route-table rtbassoc-5f94f936 RETURN true $ ec2-delete-subnet subnet-249af74d SUBNET subnet-249af74d $ ec2-delete-subnet subnet-f3b1dc9a SUBNET subnet-f3b1dc9a $ ec2-delete-route-table rtb-cd95f8a4 RETURN true $ ec2-delete-route rtb-1eb6db77 -cidr 0.0.0.0/0 RETURN true $ ec2-detach-internet-gateway --vpc vpc-1cb6db75 igw-ef86eb86 RETURN true $ ec2-delete-internet-gateway igw-ef86eb86 RETURN true $ ec2-delete-group sg-06acb16a RETURN true $ ec2-delete-group sg-9facb1f3 RETURN true $ ec2-delete-vpc vpc-1cb6db75 VPC vpc-1cb6db75 $ ec2-delete-volume vol-27d0c94e VOLUME vol-27d0c94e $ ec2-delete-volume vol-2bd6cf42 VOLUME vol-2bd6cf42
Ei kommentteja:
Lähetä kommentti