Uno de los grandes “problemas” que tiene EC2 de Amazon, es que sus unidades de almacenamiento no son persistentes. Esto quiere decir que en cuanto apaguemos nuestra(s) instancia(s), todos los datos almacenados se volatilizarán.
La primera solución que se nos puede venir a la cabeza, podría ser apoyarnos en el servicio S3 para ir haciendo backup de nuestros datos continuamente y así, al apagar nuestra instancia, podríamos recuperar todos nuestros datos. Por supesto, esta solución es poco fiable si nuestros datos varían continuamente (como una Base de Datos), ya que si apagamos nuestra instancia o esta falla en el lapso de tiempo entra backup y backup, seguiríamos perdiendo los últimos cambios.

Afortunadamente, Amazon lanzó EBS (Elastic Block Store), un servicio de almacenamiento persistente que nos permite montar un volumen de datos como unidad de almacenamiento sobre EC2.

Vamos a ver cómo aprovechar EBS para configurar una máquina en EC2 como servidor MySQL con almacenamiento persistente.

Continue Reading →

En el anterior post explicaba los primeros pasos EC2 donde explicaba todo el proceso desde que nos creamos una cuenta AWS para EC2 , hasta que teníamos nuestra instancia levantada y con con acceso ssh.

En esta nueva entrega, voy a contar los pasos a seguir para crear nuestro propio AMI a partir de la instancia que hayamos levantado, y almacenarla en nuestra cuenta de S3 para posteriormente lanzar nuevas instancias con ella.

¿Por qué me interesa crearme un AMI?

Lo primero de todo es entender por qué nos interesa crearnos un AMI y no utilizar AMIs ya generadas.
Una de las características de EC2, es que la única manera de levantar una instancia es a partir de un AMI. Esto quiere decir que si apagamos nuestra instancia o, por algún problema en Amazon, se apagara accidentalmente (a mí en dos años nunca me ha pasado, pero nunca se sabe…), o necesitamos de una instancia adicional para multiplicar nuestra capacidad de procesamiento, la única manera de levantarla es volviendo a utilizar un AMI.
Como es más que probale, las necesidades de nuestra aplicación requerirá que la instancia esté provista de determinado software o configuración, diferente a la que nos ofrece un sistema base. Por eso, tanto por seguridad (backup) como por escalabilidad, es imprescindible generar nuestra propia AMI.

Continue Reading →

EC2 (Elastic Computing Cloud) es uno de los productos estrella de Amazon Web Services, y como su nombre claramente anuncia, se trata de un servicio de Cloud Computing para procesamiento bajo demanda.
EC2 permite crear instancias de procesamiento (servidores remotos virtuales) a los que podemos tener acceso como si de un servidor remoto cualquiera se tratase. Podremos instalar servicios web, ssh, de bases de datos, escritorios remotos , etc…

En éste pequeño tutorial voy a exponer los primeros pasos que hay que dar para utilizar EC2, y algunos consejos basados en mi experiencia en éste proceso.

El funcionamiento es muy sencillo.
Una vez hayamos creado nuestra cuenta de EC2 , tendremos a nuestra disposición un enorme catálogo de AMIs (Amazon Machine Image), que no son otra cosa que imágenes pregeneradas de distintos sistemas operativos, con las que levantar nuestra instancia de procesado EC2.
Existen dos tipos de AMI’s :

- Públicas: Disponibles para cualquier usuario de forma gratuita y puestas a disposición tanto por Amazon, como por otros usuarios que deseen comprartir su propia AMI con el resto de la comunidad
- Privadas: Que solo estarán disponibles para el propietario de esta AMI, o para el resto de la comunidad, previo pago, en el caso de que el usuario haya configurado el servicio de AMIs de pago.

Lo normal cuando trabajemos con EC2, es que nos creemos nuestra propia AMI privada con todas las aplicaciones que necesitemos en nuestras tareas, para así poder levantar instancias de ésta en cualquier momento.

Continue Reading →

Si hemos elegido Amazon S3 como sistema de almacenamiento virtual , quizás nos interese tener almacenados archivos que se puedan descargar libremente por cualquier usuario, y que además puedan ser linkados desde cualquier sitio. Pero en la mayoría de los casos tendremos almacenados nuestros archivos y no nos gustará que nadie nos enlace directamente y tener que soportar los gastos de transferencia y almacenamiento por él.

Voy a explicar cómo, con un sencillo script en php conseguiremos que nuestros archivos de S3 estén totalmente protegidos y que sólo puedan ser accesibles desde nuestro dominio.

Lo primero de todo, es conocer dos características que Amazon nos prové con sus APIs:
- Los ACL (Access Control List) : que nos permite definir los permisos de lectura-escritura-ejecución de nuestros bucket y objetos.
- Las URLs Firmadas : que nos permite acceder temporalmente a nuestros archivos protegidos, a través de una url que incluye una firma y un tiempo de expiración de los permisos. Éstas URLs las podremos generar con nuestro script, y llevarán como parámetro nuestra firma generada en tiempo de ejecución, que lleva implicita el tiempo de caducidad de la url.

La primera medida es aplicar permisos exclusivo de lectura para nuestro usuario (usando los ACLs) a todos los archivos que queramos proteger, para que sea imprescindible una validación al acceder a ellos.
Para generar nuestro script , necesitaremos echar mano de la clase Crypt/HMAC para construir el hash en sha1 que Amazon S3 requiere.
Lo primero será crear nuestra función para  generar nuestra firma:

PHP:
  1. require_once 'Crypt/HMAC.php';
  2. function hex2b64($str) {
  3. $raw = '';
  4. for ($i=0; $i <strlen($str); $i+=2) {
  5. $raw .= chr(hexdec(substr($str, $i, 2)));
  6. }
  7. return base64_encode($raw);
  8. }
  9. function makeSig($str) {
  10. $secretKey="Llave secreta que nos proporciona Amazon para nuestra cuenta";
  11. $hasher =& new Crypt_HMAC($secretKey, "sha1");
  12. $signature = hex2b64($hasher->hash($str));
  13. return($signature);
  14. }

Lo siguiente, será crearnos una función para construir nuestra URL firmada :

PHP:
  1. function getSignedURL($bucket, $key, $expires=120){
  2. $accessKeyId="accessKeyId que nos proporciona Amazon con nuestra cuenta";
  3. $expires = time() + $expires;
  4. $resource = $bucket."/".urlencode($key);
  5. $stringToSign = "GETnnn$expiresn/$resource";
  6. $signature = urlencode(makeSig($stringToSign));
  7. $signedUrl="http://s3.amazonaws.com/$resource?AWSAccessKeyId=$accessKeyId&Expires=$expires&Signature=$signature";
  8. return $signedUrl;
  9. }

Ésta función nos devolverá la url firmada, que estará disponible durante el tiempo (en segundos) que hayamos establecido en el parametro $expires (120seg por defecto)

Ahora ya sólamente nos falta un script que nos lance al contenido, pero que nos proteja de links externos a nuestro dominio.
Para ésto simplemente comprobaremos si existe el campo HTTP_REFERER en nuestra variable $_SERVER , que nos indicará que estamos accediendo a ésta url desde otra url de referencia , y que nuestro dominio (extraido desde $_SERVER['HTTP_HOST']) esté contenido en él.

PHP:
  1. function get_amazon_url($amazon_bucket,$amazon_object){
  2. if(isset($_SERVER['HTTP_REFERER']) && strstr($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST']))   {
  3. $url=getSignedURL($amazon_bucket,$amazon_object,60);
  4. header('Location:'.$url);
  5. }else{
  6. echo 'Éste contenido ha sido enlazado ilegalmente';
  7. }
  8. }

Al llamar a ésta función, seremos automáticamente redirigidos al contenido en amazon siempre que el link provenga desde nuestro mismo dominio. Por supuesto, si quisieramos permitir el acceso desde una determinada lista de dominios, simplemente tendríamos que modificar un poco la condición if , para que compruebe que cada uno de los dominios están incluido en el HTTP_REFERER.

Espero que sea útil.
Un Saludo !!