Etikettarkiv: amazon

Kör Docker med CoreOS och fleet

Mitt företag Triop AB erbjuder konsulttjänster inom DevOps. Se här: triop.se/devops

Fleet är en av de nyare verktygen som kommer från gänget bakom operativsystemet CoreOS. Fleet är till för att köra din kod på kluster av Dockers som rullar under CoreOS.

fleet ties together systemd and etcd into a distributed init system. Think of it as an extension of systemd that operates at the cluster level instead of the machine level.

Jag tänkte visa när jag startar upp två noder på Amazon EC2 som kör CoreOS och som sedan administreras med hjälp av kommandot fleetctl.

Python-koden för att starta upp nya servrar hittar du längst ner i detta blogginlägg. Det finns några inställningar som du bör göra innan, såsom att nyckelnamnet stämmer och security group har regler som tillåter port 7001, 4001 och 22. Samt EC2 access id och key.

Starta upp klusterchefen

Först och främst startar vi upp en leader. Detta kommuniceras ut via den unika token som återfinnes under discovery i user_data som du bör sätta till ett unikt värde för varje kluster.

$ python ec2-coreos.py
# Starting EC2 server with hostname coreos-roseanne
 - Wait..
 - Wait..
 - Wait..
Found IP: 46.137.21.3

Du kan även kontrollera att det fungerar att ansluta till den nya servern med IP-adress 46.137.21.3:

$ ssh -p 22 [email protected]
CoreOS (alpha)
[email protected] ~ $

Perfekt. Även kan det vara till fördel att se så att etc verkligen lyssnar på tcp port 4001 och 7001 antingen tittar vi via lsof eller testar att ansluta direkt med curl:

$ curl 46.137.21.3:4001
404 page not found
$ curl 46.137.21.3:7001
404 page not found

Och det fungerar bra. Skulle inte etcd starta upp så kan det bero på att din cloudconfig är felaktig (ej unik nyckel) eller så kan du titta på loggen med journalctl -u etc. Även så kan du starta upp etcd med kommandot:

sudo systemctl start etcd.service

Starta upp en arbetsnod

För att vi ska ha någon mer nod i klustret så startar vi upp en till. Precis som ovan så kör vi bara ec2-coreos.py och väntar några sekunder på att vår nya nod ska starta upp:

$ python ec2-coreos.py
# Starting EC2 server with hostname coreos-alia
 - Wait..
 - Wait..
 - Wait..
 - Wait..
Found IP: 54.220.243.180

Om allt gick som det ska så ska denna nya nod automatiskt ansluta till coreos-roseanne som är leader. Du kan även titta på loggen med journalctl -u etcd om något skulle vara fel eller använda den unika discovery URL:en direkt för att lista alla noder i ditt kluster:

curl https://discovery.etcd.io/db7ce1f96d42b24f38b5c96a3018f1ea|python -mjson.tool

CoreOS Fleet

Då var det dags att administrera vår flotta med noder med hjälp av fleetctl. Jag har på min Mac installerat fleetctl från github men det går även bra via homebrew:

$ brew update
$ brew install fleetctl

Om vi har rätt ssh-nycklar är det bara att köra. Du kan installera rätt ssh nyckel via kommandot ssh-add coreos.pem exempelvis.

Vi börjar med att lista alla maskiner:

$ fleetctl --tunnel=46.137.21.3 list-machines
MACHINE IP METADATA
9c62bc5f... 10.73.195.43 -
f9946c83... 10.35.3.231 -

Perfekt. Då är det dags att slänga ut vårat första jobb som ska utföras i klustret. Det är ett simpelt Hello World test som ska exekveras, så vi lägger följande innehåll i filen myapp.service:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker run busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"

Och startar upp:

$ fleetctl --tunnel=46.137.21.3 start myapp.service
Job myapp.service launched on 9c62bc5f.../10.73.195.43

Perfekt. Nu ska jobbet ha startat och vi kan titta med fleetctl journal myapp.service eller list-nodes.

Så här ser det ut med info:

CoreOS Docker FleetOch nu ligger Hello World och kör under Docker på en av noderna vilket fleetctl list-units kan bevittna.

För delning av jobb och leader/follower genomförs av Raft Consensus algortimen.

 ec2-coreos.py

Här återfinnes koden som jag använder för att starta upp nya noder:

#!/usr/bin/env python
## 
## Jonas Lejon 2014
##
## sudo pip install apache-libcloud names

import os, sys, time
import names 
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
import libcloud.security
libcloud.security.CA_CERTS_PATH = ['ca-bundle.crt'] # from Mozilla

EC2_ACCESS_ID     = '' # Paste your Amazon EC2 credentials here
EC2_SECRET_KEY    = ''

userdata = """#cloud-config

coreos:
  etcd:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new
    discovery: https://discovery.etcd.io/unique_token_here
    # multi-region and multi-cloud deployments need to use $public_ipv4
    addr: $public_ipv4:4001
    peer-addr: $public_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
"""

#EC2Driver = get_driver(Provider.EC2)
EC2Driver = get_driver(Provider.EC2_EU_WEST)
conn = EC2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

hostname = "coreos-" + names.get_first_name(gender='female').lower()

print "# Starting EC2 server with hostname",hostname

MY_SIZE = 't1.micro'
#MY_IMAGE = "ami-8f30fff8" # CoreOS beta at eu-west-1
MY_IMAGE = "ami-87a769f0" # CoreOS alpha at eu-west-1

sizes = conn.list_sizes()
images = conn.list_images()

size = [s for s in sizes if s.id == MY_SIZE][0]
image = [i for i in images if i.id == MY_IMAGE][0]

node = conn.create_node(name=hostname, image=image, size=size, ex_keyname="coreos", ex_userdata=userdata, ex_securitygroup="coreos")
nodes = conn.list_nodes()
time.sleep(5)
while nodes[-1].state != 0:
	time.sleep(5)
	print " - Wait.."
	nodes = conn.list_nodes()
print "Found IP:",nodes[-1].public_ips[0]

Optimera Amazon S3 och CloudFront

CC Flickr @ladydragonflyherworld

Jag är en optimeringsnörd, det måste jag erkänna. Jag kan sitta i timmar och optimera små kodsnuttar eller webbsidor tills det att det inte går att göra så mycket mer. Därför brukar jag som bekant använda mig av molntjänster såsom Amazon S3 samt CloudFront för att lagra statisikt innehåll.

För att optimera webbsidor så använder jag bl.a. verktyget Google PageSpeed för att hitta  flaskhalsar och en uppenbar sak som PageSpeed klagade på var att Expire/Cache-headers samt komprimering. Standard så stödjer ej Amazon S3/CloudFront ej komprimering men med hjälp av s3cmd och några extra flaggor så går detta att lösa:

1. Komprimera dina stylesheets och javascript:

$ gzip -9 style.css

2. Ladda upp komprimerade filerna och sätt headers:

$ s3cmd put style.css.gz s3://cloudfront.domän.se/ --mime-type "text/css"  --add-header "Content-Encoding: gzip" --acl-public --add-header "Expires: Sun, 17 Jan 2038, 19:14:07 GMT" --add-header "Cache-Control: max-age=315360000"

Verktyget s3cmd hittas här: http://s3tools.org/s3cmd

Uppdatering: Typo fixad. Tack Emil Stenström.

 

 

DNSSEC ökar säkerheten men även komplexiteten

CC-BY 2.0 Flickr @kylehase

Att en övergång till DNSSEC är något som just nu är något som diskuteras för fullt på bl.a. Internetdagarna 2011 där jag närvarade för några dagar sedan. Att DNSSEC är rätt väg att gå är nog något som ingen ifrågasätter och även så har E-delegationen skrivit om införande av DNSSEC.

Dock så stötte jag problem i helgen då en svensk registrar infört DNSSEC på många av sina .SE-domäner och jag flyttade över till en extern DNS som var Amazon Route 53 i detta fall. Och då blir det problem: för domänen ser då ut att ha DNSSEC men namnservern i detta fall svarar att det inte finns (DS finns men inte DNSKEY) och att stänga av DNSSEC var omöjligt.

Som tur var så kunde jag snabbt flytta över domänen till Frobbit som hjälpte mig.

Läs även mer om DNSSEC hos .SE.

Så vad kan vi lära oss av detta? DNSSEC ökar säkerheten men även komplexiteten och risken för problem ökar då många fel leder till att domänen slutar fungera.

Så här uppenbarade sig mitt problem med SERVFAIL:

dig www.dnssec-failed.org

; <<>> DiG 9.7.2-P2 <<>> www.dnssec-failed.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 17692
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.dnssec-failed.org.        IN    A

;; Query time: 108 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Fri Nov 19 16:08:29 2010
;; MSG SIZE  rcvd: 39</pre>

Så skickar du E-post med Amazon SES

Amazon SES (Simple Email Service) är en relativt ny tjänst från Amazon som ingår i deras sfär med molntjänster även kallat Amazon Web Services (AWS). Tjänsten är till för dig som inte orkar hålla på att konfigurera Sendmail/qmail och hålla koll på köer osv.

Det tar några timmar att komma igång och köra och i mitt fall så valde jag Amazon SES för att skicka ut E-post då någon gör lösenordsåterställning på BloggBackup och Blogbackupr. Kostnaden är $0.10 per 1000 E-brev vilket jag tycker är okej och det finns ingen bindningstid, uppsägningstid osv.

Så här går du till väga för att börja skicka E-post:

1. Skapa ett Amazon AWS-konto samt Amazon SES-behörighet (jag var tvungen att verifiera mig via telefonen då en automatisk röst läser upp en PIN-kod).

2. Ladda hem Amazon SES scripts där ses-verify-email-address.pl ingår. Du måste ange din AWSAccessKeyId samt AWSSecretKey i en fil som perl-scriptet använder sig av. Dessa uppgifter hittar du Account -> Security Credentials. Verifiera sedan din E-post så du kan börja att skicka från den (Amazon mailar en länk som du måste klicka på).

3. Konfiguera SPF och lägg till include:amazonses.com – Eftersom jag använder Google Apps sedan tidigare så har jag även include:_spf.google.com med i min SPF som ser ut så här:

”v=spf1 mx a include:getanewsletter.com include:_spf.google.com  include:amazonses.com ~all”

4. Ladda hem AWS PHP SDK med hjälp av pear:

# pear channel-discover pear.amazonwebservices.com

# pear install aws/sdk

5. Ladda hem Amazon SES PHP Mailer från GitHub: https://github.com/geoloqi/Amazon-SES-Mailer-PHP

6. Testa att skicka enligt ”Usage” som ser ut enligt följande:

<?php   require_once('AmazonSESMailer.php'); // Create a mailer class with your Amazon ID/Secret in the constructor  $mailer = new AmazonSESMailer('your id', 'your secret'); // Then use this object like you would use PHPMailer normally!  $mailer--->AddAddress('[email protected]');
$mailer->SetFrom('[email protected]');
$mailer->Subject = 'Sent from Amazon SES';
$mailer->MsgHtml('This is a test');
$mailer->Send();
?>

7. Begär fullständig access så du kan skicka E-post till vem som helst (utanför sandbox). En verifiering som tar max 24h.

Observera att Amazon SES har en standardgräns på 1000 st E-post om dagen. Du kan dock begära högre quota. Jag tror även att dessa 1000 dagliga E-postbrev om dagen är gratis om du skickar från en Amazon EC2 instans.

Crawler 2.0

Som många vet så har jag två tjänster som visar information om domäner, nämligen DomainDB.com samt DomainTool.se. Jag var i behov av att uppdatera den informationen som fanns så det var dags att starta den crawler som jag skapat för några år sedan.

Crawlern (eller webcrawler, spider som det också heter) var tämligen ouppdaterad så jag tog tillfället i akt och använder nu enbart Redis. Tidigare så använde jag MySQL + Sphinx:

  • db0 – Kö för domäner som skall besökas
  • db1 – Koppling mellan namnserver och IP-nummer
  • db2 – Koppling mellan www.domän och IP-nummer
  • db3 – Sidtitlar

Db0 rensas och fylls på ungefär varannan dag med runt 25 miljoner nya domäner som besöks så efter cirka en vecka så har jag besökt 100 miljoner domäner. För server-kapacitet så använder jag Amazon EC2 och deras spot instances som är lite billigare och utnyttjar oanvända EC2-instanser.

VideoPlaza, PolarRose, Spotify m.m

VideoPlaza expanderar så det knakar och avser att anställa 10 personer. Inte illa!

**

PolarRose får en ny CEO och Spotify en ny CTO. Vart herr Ehn tagit vägen spekuleras det friskt om. Joakim Jardenberg såg exempelvis att Ehn checkade in på Google i Gowalla).

**

Vad pysslar jag med då? Jo, jag utforskar lite olika API:er som vanligt. Denna gång Amazon samt Commission Junction.

**

SearchMeet ’09 gick av stapeln i helgen och det bjöds på åtskilliga trevliga presentstationer av Gary Beal, Bo Tidelius, Jesper Åström samt Cristoph C. Cemper.

Amazon CloudFront – Så kommer du igång

Det är nu fyra dagar sedan som Bloggy tog ett första steg till att bli en ”del av molnet”-tjänst. Det första steget innebär att alla statiska objekt ligger på Amazon CloudFront-tjänsten.

Eftersom jag hade gjort en implementation till Bloggy tidigare som använde sig av SimpleCDN så var det trivialt att byta ut två rader kod så att Bloggy istället använde sig av Amazon CloudFront.

Den PHP-implementation jag använder är denna: undesigned.org.za/2007/10/22/amazon-s3-php-class

Och den kod som jag använder mig för att ladda upp ett objekt i PHP är följande:

require_once "S3.class.php";
$s3 = new S3('accessKey', 'secretKey');
$s3->putObjectFile('file.doc', 'cf.bloggy.se', 'docs/file.doc', S3::ACL_PUBLIC_READ);

Detta förutsätter att jag redan innan skapat en CloudFront bucket med hjälp av s3cmd:

