Introducción a Amazon Web Services en español parte 1


Introducción

Amazon web services es la plataforma de nube de Amazon, la cual provee diferentes servicios en la nube, en este post se mostrarán algunos de estos servicios y sus casos de uso comunes.

Infraestructura Global

La infraestructura de Amazon opera a nivel global, lo cuál significa que existen diferentes centros de datos a nivel mundial, estos centros de datos están organizados del siguiente modo.

  • Regions (regiones) :  Es una región física en el mundo, cada región contiene múltiples availability zones
  • Availability Zones (Zonas de disponibilidad) : Una zona de disponibilidad consiste en uno o más data centers (centros de datos)
  • Edge Locations: Son puntos finales de CDN, más detalles sobre este punto cuando se explique el servicio CDN.

Productos disponibles

A continuación se muestra una lista categorizada con los principales productos disponibles y una descripción breve sobre los mismos:

Compute

  • Amazon Elastic Compute Cloud (Amazon EC2)

ec2-logo-full

Servicio diseñado para crear servidores virtuales en la nube en minutos tipos de instancias prefabricadas como : Propósito general, Computo optimizado, Memoria optimizada, Computación acelerada, Almacenamiento optimizado. Puedes encontrar una lista completa de los tipos de instancia con sus descripciones en el siguiente link https://aws.amazon.com/ec2/instance-types/.

Casos de uso:

  1. Despliegue de aplicaciones
  2. Creación de entornos de desarrollo
  3. Creación de máquinas virtuales en diferentes Sistemas operativos
  • Elastic Beanstalk

elastic_beanstalk_logoEs un servicio fácil de utilizar para el despliegue de aplicaciones y servicios escalables desarrollados en : Java, .NET, PHP, Node.js, Python, Ruby, Go, y Docker. Solo tienes que subir tu código y Elastic Beanstalk manejará de forma automática el despliegue, la capacidad, balanceo de carga, auto escala y monitoreo de salud, más información en el siguiente link https://aws.amazon.com/elasticbeanstalk/.

Casos de uso:

  1. Despliegue de aplicaciones en diferentes lenguajes de programación
  • Amazon VPC

vpc-vpn-logoPermite crear una nube privada y aislada donde es posible definir las redes donde se desplegarán los recursos. Se tiene un control total sobre la VPC que se defina, es posible definir : Rangos de IP, creación de sub redes,  si se tendrá acceso o no a internet en las diferentes redes, Firewalls a nivel de sub red, una conexión con VPN corporativas, más información en el siguiente link https://aws.amazon.com/vpc/.

Casos de uso:

  1. Creación de datacenters privados
  2. Creación de sub redes públicas  (Todos los recursos dentro de esta sub red tendrán acceso a internet)
  3. Creación de sub redes privadas (Los recursos dentro de estas sub redes no  tendrán acceso a internet)
  4. Creación de firewalls a nivel de sub red (Es posible cerrar o abrir puertos para todas las máquinas dentro de la sub red, además del firewall que pueda tener el recurso)
  • AWS Lambda

lambdaLambda permite ejecutar código utilizando la arquitectura server less lo cual significa que no es necesario tener un servidor para ejecutar ese fragmento de código. De este modo solo se tiene que pagar por ejecución de código y no por tener un servidor prendido por un determinado tiempo, con esto si el código nunca se ejecuta no se hará ningún cargo si se ejecuta una vez solo se ejecutará esa ejecución, más información en el siguiente link https://aws.amazon.com/lambda/.

Casos de uso:

  1. Ejecución de código bajo demanda
  2. Ejecución de código cuando se generen eventos en recursos de AWS
  3. Ejecución de funciones bajo invocación sobre HTTPS
  4. Eventos programados
  • Auto Scaling

aws_autoscalingAuto scaling permite mantener las aplicaciones disponibles todo el tiempo con el mayor beneficio posible, esto debido a que es posible crecer o disminuir el número de equipos detrás de un balanceador de carga acuerdo a la demanda a través del uso de métricas, por ejemplo es posible decir si el uso del CPU es mayor a 70% crea una máquina nueva con la aplicación y colócala detrás del balanceador para atender las peticiones y si el uso del CPU es menor al 30% quita una de las instancias, más información en el siguiente link https://aws.amazon.com/autoscaling/.

Casos de uso:

  1. Crecer o disminuir el número de maquinas de acuerdo al uso

Storage

  • S3 (Simple Storage Service)

amazons3Amazon Simple Storage service permite hacer almacenamiento de objetos con una interfaz web simple que permite subir y descargar cantidades grandes de archivos. Esta diseñado para tener una durabilidad de 99.999999999% y una disponibilidad de 99.99%. más información en el siguiente link https://aws.amazon.com/s3/.

Casos de uso:

  1. Almacenamiento de imágenes en aplicaciones web
  2. Almacenamiento de videos
  3. Almacenamiento de archivos
  • Glacier

glacier.pngEs un durable, seguro y súper barato servicio de almacenamiento a largo plazo. Con el fin de mantener los costos bajos descargar un archivo puede tomar incluso horas. Por esto se recomienda para guardar información histórica, más información en el siguiente link https://aws.amazon.com/glacier/.

Casos de uso:

  1. Almacenamiento de datos históricos
  2. Almacenamiento de información que debe ser guardada por fines legales
  • EBS (Elastic block storage)

ebsElastic block storage provee un almacenamiento persistente para ser utilizado como volumen en instancias EC2, con Amazon EBS es posible escalar o disminuir el tamaño en solo unos minutos, más información en el siguiente link https://aws.amazon.com/ebs/.

Casos de uso:

  1. Bases de datos no soportadas por Amazon
  2. Almacenamiento

 Database

  • RDS (Relational Database Service)

aws_simple_icons_database_amazonrds-svg_-20160325070440RDS Hace simple la instalación, configuración y escalabilidad de  bases de datos relacionales en la nube.  Amazon RDS provee 6 motores de bases de datos comunes entre los que se encuentra : Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle y Microsoft SQL server.

Es importante mencionar que para las bases de datos que requieren licencia es posible utilizarlas con BYOL (Bring your own license), lo cual significa que si ya se cuenta con una licencia puede ser utilizada en su ambiente en la nube, más información en el siguiente link https://aws.amazon.com/rds.

Casos de uso:

  1. Configuración de bases de datos relacionales en la nube
  • DynamoDB

aws-dynamodb-logo-cf7bcc577d-seeklogo-comDynamoDB es la base de datos NoSQL rápida y flexible de Amazon. Diseñada para aplicaciones que necesitan consistencia y latencia de mili segundos a cualquier escala.

Casos de uso:

  1. Configuración de bases de datos NoSQL rápidas y flexibles
  • ElasticCache

elasticcacheElasticCache es un servicio que hace fácil desplegar, operar y escalar información en cache en la nube. Este servicio mejora el performance de las aplicaciones permitiendo obtener la información de una forma rápida, administrada y almacenada en memoria. Soporta 2 motores open source  Redis y Memcached.

Casos de uso:

  1. Mantener información de acceso común en memoria para un acceso rápido

AWS Free tier (Capa gratuita de Amazon)

Amazon provee una capa gratuita para que los desarrolladores aprendan a utilizar la plataforma de AWS, los productos y los servicios. A continuación se presentan los límites de los principales productos para la capa gratuita al 30 de enero del 2017.

captura-de-pantalla-2017-01-30-a-las-2-18-44-p-m

captura-de-pantalla-2017-01-30-a-las-2-17-55-p-m

Más información sobre los límites de la capa gratuita en el siguiente link https://aws.amazon.com/free/

Siguientes pasos

En siguientes posts se explicarán otros servicios de Amazon Web services, a continuación se presenta una lista de algunos de los servicios restantes de los que se hablarán en el futuro:

  • Networking
    • CloudFront
    • Route 53
    • Direct Connect
    • Elastic Load Balancing
  • Developer Tools
    • Code commit
    • PipeLine
    • Code deploy
  • Management tools
    • Cloud watch
    • Cloud trail
    • Cloud formation
    • OpsWorks
  • Messaging
    • SQS
    • SNS
    • SES

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Introducción a Lambdas en Java 8 Parte 1 en Español


La versión actual de Java es Java 1.8 mejor conocida como Java 8, como toda nueva versión viene con una lista de novedades en el lenguaje, a continuación se explicará como utilizar una de las más importantes, Lambdas !

Introducción

Las expresiones lambda son una de las novedades más importantes de Java 8 y proveen una forma simple de representar un método a través de una expresión. En este post se mostrarán algunos ejemplos simples del funcionamiento de lambda.

Sintaxis de una expresión lambda

Las expresiones lambda permitirán tomar una clase anónima interna y cambiarán de 5 líneas de código a solo una.

Una expresión lambda está compuesta por las siguientes 3 partes:

  • Lista de argumentos     : (int x, int y)
  • Token                                 : ->
  • Cuerpo                               : x + y

El cuerpo puede ser una expresión o un bloque de código el cual simplemente será evaluado y devuelto. A continuación se presentan algunos ejemplos:


(int x, int y) ->  x+y
() -> 55
(String message) ->{System.out.println(message);}

Si se trata de generalizar quedaría del siguiente modo:

(params) -> expression
(params) -> statement
(params) -> { statements }

Ejemplos

1.- Creación de hilos utilizando clases anónimas comunes:

public class LambdaTest {

	public static void main(String[] args) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 1000; i++) {
System.out.println("I'm a thread " + i);
}
} }).start();
}  }  

Creación de hilos utilizando lambdas:

public class LambdaTest {
public static void main(String[] args) {
new Thread(() -> {
			for (int i = 0; i < 1000; i++) {
		             System.out.println("I'm a thread " + i);
			}
		}).start();
	}
}

En este caso se puede observar como la creación de la clase anónima sobre la interfaz Runnable se simplificó de forma considerable.

2.- Creación de un Comparator utilizando clases anónimas comunes y lambdas:

Paso 1: Creación de la clase de modelo Person.

public class Person {
	private String name;
	private int age;
	private char sex;

	public Person(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}

Paso 2: Implementación de un ordenamiento por nombre utilizando clases anónimas:

public class LambdaTest {

	public static void main(String[] args) {
		List<Person> list = new ArrayList<>();
		list.add(new Person("Alex", 28, 'M'));
		list.add(new Person("Wilson", 30, 'M'));
		list.add(new Person("Joyce", 27, 'F'));
		list.add(new Person("Pedro", 26, 'M'));
		list.add(new Person("Juan", 18, 'M'));
		System.out.println(list);
		Collections.sort(list, new Comparator<Person>() {
			@Override
			public int compare(Person p1, Person p2) {
				return p1.getName().compareTo(p2.getName());
			}
		});
		System.out.println(list);
	}
}

Salida:

[Person [name=Alex], Person [name=Wilson], Person [name=Joyce], Person [name=Pedro], Person [name=Juan]]
[Person [name=Alex], Person [name=Joyce], Person [name=Juan], Person [name=Pedro], Person [name=Wilson]]

Paso 3: Implementación de un ordenamiento por nombre utilizando lambdas:


public class LambdaTest {

	public static void main(String[] args) {
		List<Person> list = new ArrayList<>();
		list.add(new Person("Alex", 28, 'M'));
		list.add(new Person("Wilson", 30, 'M'));
		list.add(new Person("Joyce", 27, 'F'));
		list.add(new Person("Pedro", 26, 'M'));
		list.add(new Person("Juan", 18, 'M'));
		System.out.println(list);
		Collections.sort(list, (Person p1, Person p2) -> p1.getName().compareTo(p2.getName()));
		System.out.println(list);
	}
}

Salida:

[Person [name=Alex], Person [name=Wilson], Person [name=Joyce], Person [name=Pedro], Person [name=Juan]]
[Person [name=Alex], Person [name=Joyce], Person [name=Juan], Person [name=Pedro], Person [name=Wilson]]

Como se puede observar en ambos casos la salida es la misma, pero haciendo uso de lambdas es posible escribir código más simple y claro.

3.-Creación de una interfaz propia y su implementación utilizando lambda:

Paso 1: Definición de interfaz a implementar.

interface Calculable {
	double avg(double... numbers);
}

Creando implementación de la interfaz Calculable utilizando lambdas:


public class LambdaTest {

	public static void main(String[] args) {
		Calculable calc = numbers -> {
			double sum = 0.0;
			for (int i = 0; i < numbers.length; i++) {
				sum += numbers[i];
			}
			return sum / numbers.length;
		};
		System.out.println(calc.avg(1,2,3,4,5,6,7,8,9,10));
	}
}

 Como se puede observar dentro del método main se escribe una expresión lambda para implementar el método avg el cual calcula el promedio de un número indefinido de enteros recibidos.

Salida:

5.5

4.-Iterar una colección utilizando Lambdas:

El primer punto a aclarar es que para este ejemplo se utilizará el método void forEach(Consumer<? super T> action) el cuál es un nuevo método incluido en Java 8.

Iteración e impresión de una lista utilizando código anterior a Java 8:

public class LambdaTest {

	public static void main(String[] args) {
		List<Integer>numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		for (Integer value : numbers) {
			System.out.println(value);
		}
	}
}

Iteración e impresión de una lista utilizando Java 8 sin lambdas:

public class LambdaTest {

	public static void main(String[] args) {
		List<Integer>numbers=Arrays.asList(1,2,3,4,5,6,7,8,9,10);
		numbers.forEach(new Consumer<Integer>() {
			@Override
			public void accept(Integer t) {
				System.out.println(t);
			}
		});
	}
}

Como se puede observar se hace uso del método forEach el cuál recibe un objeto que implemente la interfaz Consumer, es importante mencionar que tanto el método forEach como la interfaz Consumer fueron agregadas desde Java 8

Iteración e impresión de una lista utilizando Java 8 con lambdas:

import java.util.Arrays;
import java.util.List;

public class LambdaTest {

	public static void main(String[] args) {
		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		numbers.forEach((Integer t) -> {
			System.out.println(t);
		});
	}
}

En próximos posts se explicará como hacer programación funcional en Java y más novedades de Java 8.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com