Mostrando las entradas con la etiqueta aws. Mostrar todas las entradas
Mostrando las entradas con la etiqueta aws. Mostrar todas las entradas

2015-01-26

Matando queries en RDS

Para matar la ejecución de una query que está haciendo mierda el server en RDS, si tenés una instancia de mysql tenés que hacer:

CALL mysql.rds_kill_query(process_id);

Para obtener el process_id, podés correr:

SHOW FULL processlist;

Happy hacking,
Aureliano

2014-12-04

Mejorando el mirroring

Hace un tiempito hice un post sobre lo que estoy haciendo para sincronizar directorios con rsync en instancias de EC2. Esto funcionó muy bien para directorios chiquitos, pero cuando tenés más de 100 megas y más de 1400 archivos cada iteración se hace un poco lenta y usa mucho bandwidth. Y no creo que Fibertel esté muy contento con eso.

Así que estuve buscando alguna versión que detecte los cambios que se hacen en los archivos, para no estar mirando todo todo el tiempo. Y lo encontré :D. Existe una cosa que se llama lsyncd, que hace eso :D. Si estás en ubuntu, para instalarlo solo hay que hacer sudo apt-get install lsyncd. Y con eso hice un scriptcito que busca el nombre de la instancia de EC2 con la que me interesa sincronizar y lo usa para mantenerlo sincronizado.

#!/usr/bin/env python

import subprocess
import sys
import time
import boto
import getpass
import tempfile

AKI = "AKIVAUNACCESSKEYID"
USER = "unusername"
INAME = "NOMBRE DE LA INSTANCIA"
TARGET = "DIRECTORIO EN EL TARGET"
SOURCE = "."

CONF_TEMPLATE="""\n
settings {
  logfile = "lsyncd.log",
  statusFile = "lsyncd.status",
  nodaemon = true,
  statusInterval = 2,
  maxProcesses = 8,
}

sync {
  default.rsyncssh,
  source=".",
  host='%(host)s',
  targetdir='%(targetdir)s',
  exclude={
    "*.pyc",
    "*.log",
    "*.swp",
    "*.status",
    "*/.hg/*",

  },
  delay=2,
}
"""

def main():
    sak = getpass.getpass("Enter secret access key:")
    ec2 = boto.connect_ec2( AKI, sak )
    dns_name = ec2.get_only_instances(filters={"tag:Name":INAME})[0].dns_name
    host = USER + "@" + dns_name
    targetdir = TARGET   
    with tempfile.NamedTemporaryFile() as t:
        print CONF_TEMPLATE % locals()
        t.write(CONF_TEMPLATE % locals())
        t.flush()
        subprocess.check_call("lsyncd -nodaemon -log Exec".split(" ") + [t.name])

if __name__ == '__main__':
    main()


Happy hacking,
Aureliano

2014-11-11

mosh en AWS

Acabo de instanciar una VM en EC2, usando la AMI estándar de Ubuntu-Server de 64bits. Hago
$ sudo apt-get install mosh
en un shell de la nueva instancia (por ssh) pero no me puedo conectar usando mosh. ¿Por qué? Tengo algún quilombo con los locales
The locale requested by LANG=en_US.UTF-8 isn't available here.
Running `locale-gen en_US.UTF-8' may be necessary.
¿Cómo lo arreglo? Siguiendo las instrucciones de acá, genero los 2 locales que necesito y los registro:
$ sudo locale-gen en_US.UTF-8
$ sudo locale-gen es_AR.UTF-8
$ sudo dpkg-reconfigure locales
Y ahora me puedo conectar :D.

Happy hacking,
Aureliano.

2014-11-10

Mi propia autoridad certificante y mi ELB

En esta respuesta de StackOverflow dice como armar tu propia autoridad certificante en 1 minuto, y en esta página cómo darle a AWS las cosas que necesita para setupear un load-balancer con SSL. Entre esas 2 cosas es fácil armar tu propia página que use tu autoridad certificante. Es medio difícil convencer a la gente que hace los browsers de que te acepte, pero probablemente sirva para intranets o aplicaciones que se conecten a la nube.
Happy hacking,
Aureliano.

2014-09-18

Rsync iterado, integración con EC2

Ayer hice un script para coordinar directorios con rsync. Hoy lo integré con EC2, usando boto. Así no tengo que andar buscando el nombre de dns de la instancia cada vez. Cambien las constantes que aparecen arriba y úsenlo a piaccere. Para que sea usable tienen que poner la clave para loguearse en la instancia en su agente de SSH.

#!/usr/bin/env python

import subprocess
import sys
import time
import boto
import getpass

AKI = "AKIVAUNACCESSKEY"
USER = "ubuntu"
INAME = "INSTANCENAME"
TARGET = "TARGET_DIR"
SOURCE = "SOURCE_DIR"

def main():
    sak = getpass.getpass("Enter secret access key:")
    ec2 = boto.connect_ec2( AKI, sak )
    dns_name = ec2.get_only_instances(filters={"tag:Name":INAME})[0].dns_name
    while True:
        try:
            subprocess.check_call([
                "rsync",
                "-z",
                "-r",
                "--delete",
                "--exclude=*.pyc",
                "--exclude=*.log",
                SOURCE,
                "%s@%s:%s" % (USER, dns_name, TARGET)
            ])
            print ".",
            sys.stdout.flush()
            time.sleep(1)
        except subprocess.CalledProcessError, e:
            if e.returncode in [10,11,12,14,22,23,24,30,35]: # See http://wpkg.org/Rsync_exit_codes
                print "R",
                sys.stdout.flush()
            else:
                raise

if __name__ == '__main__':
    main()


Espero que les sirva,
Aureliano.

2013-04-04

Invalid private key

Poner un certificado nuevo en un ELB debería ser fácil, pero no. Genero un .csr y una clave privada a partir de un .conf usando openssl, lo mando a la autoridad certificante y cuando lo quiero subir a AWS se queja, "Invalid private key".  ¿Qué carajo te pasa AWS?

Lo que pasa es que es hincha bolas. Solo toma claves RSA. Si tu clave privada empieza así:
-----BEGIN PRIVATE KEY-----

Hay que transformarla en una que empiece así:
-----BEGIN RSA PRIVATE KEY-----

Para eso, hay que correr un comandito en openssl:
openssl rsa -in my.private.key -text

La salida está en el formato que necesito :D. Por suerte esto ya lo habían descubierto antes, porque sino hubiera estado mucho más tiempo para encontrarlo.

Happy hacking,
Aureliano.

2012-04-23

Cambiando el certificado de SSL de un ELB

Abajo pongo un script que hice en python para cambiar el certificado por un ELB usando boto. Asumo que el load balancer escucha en el puerto 443 (https). Cambien las constantes para que use las que les corresponda en su proyecto.

import boto

AWS_ACCESS_KEY = "AWS_ACCESS_KEY_HERE"
SECRET_KEY = "SECRET_KEY_HERE"

PRIVATE = """\
PRIVATE KEY .pem CONTENT HERE
"""
BODY = """\
CERTIFICATE .pem CONTENT HERE
"""
CHAIN = """\
CHAIN CERTIFICATE .pem content HERE
"""
CERT_NAME = "name-for-the-new-cert"
ELB_NAME = "elb-to-be-updated"

iam = boto.connect_iam(AWS_ACCESS_KEY, SECRET_KEY)
iam.upload_server_cert(CERT_NAME, BODY, PRIVATE, CHAIN)

cert = iam.get_server_certificate(CERT_NAME)

elb = boto.connect_elb(AWS_ACCESS_KEY, SECRET_KEY)
for lb in elb.get_all_load_balancers():
  if lb.name == ELB_NAME:
    lb.set_listener_SSL_certificate(443,cert.arn)


Happy hacking,
Aureliano.