$ s3cmd --configure

Tips: Använder du Amazon S3 istället så bör du lägga till raden ”bucket_location = EU” i din ~/.s3cfg om du vill att dina buckets ska skpas i europa.

$ ./s3cmd mb s3://cloudfront.bloggy.se 

 

 

Bucket 's3://cloudfront.bloggy.se/' created
$ ./s3cmd cfcreate s3://cloudfront.bloggy.se 

Distribution created: Origin:         s3://cloudfront.bloggy.se/ 

DistId:         cf://E3VE9DJIVFQYO3 

DomainName:     d1bq8ovpea0j10.cloudfront.net 

CNAMEs: 

Comment:        http://cloudfront.bloggy.se.s3.amazonaws.com/ 

Status:         InProgress 

Enabled:        True Etag:           

E2N0AVZ9F1WJZL 

 

 

$   

Som ovan visar så är Status: InProgress och efter några minuter så visas Status: Deployed.

Om du vill använda ditt eget domännamn exempelvis cloudfront.bloggy.se (DNS != bucketnamn) så måste detta sättas som CNAME parameter på den bucketen eller så använder du

Andra bra kommandon: s3cmd ls samt s3cmd cfinfo för att visa dina buckets samt status.

För att sedan synkronisera statiska objekt såsom CSS-filer så behöver du enbart göra enligt följande:

$ ./s3cmd sync /var/www/bloggy.se/docs/css/ s3://cloudfront.bloggy.se

Efter fyra dagar så ser min förbrukning/dollars ut så här (klicka på bilden):

amazonJag har tidigare jämfört Amazon S3 med CloufFront.

Amazon CloudFront vs. S3

Gjorde ett mycket snabbt test huruvida det skiljer sig mycket mellan svarstiderna hos CDN-tjänsterna Amazon CloudFront och Amazon S3. Resultatet blev enl. följande:

CloudFront: round-trip min/avg/max = 57.6/60.6/63.5 ms (tiscali amsterdam)
EU S3: round-trip min/avg/max = 79.8/80.6/81.4 ms (tiscali irland)

Med ApacheBench:

CloudFront: Time taken for tests: 0.754411 seconds
EU S3: Time taken for tests: 1.222397 seconds

Alltså, för EU-trafik så rekommenderas CloudFront. Finns det något annat CDN med EU-noder?

Nya projekt, buggtester, CDN, PDFind

Buggtesterna på Bloggy fortgår och jag fixar runt 5-6 buggar dagligen vilket bör innebära att jag öppnar upp för en publik beta kanske redan nästa vecka. Vill du ha en invite? Gå till bloggy.se och ange din E-post så lovar jag att skicka ut en invite när det är dags.

**

Den blogginformation/data jag besitter verkar vara intressant och diverse sammarbeten gällande min bloggsökmotor Bloggz har inletts.

**

DomainTool.se vilket är en domän informations-tjänst som jag utvecklade för ca ett halvår sedan börjar få mer besökare och är uppe i en tredjedel av antalet besök som Download11 genererar. Så därför har jag börjat att utveckla en storebror som troligtvis inte tar för mycket tid att utveckla.

**

Då mina tjänster kräver mer och mer kapacitet så har jag börjat att snegla på diverse CDN (Content delivery networks) och SimpleCDN.com verkar trevligt. Läste just även att Amazon kommer att släppa en CDN-tjänst. Tillsvidare så har jag dragit igång ett gäng servrar hemma som får göra krävande beräkningar.

**

PDFind.com blir trevligare och trevligare för var dag och snart kanske värdig att kallas BETA.

Amazon Elastic Compute Cloud (Amazon EC2)

Läste nyligen på Slashdot att Amazons tjänst för att enkelt hyra datorkapacitet på deras kluster per timme nu är publikt för allmänheten att registrera sig. Tjänsten som heter EC2 är väl använt av Web 2.0 företag och förmodligen en typ av tjänst som vi kommer få se mer av i framtiden.

Nytt är också att de har olika typer av prissättningar beroende på hur mycket kapacitet du behöver:

$0.10 – Small Instance (Default)

    1.7 GB of memory, 1 EC2 Compute Unit (1 virtual core with 1 EC2 Compute Unit), 160 GB of instance storage, 32-bit platform

$0.40 – Large Instance

    7.5 GB of memory, 4 EC2 Compute Units (2 virtual cores with 2 EC2 Compute Units each), 850 GB of instance storage, 64-bit platform

$0.80 – Extra Large Instance

    15 GB of memory, 8 EC2 Compute Units (4 virtual cores with 2 EC2 Compute Units each), 1690 GB of instance storage, 64-bit platform

Tänkte ta mig tid någon gång framöver och testa EC2. Berätta gärna om du har testat!

Vidare läsning om Ec2: