Disponibilidad / Availability

Una pequeña chuleta con los porcentajes de disponibilidad y el tiempo de caida asociado:

Availability	Downtime
---------------------------------------------------
97% 			10d 22h 48m
98% 			7d 7h 12m
99% 			3d 15h 36m		***
99,5%			1d 19h 48m
99,9% 			8h 45m 36s		***
99,95%			4h 22m 48s
99,96%			3h 30m 14s
99,97%			2h 37m 41s
99,98%			1h 45m 7s
99,99%			52m 34s			***
99,999% 		5m 15s			***
99,9999%	 	32s				***
99,99999%		3s				***

Amazon: Simple WhatIsMyIP with Lambda and API-Gateway

Un ejemplo de como montar un sencillo WhatIsMyIP usando Amazon Lambda con el Backend de NodeJS y API-Gateway.

El código del Lambda (Runtime: NodeJS, Handler: index.handler, Role: Basic Execution Role):

exports.handler = function(event, context) {
    context.succeed({ "ip": event.ip });
};

Aunque para que sea funcional tienes que publicarlo a través de API-Gateway. Crear un resource, por ejemplo “text” y un metodo (GET). Tambien hacen falta algunas configuraciones de integración:

Integration Request (Content-Type: application/json, Mapping Template):

{
"ip" : "$context.identity.sourceIp"
}

Integration Response (Status 200, Content-Type: text/plain, Mapping Template):

#set($inputRoot = $input.path('$'))
$inputRoot.ip

Method Response (Status 200, Content-Type: text/plain, Model: Empty).

Si prefieres respuestas json en realidad es más sencillo aún, podrías ahorrarte la customización de la parte del Integration Response y el Method Response (Por defecto los mime-types ya son application/json y el Integration es Output passthrough).

Solo tienes que publicarla en un stage (“prod” por ejemplo) y al invocar la URL con curl tendrás algo como esto:

# curl -sL https://xxxxxxxxxx.execute-api.eu-west-1.amazonaws.com/prod/text
219.12.34.56

NOTA-1: Si clonas un API, es posible que deje de funcionar (bug?) y tendrás que ir al “Integration Request” y volver a asignar la función, aunque aparezca la correcta, para que le asigne los permisos de ejecución.
NOTA-2: Si vas a usar Lambdas o API-Gateway para datos “binarios” (todo lo que no sea texto, de momento no está soportado), verás tus datos corromperse.

Referencias:
API-Gateway Developer Guide
API-Gateway Developer Guide: Mapping Template Reference
Lambda Developer Guide

PPP: Connection broken

Hoy voy a contar una historia de terror informático, de esas que recuerdan el día en que a Enjuto Mojamuto se le fue Internet.

El Jueves 10, víspera de festivo en Barcelona, llegué a casa del trabajo… Internet no funcionaba (conexion de Fibra/FTTH -Movistar-). Por suerte con el Tethering de Android tenía un acceso alternativo desde el portatil mientras solventaba el problema (aunque andar cambiando de la LAN al 3G era bastante tedioso).

Como buen “friki” miré mi Uptime Robot; la conexión se había caido a las 12:20PM (media mañana). Ese día hubo tormenta, asi que temía que se me hubiera quemado el router, hubiera caido un arbol y roto las lineas, una excabadora, o vete a saber…
Leer más de esta entrada

OpenSSH: Speed UP SSH Connections

Para acelerar las conexiones recurrentes en OpenSSH:

En el cliente:

# /etc/ssh/ssh_config
Host *
    ControlMaster auto
    ControlPath /dev/shm/.ssh-mux_%u_%r@%h:%p
    ControlPersist 600
    # You can set this to "no" if you trust your LAN/DNS
    CheckHostIP no

En el server:

# /etc/ssh/sshd_config
UseDNS no

Rerefencias:
ssh_config
sshd_config

Networking: Local Network Addresses

Estos son los rangos que se pueden usar en una red local (IPv4):

  • 10.0.0.0/8 (255.0.0.0) [ 10.0.0.0 – 10.255.255.255 ]
  • 172.16.0.0/12 (255.240.0.0) [ 172.16.0.0 – 172.31.255.255 ]
  • 192.168.0.0/16 (255.255.0.0) [ 192.168.0.0 – 192.168.255.255 ]

Referencia: Wikipedia

Java: Skeleton for Workers / Batch processing

Un pequeño esqueleto que persigue:

  1. Que no se coma la CPU.
  2. Que no se coma el espacio el disco soltando trazas de fallo.
  3. Que ante una excepcion “extraña” no se muera el worker.
@Override
public void run() {
	int c = 0;
	while (!isShutdown()) {
		if ((++c % 10000) == 0) { // Anti cpu eater
			intrSleep(1);
		}
		try {
			// ... do things
		} catch (ControlledException e) {
			// ... do things
			log.error("ControlledException: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		} catch (Exception e) {
			// ... last resort
			log.error("Unknown Exception: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		}
	}
}
private static void intrSleep(final long millis) {
	try {
		Thread.sleep(millis);
	} catch (InterruptedException e) {
		Thread.currentThread().interrupt();
	}
}

Java: JavaStack artifacts Available in Maven Central

Ya se han liberado los primeros artefactos (librerías de proposito general) de JavaStack en Maven Central:

  • packer:1.1.1 > Libreria de Serializacion de datos (compresion, encriptacion,…). Similar a Kryo.
  • mapexpression:1.0.2 > Evaluador de Expresiones para usar en placeholders como ${name}.
  • stringproperties:1.0.1 > Properties con Features extra (${placeholders}).
  • kvstore:1.0.0 > Un NoSQL / Map Key-Value (disco y memoria).
  • standalone-preferences:1.0.4 > Implementacion del API de Preferences en Filesystem.
  • figaro:1.0.0 > Sistema de mensajes asincronos In-process / EventBus / ActorModel. Similar a Kilim, µJavaActors, Akka.

Todos estos artefactos siguen la misma filosofía: Zen, KiSS

Maven Central: org.javastack

Java: Generating CIDR InetAddress

Una pequeña chuleta para generar una “NetMask” desde un CIDR en Java:

import java.net.InetAddress;

public static InetAddress getAddressByCIDR(final int bits, final boolean ipv6) {
	final int totalBits = (ipv6 ? 128 : 32);
	if (bits < 0 || bits > totalBits)
		throw new IllegalArgumentException("Illegal CIDR prefix");
	final byte[] bytes = new byte[totalBits >> 3];
	for (int offset = 0; offset < bits; offset++) {
		bytes[offset >> 3] |= (1 << (7 - (offset & 7)));
	}
	try {
		return InetAddress.getByAddress(bytes);
	} catch (UnknownHostException e) {
		throw new RuntimeException(e);
	}
}

Referencias:
CIDR

Apache: PROXY protocol for Amazon ELB (Elastic Load Balancing)

If you want to use Apache 2.2 / 2.4 behind a Amazon ELB (Elastic Load Balancing), HAproxy, Stunnel, Stud o anything similar, you will have seen that in the logs appears IP of ELB instead of the remote client, and filter by IP is a double problem.

The module “remoteip” does not solve the problem. Amazon ELB, HAProxy and others support “PROXY protocol”, that helps to fix this issues working behind proxys.

The protocol look similar to:

PROXY TCP4 10.1.2.3 192.168.0.11 56324 443\r\n
GET / HTTP/1.1\r\n
Host: www.acme.com\r\n
Accept: */*\r\n
Connection: close\r\n
\r\n

But Apache currently does not support out-of-the-box. So following the philosophy of Do-It-Yourself, here is the source code (beta):

mod_myfixip.c in Github (for Apache 2.4)
mod_myfixip.c in Github (for Apache 2.2)

UPDATE (2015.01.17): Seems that AWS-ELB don’t always send PROXY header in only one packet / TCP-frame (in some cases data is received fragmented, now the module handle this behavior).

References:
ElasticLoadBalancing: Enable Proxy Protocol
PROXY protocol

Java: Could not generate DH keypair

Si te aparece este error, sigue leyendo…

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1762)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1723)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1706)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1237)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)

Leer más de esta entrada

A %d blogueros les gusta esto: