¡Participa de la Maratón Behind the Code, la competencia de programación más desafiante! Inscríbete aqui

Construcción de una Aplicación de Almacenamiento en la Nube

Entre los muchos servicios en nube, el almacenamiento de objetos en la nube probablemente ha experimentado el mayor crecimiento. Es comúnmente utilizado para almacenar fotos, imágenes, documentos y archivos de audio y video. Todos los días, las personas encuentran nuevos usos para su almacenamiento de objetos favorito. Independientemente del propósito de la aplicación que irá a desarrollar, la comprensión de los servicios de almacenamiento de objetos en la nube es una parte esencial de la construcción de una solución escalable para el mundo real.

Con el conocimiento adquirido aquí, puede desarrollar rápidamente excelentes aplicaciones, utilizando IBM Object Storage.

En este tutorial, le mostramos cómo desarrollar una aplicación sencilla con el servicio Object Storage para IBM Cloud, un servicio de almacenamiento de objetos basado en OpenStack Swift, y le explicaremos cómo puede utilizar las API de almacenamiento de RESTful. La aplicación que desarrollará les permitirá a los usuarios subir, descargar y gestionar sus imágenes y documentos utilizando el servicio Object Storage para IBM Cloud. También puede descargar la aplicación de muestra y ver el código. Con el conocimiento adquirido aquí, podrá desarrollar rápidamente excelentes aplicaciones con IBM Object Storage.

None

Qué necesita para construir la aplicación de muestra en este tutorial

  1. Una cuenta de IBM Cloud
  2. Conocimiento básico de la interfaz de línea de comando Cloud Foundry
  3. Conocimiento básico de Node.js. Los siguientes documentos pueden ser útiles:

  4. Conocimiento básico de la terminología de la aplicación de servicio Object Storage (opcional)

  5. Conocimiento básico de la API de OpenStack Swift (opcional)

Paso 1. Crear una aplicación de Node.js

  1. Inicie sesión en su cuenta de IBM Cloud.
  2. Haga clic en CREAR UNA APLICACIÓN.
  3. Elija tipo de aplicación WEB.
  4. Seleccione SDK para Node.js y haga clic en CONTINUAR.
  5. Ingrese el nombre que haya elegido para la aplicación y que sea único en el dominio de IBM Cloud. En este ejemplo, utilizamos awesome-store como el nombre de nuestra aplicación.

Paso 2. Añadir una instancia del servicio Object Storage para IBM Cloud

  1. Luego de crear la aplicación, haga clic en el botón AÑADIR UN SERVICIO.
  2. Desplácese hasta la sección Gestión de Datos y haga clic en el ícono Object Storage.
  3. El servicio Object Storage viene con un documento bastante detallado Guía de Inicio de Object Store, que puede revisar al hacer clic en el botón VER DOCUMENTOS. También puede hacer clic en el botón TÉRMINOS para revisar el acuerdo de licencia del servicio. Como ya debe haber notado, este servicio beta es gratuito.
  4. Haga clic en el botón CREAR y VOLVER A IMPLEMENTAR su aplicación. Ha creado una aplicación con el proyecto de plantilla inicial Node.js proporcionado por IBM Cloud, ha creado una instancia del servicio Object Storage y ha vinculado la instancia a la aplicación recién creada.
  5. El nombre de su aplicación, awesome-store, se muestra en la parte superior del navegador y debajo del nombre aparece un enlace. Para ver qué hace la aplicación, haga clic en el enlace. Se abre una ventana similar a la imagen a continuación. Observe que el área de dirección del navegador muestra awesome-store.mybluemix.net. Este URL es una combinación del nombre de la aplicación y del dominio que usted seleccionó. Puede acceder a su aplicación desde cualquier navegador utilizando el URL.

    awesome-store.mybluemix.net sample application

  6. En la barra lateral izquierda del panel de instrumentos, haga clic en el enlace Variables de Entorno para examinar VCAP_SERVICES. Esta es una información importante que su aplicación necesita para realizar llamadas al servicio Object Storage, como crear una cuenta para el usuario de la aplicación y permitirles a los usuarios cargar y descargar documentos. Vea el ejemplo de la figura a continuación. El username y la password se codificaron para incrementar la seguridad.

    Example of environment variables

    Observe que en la sección de credenciales podrá encontrar auth_uri, username y password. Estos tres campos se utilizan para autenticar su aplicación con el servicio y son referenciados como auth_uri, nombre de usuario y contraseña a partir de ahora. Es muy importante saber que este par de username y password es la credencial para autenticar su aplicación con el servicio. No es el mismo username y password de su aplicación, si esta soporta varios usuarios.

Paso 3. Obtener el código de inicialización de IBM Cloud

  1. Mientras ve su aplicación awesome-store en la pantalla de IBM Cloud, haga clic en el enlace Empezar Codificación en la barra lateral izquierda.

    IBM Cloud dashboard

  2. A la derecha, encontrará algunos pasos relacionados con el proceso de desarrollo de aplicaciones de IBM Cloud. Si aún no ha configurado su interfaz de línea de comando Cloud Foundry en su entorno favorito, hágalo ahora al seguir el paso de Configuración.
  3. Haga clic en Descargar Código de Inicio. El código descargado es un archivo ZIP. Al descomprimir el archivo, verá la siguiente estructura de carpetas y archivos:

    Files and folders structure

    Como el objetivo de este tutorial es demostrar cómo utilizar el servicio Object Storage, no entraremos en detalles acerca de la programación de la aplicación de Node.js. En cambio, nos enfocaremos en tres puntos clave necesarios para programar el servicio Object Storage.

    1. Examinaremos cómo el servicio Object Storage aprovecha las API de almacenamiento de objetos de OpenStack Swift para que las aplicaciones manejen varias entidades en su almacenamiento de objetos.
    2. Mostramos que, a fin de que una aplicación pueda acceder al almacenamiento de objetos de Swift, primero debe obtener un token de acceso.
    3. Mostramos cómo, luego, las aplicaciones pasan este token de acceso a través de solicitudes para manejar carpetas y objetos.
  4. Aunque existan muchas formas de lograr las tareas mencionadas arriba, para simplificar, desarrollamos algunos URL para realizar las tareas en esta aplicación de Node.js. Estos URL se ingresan en su navegador como solicitudes GET, por lo que no necesita ninguna herramienta especial para probar el código. A continuación, se muestra la lista de URL con una breve descripción de cada uno. Sustituya las variables precedidas por dos puntos con la cadena de caracteres de su elección. Por ejemplo, /gettoken/:userid se vuelve /gettoken/tongli.

    • /gettoken/:userid – Recupera un token de acceso para userid.
    • /listfolders/:userid – Lista todas las carpetas de userid.
    • /createfolder/:userid/:foldername – Crea una carpeta denominada foldername para userid.
    • /delfolder/:userid/:foldername – Borra una carpeta del userid y la carpeta. Esto no fue implementado en la aplicación, puede añadir la implementación como ejercicio. La implementación es muy similar a la operación deldoc.
    • /listdocs/:userid/:foldername – Lista todos los documentos del userid y la carpeta.
    • /createdoc/:userid/:foldername/:docname – Crea un documento denominado docname para el userid en la carpeta foldername. Debe haber notado que la solicitud GET realmente no envía ningún contenido al documento. En esta aplicación, usted solo envía una cadena de caracteres codificada.
    • /getdoc/:userid/:foldername/:docname – Recupera el documento denominado docname en userid en la carpeta foldername.
    • /deldoc/:userid/:foldername/:docname – Borra un documento.
  5. En su carpeta de visualización, cree un archivo de plantilla Jade denominado layout.jade, copie y pegue el siguiente código como su contenido y, luego, guarde el archivo.

    doctype html html include head body table(style="width:100%") tr td(style= "width:307px" ) img(src="/images/newapp-icon.png") td block content
    
  6. En su carpeta de visualización, cree otro archivo de plantilla Jade denominado results.jade, copie y pegue el siguiente código como su contenido y, luego, guarde el archivo.

    extends layout block content div(id="results") h2 pre !=JSON.stringify(body, null, 2)
    
  7. Abra el archivo app.js y añada las siguientes líneas luego de la línea var services:

    The existing code: var services = JSON.parse(process.env.VCAP_SERVICES || "{}"); The new code to be added after the above line: app.get('/gettoken/:userid', function(req, res){ res.render('results', {body: {}); });
    

    El nuevo código utiliza a results.jade como plantilla, pasa una variable denominada body a la plantilla, luego, la representa en HTML.

  8. Estos nuevos archivos y las modificaciones en app.js nos prepararon para hacer más. Aunque no hayamos logrado mucho hasta este punto, todavía puede desplegar esta aplicación y ver su nuevo código en funcionamiento. Utilice el comando cf push para desplegar la aplicación en IBM Cloud. Para ver resultados similares a este:

    Results of deployed application

    Si encuentra errores, verifique detalladamente los dos archivos y las modificaciones realizadas al archivo app.js. Generalmente, el navegador mostrará información de depuración útil.

Paso 4. Obtener un token de acceso para un usuario de su aplicación

  1. El servicio Object Storage soporta varias cuentas de usuario por instancia del servicio. Le permite desarrollar fácilmente una aplicación que soporte varios usuarios porque hace el trabajo pesado por usted. Para obtener un token de acceso para un usuario de su aplicación, envíe una solicitud utilizando autenticación básica a este punto final: auth_uri/<app_userid>. En este ejemplo, el URL tiene este aspecto:

    https://swift.ng.bluemix.net/auth/e40bf8f2-c3c6-4e51-8cde-476e30574637/fe07a633-61b3-4797-9a4d-c36daee7335b/tong
    

    Observe que el URL no es exactamente el auth_uri que obtiene de la variable VCAP_SERVICES. Más bien, es la concatenación de auth_uri y un id de usuario elegido por su aplicación. Su aplicación puede soportar varios usuarios y usted puede elegir cualquier cosa como id de usuario, siempre que estos id de usuarios sean únicos en toda la aplicación. Cada id de usuario debe identificar de manera única a un usuario de su aplicación. El encabezado de autenticación básica debe seguir el protocolo estándar de autenticación básica.

  2. Como enviará solicitudes de HTTP en la aplicación, debe incluir una biblioteca de solicitudes HTTP de Node.js. Añada la siguiente línea al archivo app.js.

    The existing code: var express = require('express'); The new code to be added after the above line: var request = require('request');
    
  3. Añada el siguiente código al archivo app.js para sustituir las líneas añadidas anteriormente en el Paso 3.7.

    var cache = {}; var auth = null; var set_app_vars = function() { var credentials = services['objectstorage'][0]['credentials']; auth = {"auth_uri": credentials['auth_uri'], "userid" : credentials['username'], "password" : credentials['password'], }; auth["secret"] = "Basic " + Buffer(auth.userid + ":" + auth.password).toString("base64"); }; app.get('/gettoken/:userid', function(req, res){ if (!auth) { set_app_vars(); } var res_handler = function(error, response, res_body) { var body = {}; if (!error && response.statusCode == 200) { body = {"userid": req.params.userid, "token": response.headers['x-auth-token'], "url": response.headers['x-storage-url']}; cache[req.params.userid] = body; } else { body = {"token": error, "url": ""}; }; res.render('results', {"body": body}); }; var req_options = { url: auth.auth_uri + '/' + req.params.userid, headers: {'accept': 'application/json', 'Authorization': auth.secret}, timeout: 100000, method: 'GET' }; request(req_options, res_handler); });
    

    En el código anterior, la función set_app_vars toma los valores de la variable VCAP_SERVICES y encuentra las configuraciones de objectstorage para la instancia del servicio.También obtiene el auth_uri, id de usuario y contraseña y, luego, crea una cadena de caracteres base64 basada en el protocolo de autenticación básica y la guarda para utilizarla más adelante.

    La llamada app.get('/gettoken/:userid') configura un manejador de solicitudes para que todas las solicitudes GET dirigidas a /gettoken/:userid sean manejadas por este bloque de código. En este bloque de código, defina un manejador de respuestas y opción de solicitud para obtener un token de acceso para un punto final proporcionado por IBM Cloud Object Storage. Una vez que se envía la solicitud, el manejador de respuestas verifica el código de estado de respuesta, crea una variable body y la transmite para que sea representada como una página de HTML, según la definición establecida en el archivo results.jade.

    Observe también que la aplicación envía el token recibido a la memoria caché temporalmente para utilizarlo más adelante. Si está desarrollando una aplicación del mundo real con este servicio, debe enviar el token a la memoria caché para que no necesite enviarle una solicitud al servicio para obtener un token de acceso cada vez.

  4. Despliegue nuevamente la aplicación con el comando cf push.
  5. Acceda al mismo URL utilizado anteriormente. Debería ver algo similar a lo siguiente.El token se codificó nuevamente por razones de seguridad.

    alt

  6. La respuesta muestra un token y un URL. El token y el URL es la información que su aplicación debe mantener para crear carpetas (contenedores) y documentos (objetos) en un servicio de almacenamiento de objetos en la nube.

  7. Cuando se envía la solicitud GET por primera vez a un usuario específico, esta solicitud podría devolver un código de estado 202. Esto debido a que el primer acceso al almacenamiento de objetos causará que el almacenamiento de objetos le suministre una cuenta nueva a ese usuario, lo que puede tardar entre cinco a diez minutos. Si su solicitud no obtiene el token, puede esperar algunos minutos e intentar la misma solicitud nuevamente. Eventualmente, obtendrá un código de estado 200 por la solicitud y el token de acceso, además, un URL en el encabezado de respuesta. Con estas dos informaciones, estará listo para explorar Object Storage con la API de OpenStack Swift. Si no tiene familiaridad con la API, puede aprender más en http://docs.openstack.org/api/openstack-object-storage/1.0/content/.

Paso 5. Crear una carpeta para un usuario con la API de OpenStack Swift

  1. En los pasos anteriores, recuperó con éxito un token de acceso para el usuario tong. Ahora, es momento de crearle una carpeta a tong. La API definida por OpenStack Swift para crear una carpeta es una solicitud PUT con el token de acceso en el encabezado de la solicitud. El punto final es simplemente el URL de almacenamiento, que usted recibió al obtener el token de acceso. Así que para crear una carpeta, simplemente utilice el token de acceso y el URL de almacenamiento, recibidos anteriormente, para enviar una solicitud PUT.

    app.get('/createfolder/:userid/:foldername', function(req, res){ var user_info = cache[req.params.userid]; var res_handler = function(error, response, body) { if (!error && (response.statusCode == 201 || response.statusCode == 204)) { res.render('results', {'body': {result: 'Succeeded!'}}); } else { res.render('results', {'body': {result: 'Failed!'}}); } }; var req_options = { url: user_info['url'] + "/" + req.params.foldername, headers: {'accept': 'application/json', 'X-Auth-Token': user_info['token']}, timeout: 100000, method: 'PUT' }; request(req_options, res_handler); });
    
  2. El código anterior define un manejador para las solicitudes dirigidas al punto final /createfolder/:userid/:foldername. En su aplicación, puede definir el URL de la manera que desee, pero debe tener una forma de obtener el nombre de la carpeta y el id de usuario. Por ejemplo, puede utilizar el seguimiento de sesión para el id de usuario. O puede utilizar un post de formulario para obtener el nombre de la carpeta. Hay muchas opciones disponibles. En esta aplicación, simplemente utilice un parámetro en la ruta de la solicitud. Una vez que se recibe una solicitud, esta encuentra la información de usuario en la memoria caché, define el manejador de respuestas y las opciones de solicitud, y envía la solicitud.
  3. Añada el código anterior al archivo app.js y despliegue la aplicación nuevamente. Al desplegar nuevamente la aplicación, se pierde el token de usuario guardado en la memoria caché, así que debe obtener el token de nuevo con la solicitud /gettoken/:userid. Le mostramos los dos URL para la prueba.

  4. Si todo sale bien, usted verá algo como esto:

    results succeded message

Paso 6. Subir un documento para un usuario con la API de OpenStack Swift

En los pasos anteriores, añadió funciones para obtener un token de acceso y crear una carpeta con éxito. En esta sección, añada algunas líneas más de código para subir un documento a la carpeta ya creada y denominada newfolder. La API de carga de objetos de OpenStack Swift también es una solicitud PUT en el punto final, formada por el URL de almacenamiento y el nombre de la carpeta. Se debe incluir el token de acceso en el encabezado de la solicitud.

Este es el código para subir un documento:

app.get('/createdoc/:userid/:foldername/:docname', function(req, res){ var user_info = cache[req.params.userid]; var res_handler = function(error, response, body) { if (!error && response.statusCode == 201) { res.render('results', {'body': {result: 'Succeeded!'}}); } else { res.render('results', {'body': {result: 'Failed!'}}); } }; var req_options = { url: user_info['url'] + "/" + req.params.foldername + "/" + req.params.docname, headers: {'accept': 'application/json', 'X-Auth-Token': user_info['token']}, timeout: 100000, body: "Some random data", method: 'PUT' }; request(req_options, res_handler); });

El código arriba sigue el mismo patrón de los bloques de código anteriores. Primero, obtiene el token de acceso guardado en la memoria caché para el id de usuario en la solicitud de URL, luego, define el manejador de respuestas y las opciones de solicitud y envía la solicitud. La única diferencia es que añadimos una cadena de caracteres "Some random data" como el contenido del objeto que se está subiendo.

En su aplicación, puede proporcionar una variedad de formas para que los usuarios suban documentos. Dado que no es el objetivo de este tutorial, codificamos datos de muestra para el contenido del documento. Esto hace que el código sea sencillo y directo para fines demostrativos, pero claro, si la aplicación se utiliza tal como está, todos los documentos tendrían el mismo contenido.

Conclusión

En este tutorial, demostramos cómo crear una aplicación de Node.js sencilla que utiliza el servicio Object Storage para IBM Cloud. La aplicación muestra cómo obtener tokens de acceso para un usuario, crear una carpeta y subir un documento. En el código de la aplicación, usted también puede encontrar bloques de código para manejar solicitudes como listar carpetas de un usuario, listar documentos en una carpeta, borrar un documento, etc. Al utilizar lo que aprendió en este tutorial, podrá desarrollar rápida y fácilmente excelentes aplicaciones con Object Storage.