SlideShare uma empresa Scribd logo
1 de 196
To Cloud or not Cloud, That is the Question! 22 Noviembre de 2010, 9:00-14:00 BizkaiaEnpresaDigitala, Parque Tecnológico de Zamudio. Edificio ESI, #204 Dr. Diego Lz. de Ipiña Glz. de Artazadipina@deusto.eshttp://paginaspersonales.deusto.es/dipinahttp://www.slideshare.net/dipina
Agenda Introducción a Cloud Computing (30’) Concepto y campos relacionados Diferentes manifestaciones (SaaS, PaaS e IaaS) Ejemplos de servicios, infraestructura y aplicaciones en la nube Ejemplo de IaaS: Amazon Web Services (AWS) (90’ + 60’) Introducción Amazon Elastic Cloud (EC2) Amazon Simple Storage Service (S3) y CloudFront Amazon Simple DB y RDS Desarrollo de una aplicación de ejemplo sobre AWS
Agenda Ejemplo de PaaS: Google AppEngine (60’ + 90’) Introducción DataStore API y GQL Memcache y Cron Versiones Python y Java de Google AppEngine Desarrollo de una aplicación de ejemplo sobre GoogleApp Conclusiones (30’) Comparativa AWS, Google AppEngine y Azure Patrones de diseño Cuándo y cómo adoptaré Cloud Computing en mi empresa Ejemplos en: http://dl.dropbox.com/u/2763621/CursoCloudComputingUDEUSTO/CloudComputing_examples.zip
Misión de la Future Internet (FI) Ofrecer a todos los usuarios un entorno seguro, eficiente, confiable y robusto, que:  Permita un acceso abierto, dinámico y descentralizado a la red y a su información y Sea escalable, flexible y adapte su rendimiento a las necesidades de los usuarios y su contexto
Arquitectura de la Internet del Futuro
Internet de los Servicios Una multitud de servicios IT conectados, que son ofrecidos, comprados, vendidos, utilizados, adaptados y compuestos por una red universal de proveedores, consumidores y agregadores de servicios o brokers - resultando en - una nueva manera de ofrecer, utilizar, y organizar funcionalidad soportada por IT Adapted from SAP Research, 2008, and SEEKDA, 2008
Campos de Actuación de la Internet de los Servicios Cloud computing: virtualización de servicios y optimización de recursos tanto en capacidad de procesamiento como almacenamiento Open serviceplatforms: modularidad de servicios para facilitar su integración por usuarios finales Autonomiccomputing: sistemas autogestionados Green IT: optimización del consumo energético
El Futuro del Desarrollo Software
Infraestructura Virtualizada:Cloud Computing 	Un paradigma de computación emergente donde los datos y servicios residen en centros de datos muy escalables que pueden ser accedidos ubicuamente desde cualquier dispositivo conectado a Internet1 Merrill Lynch:  Cloud computing market opportunity by 2011 = $95bn in business and productivity apps + $65bn in online advertising =  $160bn (1) Source: IBM
Cloud Computing es … … capacidad computacional y almacenamiento virtualizadaexpuesta mediante infraestructura agnóstica a la plataforma y accedida por Internet  Recursos IT compartidos en demanda, creados y eliminados eficientemente y de modo escalable a través de una variedad de interfaces programáticos facturados en base a su uso
Forrester Research “A pool of abstracted, highly scalable, and managed compute infrastructure capable of hosting end-customer applications and billed by consumption1” 1- “Is Cloud Computing Ready for The Enterprise?” Forrester Research, Inc.
The “Cloud” = 10X Improvement ,[object Object],Escalable: controla tu infraestructura con tu aplicación Riesgo: nada que comprar, cancela inmediatamente Robustez: basado en gran hardware empresarial Coste: paga sólo por lo que uses
Evolución hacia Cloud Computing La coexistencia y limitaciones de clustercomputing y supercomputing dieron lugar a gridcomputing De gridcomputing progresamos hacia utilitycomputing, i.e. Servicios computacionales empaquetados como agua, electricidad, etc. Esto derivó en Cloud Computing, es decir, todo como servicio (XaaS) : ,[object Object]
Software como Servicio
Infraestructura como Servicio,[object Object]
Múltiples Descripciones Gráficas de la “Cloud”
Arquitectura Cloud Computing
Características de Cloud Tipos de despliegue Manifestaciones  Cloud privada Propiedad de o alquilada por una empresa (centros de datos,…) Cloud comunitaria Infraestructura compartida por una comunidad específica Cloud pública Vendida al público, gran escala (ec2, S3,…) Cloud híbrida Composición de dos o más clouds Cloud Software as a Service (SaaS)  Uso de la aplicación del proveedor sobre la red, e.j., Salesforce.com,… Cloud Platform as a Service (PaaS)  Despliega aplicaciones creadas por los clientes a la nube, e.j. Google AppEngine, Microsoft Azure, …  Cloud Infrastructure as a Service (IaaS) Alquilar procesamiento, almacenamiento, capacidad de red y otros recursos computacionales e.j., EC2 – Elastic Compute Cloud, S3 – Simple Storage Service, Simple DB,…
Diferentes Manifestaciones
Cloud Computing vs. Centros de Datos Tradicionales
Componentes de Cloud Computing
Taxonomía de Cloud Computing
Evolución de Tecnologías de Cloud Computing Maduración de tecnología de virtualización La virtualización permite nubes de computación Las nubes de computación demandan nubes de almacenamiento Las nubes de almacenamiento y computación crean infraestructura cloud La infraestructura cloud da lugar a plataformas y aplicaciones cloud Diferentes tipos de cloud dan lugar a Cloud Aggregators Nichos de requisitos dan lugar a Cloud Extenders
Aplicaciones Cloud Corresponden con lo que se denomina como SaaS Manifestación de cloud más popular Ejemplos: SalesForce, Gmail, Yahoo! Mail, rememberthemilk, doodle, Google Docs, DropBox, picnik, Panda Cloud Antivirus, scribd, slideshare Ventajas: Libre, Fácil, Adopción de consumo Desventajas: funcionalidad limitada, no hay control de acceso a la tecnología subyacente
Plataformas Cloud Contenedores de aplicaciones Entornos cerrados Ejemplos: Google AppEngine, Microsoft Azure, Heroku, Mosso, Engine Yard, Joyent o Force.com Ventajas: buenas para desarrolladores, más control que en las aplicaciones cloud, configuradas estrechamente Desventajas: restringidas a lo que está disponible, otras dependencias, dependencia tecnológica
Infraestructura Cloud Proveen nubes de computación y almacenamiento Ofrecen capas de virtualización (hardware/software) Ejemplos: Amazon EC2, GoGrid, Amazon S3, Nirvanix, Linode, Arsys Cloud Flexible, EyeOS Ventajas: control completo del entorno y la infraestructura Desventajas: precio premium, competencia limitada
Extensores de la Cloud Proveen extensiones a infraestructura y plataformas cloud con funcionalidad básica Ejemplos: Amazon SimpleDB, Amazon SQS, Google BigTable Ventajas: extienden la funcionalidad de las nubes de computación y almacenamiento para integrar sistemas heredados u otras cloud Desventajas: a veces requieren el uso de plataformas o infraestructura específica
Agregadores Cloud Se apoyan en varias infraestructuras cloud para su gestión Ejemplos: RightScale, Appistry Ventajas: proveen más opciones para entornos cloud Desventajas: dependientes de proveedores de cloud
¿Qué framework o plataforma usar para mis aplicaciones Cloud?
Amazon Web Services (AWS) AWS proporciona una infraestructura de servicios elástica donde alojar computación, almacenamiento o sistemas empresariales Amazon Elastic Cloud (EC2) – permite configurar y ejecutar un Amazon Machine Instance (AMI) – servidores en demanda Amazon Simple Storage Service (S3) – permite guardar y recuperar datos en la nube Amazon SimpleDB– proporciona la funcionalidad de una base de datos sobre S3 – basada en pares clave-valor Amazon Simple Queue Service (SQS) – servicio de mensajería para encolar tareas y mensajes Amazon RelationalDatabase Service (RDS) – servicio web para crear, operar y escalar una base de datos en la nube Amazon CloudFront– copias de tus objetos más populares son cacheados en una red de nodos alrededor del mundo … Documentación: http://aws.amazon.com/documentation/
Amazon Web Services (AWS)
Amazon Web Services (AWS)
Amazon Elastic Compute Cloud: EC2 Permite ejecutar varios servidores Linux o Windows virtuales en demanda, facilitando tantos ordenadores como necesites para procesar tus datos o ejecutar una aplicación Otorga acceso root al sistema operativo de cada servidor, un cortafuegos para gestionar el acceso a la red y la libertad para instalar cualquier software Una vez configurado un servidor adecuadamente, se guarda como Amazon Machine Image (AMI) que puede ser lanzada para crear máquinas virtuales en demanda  La EC2 API (Query o SOAP) ofrece funcionalidad para empezar y parar instancias de servidor, aplicar permisos de acceso y red o gestionar tus imágenes de servidor.  Cada servidor individual se gestiona usando herramientas Linux o Windows sobre una sesión de shell segura. Se factura en función de los recursos consumidos : CPU y datos transferidos Más información en: http://aws.amazon.com/products/ec2
Conceptos EC2 AMI (Amazon Machine Instance) Basadas en XEN Instancia: AMI en ejecución Es necesario crear instancias EBS si queremos pararlas y reiniciarlas Dos IPs: IP pública e IP elástica Volúmenes EBS (Elastic Block Storage): almacenamiento para las instancias Conceptos de credenciales: Access Key ID y Secret Access Key X.509 certificate  y clave privada (SOAP y EC2 Tools) IP Elástica – asociada a tu cuenta no una instancia, te permite controlar a qué instancia o instancias apunta (útil por robustez). Conceptos y herramientas para usar EC2 en:  http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html
EC2: Regiones y Zonas de Disponibilidad Las instancias en EC2 se pueden colocar en diferentes localizaciones: Las regiones están dispersas geográficamente (ver tabla debajo) Las zonas de disponibilidad son localizaciones diferentes dentro de una Región que están aisladas de fallos en otras zonas y facilitan conectividad de red económica, de baja latencia a otras zonas de disponibilidad dentro de la Región
CloudWatch Amazon CloudWatches un servicio que proporciona monitorización para recursos gestionados por AWS Muestra utilización de recursos como CPU, lecturas y escrituras de disco o tráfico de red http://aws.amazon.com/cloudwatch/ http://awsdocs.s3.amazonaws.com/AmazonCloudWatch/latest/acw-dg.pdf http://awsdocs.s3.amazonaws.com/AmazonCloudWatch/latest/acw-qrc.pdf Elastic Load Balancingdistribuye automáticamente el tráfico de aplicación entrante entre varias instancias EC2 http://aws.amazon.com/elasticloadbalancing/ http://awsdocs.s3.amazonaws.com/ElasticLoadBalancing/latest/elb-dg.pdf http://awsdocs.s3.amazonaws.com/ElasticLoadBalancing/latest/elb-qrc.pdf Auto Scalingpermite escalar automáticamente hacia arriba o abajo tu capacidad EC2 en función de triggers que defines http://aws.amazon.com/autoscaling/ http://awsdocs.s3.amazonaws.com/AutoScaling/latest/as-qrc.pdf
CloudWatch en Funcionamiento
CloudWatch en Funcionamiento
Elastic Load Balancing en Funcionamiento
Autoscaling en Funcionamiento
Amazon Simple Storage Service: S3 Ofrece espacio de almacenamiento seguro para cualquier tipo de datos en los data centers de Amazon Es una alternativa a construir, mantener y utilizar tus propios sistemas de almacenamiento  No tiene límites sobre cuánta información, por cuánto tiempo y con qué ancho de banda puede transferirse.  Ofrece una simple API agnóstica a la información a guardar Depende de ti qué datos y qué representación interna tienen El modelo de datos interno consta de dos tipos de recursos de almacenamiento: Objects: guardan datos y metadatos Buckets: contenedores que pueden contener infinidad de objetos Incorpora mecanismos de control de acceso (ACL) que pueden aplicarse a objetos y buckets
Amazon Simple Storage Service: S3 Los recursos en S3 se identifican mediante URIs: http://<s3-repository>.amazonaws.com/<bucket-name>/<folder-name>/<s3object-name> Ejemplo: https://s3-eu-west-1.amazonaws.com/misimages/oct2010/image1.png Algunas características de su arquitectura son: Los objetos S3 no pueden ser manipulados como ficheros estándar Los cambios sobre ellos tardan en propagarse Las peticiones a objetos pueden fallar ocasionalmente Permite guardar versiones Se deben resolver las direcciones IP de los nombres DNS de S3 periódicamente  Se pueden guardar infinitos objetos de hasta 5GB en tamaño	 Se paga por almacenamiento, transferencia y operaciones Algunos posibles usos de S3: Compartir grandes ficheros Como repositorio de back-up de tus ficheros Sistema de ficheros mapeado sobre S3 (ElasticDrive) Más información en:  http://aws.amazon.com/s3/,
Amazon CloudFront Mientras que en Amazon S3 se guardan contenidos (ficheros) con CloudFront se garantiza que tus objetos en S3 buckets son servidos rápidamente.  Lo hace copiando los ficheros en buckets S3 a diferentes edgelocationsque sirven contenidos a los usuarios finales. Tales edgelocationsse distribuyen por el planeta asegurándose que los contenidos son servidos del servidor Amazon más cercano Es ventajoso porque el 80-90% del tiempo invertido esperando a una respuesta web se debe a la descarga de los componentes de la página: imágenes, hojas de estilo, scripts, Flash, etc.  La clave es colocar la parte estática de nuestra web en una red de distribución de contenidos como Akamai.  Con CloudFront hay que pagar las transferencias desde S3 a las localizaciones de los bordes.  Más información en: http://aws.amazon.com/cloudfront/
¿Cómo usar CloudFront? Las redes de distribución de contenidos tienen servidores distribuidos por Internet y determinan la ruta más rápida y corta entre el servidor que aloja el contenido y el usuario final Los 4 sencillos pasos que hay que seguir para utilizar CloudFront han sido extraídos del artículo: http://www.labnol.org/internet/setup-content-delivery-network-with-amazon-s3-cloudfront/5446 Get the S3 Fox add-on for Firefox and log-in to your Amazon S3 account. Now right-click your S3 bucket and select "Manage Distributions.“ Next we’ll associate a CNAME (some easy to remember sub-domain name) with our S3 bucket so it become easy to link to the files from our web pages. In this example, I use the web address "cache.labnol.org" and then click Create Distribution. The status will change from "In Progress" to "Deployed". Now copy the resource URL to the clipboard which is of the format xyz.cloudfront.net Log in to your account on your web hosting service’s website, and go to the DNS management page. Create a new CNAME record as shown in the screenshot.
Amazon SimpleDB Almacén de claves/valor: trabaja con los conceptos domain, item y attribute Diseñado para minimizar la complejidad y el coste de mantenimiento de tus datos  Guarda pequeñas piezas de información textual en una estructura de base de datos sencilla simple de gestionar, modificar y buscar Ofrece su propio lenguaje de consultas de datos Ejemplos de consultas sencillas: ['Date' > '2007-07-01' and Not 'Date' starts-with '2007-07-04'] ['Suburb' = 'Newtown'] or['Price' < '100000'] intersection ['Bedrooms' = '3']  Si tus aplicaciones están basadas en bases de datos simples, este servicio puede reemplazar a tu RDBMS dejándote con una pieza de infraestructura menos que comprar y mantener No exige la especificación de un schema previo, tú puedes modificar la estructura y contenidos de tu base de datos cuando quieras Indexa cada pieza almacenada Guarda tu información de modo seguro, y redundante en la red de data centers de Amazon Pagas por almacenamiento, datos transferidos y operaciones Más información en: http://aws.amazon.com/simpledb/
Amazon SimpleDB Ofrece tres recursos principales: Dominios: nombre de un contenedor con información relacionada (similar a base de datos) Solamente se procesan consultas dentro de un dominio Elementos: es una colección con nombre de los atributos que representan un objeto de datos Atributos: es una categoría individual de información guardada dentro de un elemento. Identificado por un nombre contiene una colección de valores de tipo string, obligatorio que tenga al menos un valor.  Es una base de datos sencilla, no un RDBMS: Los elementos se guardan en una estructura jerárquica, no una tabla Todos los datos se guardan como texto Capacidades de consulta limitadas La consistencia de la información depende de retardos de propagación Los valores de atributos pueden ser colecciones y alcanzar hasta 1024 bytes SimpleDB está concebido para usarse en conjunción con S3
Amazon SimpleDB
ExampleDataSet con SimpleDB
Ejemplos de Consultas
Amazon RelationalDatabase Service (Amazon RDS) Es un servicio web que facilita la instalación, operación y escalabilidad de una base de datos relacional en la nube Te da completo acceso a las capacidades de una base de datos MySQL Las aplicaciones que ya funcionan con MySQL también lo harán con Amazon RDS Amazon RDS modifica el software MySQL para programar la creación de back-ups o garantizar la escalabilidad, todo ello controlado a través de una API sencilla. Solamente se paga por los recursos utilizados.  Más información en: http://aws.amazon.com/rds Herramienta: Amazon RDS Command Line Toolkit http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2928&categoryID=294 Tutorial en: http://docs.amazonwebservices.com/AmazonRDS/latest/GettingStartedGuide/
Amazon SQS Implementa el servicio de mensajería basado en colas Los mensajes son siempre strings Útil para crear trabajos asíncronos y descargar de actividad a un web server Se paga por mensajes y datos transferidos Más información en: http://aws.amazon.com/sqs
Registro y Documentación Se puede ver en detalle cómo acceder a AWS:  http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services?src=related_normal&rel=3462501 http://docs.amazonwebservices.com/AWSEC2/2009-11-30/GettingStartedGuide/ http://aws.amazon.com/free/ (Free usagetier)
AWS Free UserTier La condiciones de uso son las siguientes: AWS Free Usage Tier (Per Month): 750 hours of Amazon EC2 Linux Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough hours to run continuously each month* 750 hours of an Elastic Load Balancer plus 15 GB data processing* 10 GB of Amazon Elastic Block Storage, plus 1 million I/Os, 1 GB of snapshot storage, 10,000 snapshot Get Requests and 1,000 snapshot Put Requests* 5 GB of Amazon S3 storage, 20,000 Get Requests, and 2,000 Put Requests* 30 GB per of internet data transfer (15 GB of data transfer “in” and 15 GB of data transfer “out” across all services except Amazon CloudFront)* 25 Amazon SimpleDB Machine Hours and 1 GB of Storage** 100,000 Requests of Amazon Simple Queue Service** 100,000 Requests, 100,000 HTTP notifications and 1,000 email notifications for Amazon Simple Notification Service** In addition to these services, the AWS Management Console is available at no charge to help you build and manage your application on AWS.
Proceso para usar AWS EC2 Vamos a seguir el siguiente workflow para aprender a usar EC2, crear instancias y conectarnos a ellas, tanto desde Windows como UNIX.
Fase 1: Registro en AWS Para utilizar Amazon EC2, necesitasunacuenta Amazon AWS Ir a http://aws.amazon.com/ec2 y hacer click en Sign Up for Amazon EC2. Seguir las instrucciones de pantalla Pasarás a estar suscrito también a Amazon Simple Storage and Amazon Virtual Private Cloud Recibirás una llamada donde introducir el PIN que te asignan vía web
Fase 1: Registro en AWS
Fase 1: Registro en AWS
Fase 1: Registro en AWS
Fase 1: Registro en AWS
Fase 1: Registro en AWS
Fase 1: Obteniendo los Identificadores de Acceso Vete a http://aws.amazon.com/account/, logueate, haz click en Security Credentials y recupera: Access Key ID y Access Key, pestaña Access Keys Accountnumber se ve en la parte derecha, superior de la página de Security Credentials X.509 Private Key File (pestaña X.509 Certificates) X.509 CertificateFile (pestaña KeyPairs) Los siguientes pantallazos muestran cómo obtener estos datos  Guárdalos en ficheros para luego usarlos en tus aplicaciones
Fase 1: Obteniendo los Identificadores de Acceso
Fase 1: Obteniendo los Identificadores de Acceso
Fase 1: Registrarse para EC2 y S3 Acceder a la consola de administración de AWS en: http://aws.amazon.com/console Logearse o  Registrarse Durante el registro se solicitan los datos de cargo bancario Recibirás un email de confirmación tanto para EC2 como S3 Alternativamente puedes registrarte individualmente en los diferentes productos yendo al enlace Products y seleccionando el servicio concreto en: http://aws.amazon.com/account/
Fase 1: Registrarse para EC2 y S3
Fase 1: Registrarse para EC2 y S3
Fase 2: Lanzar una Instancia de EC2 Iniciar el “dashboard”, panel de control de AWS Console y realizar los siguientes pasos: https://console.aws.amazon.com Pulsar el botón de nueva instancia Seleccionar una instancia concreta Fedora LAMP Web Server para ejemplo completo Instancia AMI de Windows básica Instancia AMI de UNIX básica Generar o reutilizar un par de claves Guardar las claves Configurar el firewall Revisar los detalles de la instancia desplegada Lanzar la instancia y comprobar que está en ejecución
Paso 2.1: Lanzar una Nueva Instancia
Paso 2.2: Seleccionar la instancia
Paso 2.3: Configurar la Instancia
Paso 2.4: Asignar Par de Claves
Paso 2.5: Configurar el Firewall
Paso 2.6: Revisar los Detalles de la Instancia Configurada
Paso 2.7: Lanzar la Instancia y Operar sobre Ella
Detalles de la Instancia Creada
Fase 2: Lanzando Otras Instancias Vamos a lanzar otra instancia en Windows y otra en UNIX con soporte EBS: Accede a AWS Management Console: http://aws.amazon.com/console/ y regístrate Desde EC2 ConsoleDashboard, haz click en LaunchInstance Elige un AMI, vamos a trabajar bien con Fedora 8 Core o Microsoft Windows Server 2008 Selecciona y acepta los detalles de la instancia Crea un par de claves, que es un credencial utilizado para conectarse a una instancia Crea un grupo de seguridad que define reglas de firewall para tu instancia Revisa tus configuraciones y pulsa el botón Launch
Fase 3: Accediendo a la instancia vía web (Servidor LAMP Fedora)
Fase 3: Modificando la Página por Defecto Pasos a seguir en cliente UNIX: Logeo en el servidor remoto: ssh -i <instancia> root@public_dns ssh –i ami-f04f6484 root@ec2-79-125-61-32.eu-west-1.compute.amazonaws.com Vamos al directorio htdocs cd /home/webuser/helloworld/htdocs Modificamos la página index.php (ver contenido siguiente trasparencia)
Fase 3: Ejemplo de contenido para index.php <html> 	<head> 		<title>Nuestro propio Servidor Web</title> 		<meta http-equiv="Content-Type" content="text/html; charset-ISO-8859-1"> 	</head> 	<body> 		<Nuestro propio Servidor Web ejecut&aacute;ndose en AWS</h1> 		<p>Unademostraci&oacute;n del curso To Cloud or not To Cloud. That is the question! en EnpresaDigitala.</p> 		<p>Ejemplo adaptado de  			<a href="http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services"> 				http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services 			</a> 		</p> 	</body> </html>
Fase 3: Herramientas para Conectarse a Instancia UNIX desde Windows Software necesario (cygwin también valdría): Putty – Putty es un terminal cliente de SSH, descargable de: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuttyGen – programa que convierte la clave privada de Amazon al formato PPK usado por putty Se descarga de la misma página que putty WinSCP – cliente de SFTP y SSH para Windows que permite la transferencia segura de ficheros entre ordenadores. Soporta los protocols SSH, FTP y SCP.  Se descarga desde: http://sourceforge.net/projects/winscp/ Tutorial detallado en:  http://it.toolbox.com/blogs/managing-infosec/connecting-to-amazon-aws-from-windows-to-a-linux-ami-30656  
Fase 3: Conectándose a UNIX AMI desde Windows – Conversión de Clave para putty Cargar el fichero LAMPServerFedora.pem y pulsar en SavePrivate Key que guardará un fichero con extensión ppk que usa putty
Fase 3: Conectándose a UNIX AMI desde Windows – Logeo en Windows con putty Arrancar putty Introducir el nombre público DNS del servidor (ec2-79-125-61-32.eu-west-1.compute.amazonaws.com) Ir a al menú ssh->Auth->Browse y cargar clave privada LAMPServerFedora.ppk Loguéate como root
Fase 3: Accediendo a ficheros en UNIX AMI desde Windows – Edición de index.php con WinSCP
Página Final en Instancia EC2
Fase 3: Conectándose a una Instancia de Windows Obteniendo la contraseña Haz click con el botón derecho del ratón sobre la instancia Windows y selecciona “Get Windows Password” Aparece el diálogo Retrieve Default Windows AdministratorPassword, pega ahí la privatekey obtenida antes, parte del fichero de claves entre BEGIN RSA PRIVATE KEY y END RSA PRIVATE KEY Selecciona descrifrar clave Conectarse a la instancia usando Remote Desktop Connection Start AllPrograms  Accessories Introduce el nombre DNS de la instancia Logéate como Administrator/<password-recuperada>
Fase 4: Terminar Instancia No es lo mismo “parar” (stop) que “terminar” (terminate) en AWS Cuando terminas una instancia no la puedes reiniciar, ¡dejas de pagar! Sólo la puedes parar si tiene un EBS asociado Para terminar una instancia en la AWS Console, haz click con el botón derecho del ratón y selecciona terminate
Probando S3
Probando SimpleDB ScratchpadforSimpleDB es una aplicación web que permite usar Amazon SimpleDB sin necesidad de realizar programación http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1137 Te permite: Crear dominios  Poblarlos con datos Consultarlos Modificarlos Borrar el dominio
Probando SimpleDB
Probando RDS Para utilizarlo hay que seguir los siguientes pasos: Ir a http://aws.amazon.com/rds y registrarte con Amazon RDS Lanzar la instancia y rellenar los datos de tamaño, tipo de base de datos, nombre y clave de usuario Asignar accesos a la instancia de la base de datos, se utiliza CIDR (Classless Inter-DomainRouting) para indicar sólo una dirección IP o un conjunto de direcciones desde las que se permite la conexión Acceso total: 0.0.0.0/0 Conectarse a la instancia usando la herramienta mysql, en la descripción de la instancia en AWS Console aparecerá el string de conexión mysql -h <nombre-host-amazon-rds> -u <username> -p Terminar la instancia para que dejen de facturarnos por su uso
Probando SQS El Simple Queue Service (SQS) puede probarse con una sencilla herramienta: JavaScriptScratchpadfor Amazon SQS http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1254&categoryID=122
Probando CloudFront Ejemplo de uso desde consola de administración de Amazon
Desregistro de un Servicio Para cancelar un servicio: Firma en AWS Haz click en YourAccount y luego en AccountActivity. Selecciona View/Edit Service debajo del servicio que quieres cancelar Haz click en el enlace cancel thisservice.
Calculadora de Costes en Amazon La siguiente herramienta te permite estimar costes de consumo de servicios en Amazon:  http://calculator.s3.amazonaws.com/calc5.html Además, desde la página http://aws.amazon.com/account, se puede acceder al menú “AccountActivity” que ilustra el gasto actual incurrido.
APIs web: SOAP vs. REST SOAP: Simple Object Access Protocol ,[object Object]
Deriva de un protocolo creado por David Winer en 1998, llamado XML-RPC.
Fue creado por Microsoft, IBM, y otros y actualmente se encuentra bajo el auspicio de la W3C.
Su arquitectura consiste en varias capas de especificaciones para formato de mensajes:
Message Exchange Patterns (MEP)
Protocolos de transporte (SMTP y HTTP/S)
Modelos de procesado de mensajes
Protocolo de extensibilidad
WS-*REST: RepresantionalState Transfer ,[object Object]
Introducido en la tésis doctoral de Roy Fielding en el año 2000.
Se refiere a una colección de principios de arquitectura de red, que marcan cómo definir e invocar los recursos.
El término se usa a veces para describir una simple interfaz que transmite datos de un dominio específico por HTTP sin capas adicionales como SOAP o uso de cookies.
Los sistemas que cumplen los principios marcados por Fielding suelen ser referidos como sistemas RESTful.,[object Object]
APIs Disponibles por Servicio AWS
Revisión APIs de los Principales Servicios EC2: http://aws.amazon.com/documentation/ec2/ (mirar quickreferencecard) http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ S3:  http://aws.amazon.com/documentation/s3/ http://docs.amazonwebservices.com/AmazonS3/latest/gsg/index.html?WorkingWithS3.html http://docs.amazonwebservices.com/AmazonS3/2006-03-01/API/ SimpleDB: http://aws.amazon.com/documentation/simpledb/ http://docs.amazonwebservices.com/AmazonSimpleDB/latest/GettingStartedGuide/index.html http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/ SQS Documentation: http://aws.amazon.com/documentation/sqs/ http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/APIReference/ RDS http://aws.amazon.com/documentation/rds http://docs.amazonwebservices.com/AmazonRDS/latest/APIReference/
Invocación de Servicios Web AWS Recetas para el uso de la API SOAP desde Java: Recipe 27.5 Getting Set Up with Amazon's Web Services API http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-5.html#jsvltjspckbk-CHP-27-SECT-5 Recipe 27.6 Creating a JavaBean to Connect with Amazon http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-6.html#jsvltjspckbk-CHP-27-SECT-6 Recipe 27.7 Using a Servlet to Connect with Amazon http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-7.html
AWS SDK for Java Ofrece una API basada en Java para acceder a los servicios de infraestructura de AWS, haciendo sencillo el desarrollo de aplicaciones que usan las características de la nube AWS: eficiente en costes, escalable y robusta Descargar de:  http://aws.amazon.com/sdkforjava, incluye: AWS Java Library Ejemplos de código Soporte para Eclipse Soporta los siguientes servicios: Amazon Elastic Compute Cloud (EC2), Amazon Simple Storage Service (S3), Amazon Virtual Private Cloud, Amazon SimpleDB, Amazon RelationalDatabase Service, Amazon Simple Notification Service, Amazon Simple Queue Service, Amazon ElasticMapReduce, Amazon CloudWatch, Elastic Load Balancing, Auto Scaling  Documentación:  http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3586 http://developer.amazonwebservices.com/connect/entry.jspa?externalID=848&categoryID=152
Usando AWS SDK for Java Se puede obtener documentación detallada en: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/ Antes de empezar, debes registrarte en cada servicio que quieras utilizar. Necesitas obtener tus credenciales de seguridad de: http://aws.amazon.com/security-credentials Previamente puede que tengas que firmar en http://aws.amazon.com/products Los credenciales son un par de claves públicas y privadas que contienen: Access Key ID Secret Access Key Revisar ejemplos en carpeta examples/aws
Herramientas para Usar Amazon ScratchPadforSimpleDB y SQS  http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1137&categoryID=189 http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1254 ElasticDrive – http://www.elasticdrive.com/ ElasticFox – http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609 S3 Fox – plugin para Firefox, http://www.s3fox.net/ Amazon EC2 API Tools Programas de línea de comandos para intermediar con Amazon EC2 Sirven para registrar, lanzar instancias, manipular grupos de seguridad y más http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&categoryID=88
Caso práctico de Álbum de Fotos Álbum de fotos que permite subir fotos, organizarlas y visualizarlas Arquitectura tradicional:
Caso práctico de Álbum de Fotos Solución Cloud con: S3, SDB, SQS y CloudFront Ejemplo descrito en: http://www.slideshare.net/javasymposium/developing-with-amazon-web-services-highly-scalable-services-that-are-someone-elses-headache-to-maintain-and-develop
Caso práctico de Álbum de Fotos
Despliegue de Django en EC2 Seguir los pasos indicados en: http://www.dottostring.com/2009/10/django-deployment-on-amazon-ec2-step-by-step-tutorial/
Soporte para Otros Lenguajes Existe soporte para otros lenguajes como Python, Ruby, PHP o .NET PHP: Tarzan AWS (http://code.google.com/p/tarzan-aws/) http://www.slideshare.net/federicof/cloudify-your-applications-with-amazon-web-services?src=related_normal&rel=3462501 Más información en: http://developer.amazonwebservices.com
Ejemplo Plataforma Cloud: Google App Engine Google AppEngine es una herramienta para el alojamiento de aplicaciones web escalables sobre la infraestructura de Google Su misión es permitir al desarrollador web crear fácilmente aplicaciones web escalables sin ser un experto en sistemas Aporta las siguientes características a los desarrolladores: Limita la responsabilidad del programador al desarrollo y primer despliegue –  Google AppEngine provee recursos computacionales dinámicamente según son necesarios Toma control de los picos de tráfico – si nuestro portal crece en popularidad no es necesario actualizar nuestra infraestructura (servidores, BBDD) Ofrece replicación y balanceo de carga automática apoyado en componentes como Bigtable Fácilmente integrable con otros servicios de Google – los desarrolladores pueden hacer uso de componentes existentes y la librería de APIs de Google (email, autenticación, pagos, etc.)
Google AppEngine:Características Ofrece una plataforma completa para el alojamiento y escalado automático de aplicaciones, consistiendo en: Servidores de aplicaciones Python y Java La base de datos BigTable El sistema de ficheros GFS Como desarrollador simplemente tienes que subir tu código Python o Java compilado a Google, lanzar la aplicación y monitorizar el uso y otras métricas Google AppEngine incluye la librería estándar de Python 2.5 y soporta Java 1.6 No todas las acciones se permiten (acceso a ficheros, llamadas al SO, algunas llamadas de red) Se ejecuta en un entorno restringido para permitir que las aplicaciones escalen Ejemplo:  https://appengine.google.com http://enpresadigitala.appspot.com/encuestas http://code.google.com/intl/en/appengine/docs/
Facturación Google AppEngine ,[object Object]
Página de presupuestado y facturación de recursos: http://code.google.com/intl/es/appengine/docs/billing.html
Detalles sobre las cuotas en: http://code.google.com/intl/es/appengine/docs/quotas.html,[object Object]
Google AppEngine: Python y Java Vamos a revisar primero (brevemente) cómo realizar aplicaciones con Python Luego nos centraremos en cómo hacerlo desde Java en mayor grado de detalle
GAE forPython: Instalación Descargar Google AppEngine SDK para Python de: http://code.google.com/appengine/downloads.html Herramientas de la SDK para Python: dev_appserver.py, el servidor web de desarrollo appcfg.py, sirve para subir tu aplicación a App Engine Herramienta de descarga de datos – esunaherramientasencillaquetepermitesubirdatos en ficheros CSV al almacen de datos de appengine http://code.google.com/intl/es/appengine/docs/python/tools/uploadingdata.html
Principios Una aplicación de AppEngine se comunica con el servidor que la aloja a través de CGI Cuando recibe una petición el servidor lee de la entrada estándar y de las variables de entorno Cuando genera una respuesta escribe a la salida estándar
Mi primera aplicación Crear el directorio helloworld Crea el fichero helloworld.py dentro de él con el siguiente contenido, que corresponde a una respuesta HTTP: print 'Content-Type: text/plain' print '' print 'Hello, world!‘ Crea el fichero de configuración requerido por toda aplicación AppEngine denominado app.yaml, en formato YAML (http://www.yaml.org/): http://code.google.com/appengine/docs/configuringanapp.html application: helloworld version: 1 runtime: python api_version: 1 handlers: - url: /.*   script: helloworld.py Arranca el servidor con el comando:dev_appserver.py helloworld/ ,[object Object],Vete a la siguiente URL para probarlo: http://localhost:8080/
Ejecutando Hola Mundo en Google App Engine
Opciones Avanzadas para GAE forPython Framework webapp que soporta el estándar WSGI  Acceso a datos de usuarios mediante la Users API DataStore API Plantillas en Google AppEngine
Usando el Almacén de Datos de Google AppEngine Guardar datos en una aplicación web escalable puede ser difícil La infraestructura de AppEngine se encarga de la distribución, replicación y balanceo de carga de los datos detrás de una API sencilla que también ofrece un motor de consultas y transacciones App Engine incluye una API de modelado de datos para Python Se asemeja a la API de Django pero utiliza el servidor de datos escalable BigTable por detrás. No esrelacional, todaslasentidades de un mismotipotienenlasmismaspropiedades Unapropiedadpuedeteneruno o variosvalores El siguiente import nos da acceso a la base de datos de Google AppEngine:  fromgoogle.appengine.extimportdb Para más detalles sobre el DataStore API ir a: http://code.google.com/appengine/docs/datastore/
La API del DataStore Incluye una API de modelado de datos y un lenguaje similar a SQL que NO permite JOINs y que se llama GQL, haciendo el desarrollo de aplicaciones escalables basadas en datos muy sencillo. fromgoogle.appengine.extimportdbfromgoogle.appengine.apiimportusersclassPet(db.Model):  name = db.StringProperty(required=True)  type = db.StringProperty(required=True, choices=set(["cat", "dog", "bird"]))  birthdate = db.DateProperty()  weight_in_pounds = db.IntegerProperty()  spayed_or_neutered = db.BooleanProperty()  owner = db.UserProperty()pet = Pet(name="Fluffy",          type="cat",          owner=users.get_current_user())pet.weight_in_pounds = 24pet.put()
GQL Query Language Para limpiar la base de datos creada: dev_appserver.py --clear_datastorehelloworld/ Ejemplo GQL: ifusers.get_current_user(): user_pets = db.GqlQuery("SELECT * FROM Pet WHERE pet.owner = :1“, users.get_current_user()) forpet in user_pets: pet.spayed_or_neutered = True   db.put(user_pets)
Usando plantillas en Google App Engine Empotrar HTML en código es algo lioso y difícil de mantener. Los sistemas de plantillas están diseñados para mantener HTML aparte en otro fichero donde elementos con sintaxis especial indican dónde deberían aparecer los datos de la aplicación Dentro de AppEngine puede utilizarse cualquier motor de plantillas empaquetándolo con el código de tu aplicación, webapp incluye el mecanismo de plantillas de Django, donde se pueden pasar objetos del modelo datos  Para utilizarlo hay que incluir los dos siguientes imports: import os fromgoogle.appengine.ext.webappimporttemplate Además reemplazar las sentenciasself.response.out.write por la sentencia template.render(path, template_values), quetomacomoparámetros de entrada: El camino al fichero de la plantilla Un diccionario de valores Y retorna: El texto a renderizar
Registrando la aplicación
Verificación de tu cuenta
Verificación de tu Cuenta
Registrando la aplicación en appengine.google.com
Registrando la applicación
Subiendo la aplicación Es necesario realizar los siguientes pasos: Editar el fichero app.yaml file y cambiar el valor de la aplicación: de helloworld al nombre de id de aplicación (enpresadigitala) Ejecutar el siguiente comando: appcfg.py updatehelloworld/  Acceder a la aplicación en http://application-id.appspot.com, por ejemplo en http://enpresadigitala.appspot.com/
Subiendo la aplicación
Accediendo a la aplicación
Programando Google App Engine con Django Google AppEngine y Django tienen la habilidad de usar el estándar WSGI para ejecutar aplicaciones Como consecuencia podemos utilizar la pila de Django en Google AppEngine, incluso su parte de middleware Lo único que tenemos que hacer es cambiar los modelos de datos de Django para que usen la DataStore API de Google AppEngine Como ambas APIs son muy similares, tenemos la misma flexibilidad usando la potencia de BigTable, es trivial adaptar un modelo Django a Google AppEngine Además como Google AppEngine ya incluye Django, solamente hay que importar los módulos que utilizarías normalmente Para usar el gestor WSGI tenemos que realizar los siguientes pasos: Importar util de google.appengine.ext.webapp Importar WSGI handler de Django [OPCIONAL] Redirigir los logs a la AdminConsole de Google AppEngine Es conveniente cambiar las siguientes configuraciones en Django: Dejar vacías las variables DATABASE_* de settings.py Deshabilitar el middleware de session y autenticación que hace uso de los modelos Django Más info en: http://code.google.com/appengine/articles/django.html Revisar ejemplo de encuestas programado en Django para AppEngine en: examples/googleappengine/python/djangosolopsiteappengine
Ejemplo Django Compleja sobre AppEngine
AppEngine para Java Crea aplicaciones web a través de tecnologías estándar de Java y las ejecuta en la infraestructura escalable Google Usa JVM Java 6, interfaz de servlets Java y la compatibilidad de interfaces estándar como JDO, JPA, JavaMail y JCache AppEngine utiliza el estándar Java Servlet para aplicaciones web JVM se ejecuta en un entorno seguro de la "zona de pruebas" para aislar tu aplicación por servicio y seguridad.  Una aplicación en GAE sólo pueda realizar acciones que no interfieran con el rendimiento ni con la escalabilidad de otras aplicaciones. 
Funcionalidad de AppEnginefor Java AppEngine proporciona un conjunto de servicios escalables que pueden utilizar las aplicaciones para: Almacenar datos persistentes. En Java, el almacén de datos admite 2 interfaces Java estándar: los objetos de datos Java (JDO) 2.3 y el API de persistencia de Java (JPA) 1.0. Acceder a recursos en la red. A través de la URL Fectch API.  Cachear información. Memcache de AppEngine proporciona un almacenamiento en caché distribuido, transitorio y rápido de los resultados de cálculos y consultas de almacén de datos. La interfaz Java implementa JCache (JSR 107). Enviar email. Da soporte de JavaMail para el envío de correos Procesar imágenes. A través de la Images Java API, permite a las aplicaciones transformar y manipular datos de imágenes en varios formatos. Gestionar usuarios. A través de la Users Java API permite utilizar Cuentas de Google para la autenticación del usuario. Lanzar tareas planificadas o en background. Mediante la TaskQueue Java API y la gestión de tareas por Cron.
Instalación de AppEnginefor Java Descargar el fichero de: http://code.google.com/intl/es/appengine/downloads.html#Google_App_Engine_SDK_for_Java Descomprimir el fichero .zip Crear una variable de entorno APPENGINE_JAVA_SDK que apunte al directorio raíz de instalación de la SDK Incluir el directorio %APPENGINE_JAVA_SDK%inen la variable de entorno PATH
Pasos para crear una Aplicación con Google AppEngine para Java Crear el proyecto de la aplicación Crear la clase servlet Crear el fichero de despliegue de la aplicación: web.xml Crear el archivo appengine-web.xml Ejecutar el proyecto Probar el proyecto: http://localhost:8080/<nombre-aplicación>  Subir la aplicación al dominio appspot.com
Configuración del Entorno Instalar java Descomprimir la distribución de GAE for Java a una carpeta de tu disco duro Modificar la variable de entorno APPENGINE_JAVA_SDK para que apunte a ese directorio Modificar la variable de entorno PATH para que apunte a %APPENGINE_JAVA_SDK%in Descomprimir el fichero downloadspache-ant-1.8.1-bin.zip Modificar la variable de entorno PATH para que apunte a <ANT_DIR>in cdexamplesoogleappengineavauestbook ant
Paso 1: Creando la estructura del proyecto Dos opciones: Usar el plug-in para Eclipse: http://code.google.com/intl/es/appengine/docs/java/tools/eclipse.html Usar la plantilla de proyecto disponible en %APP_ENGINE_HOME%emosew_project_template Las aplicaciones Java de AppEngine utilizan el API Java Servlet para interactuar con el servidor web.  Un servlet HTTP es una clase de aplicación que puede procesar y responder solicitudes web. Esta clase amplía la clase javax.servlet.GenericServlet o a la clase javax.servlet.http.HttpServlet. La estructura del directorio de trabajo será la siguiente: Guestbook/  src/       ...Java sourcecode...       META-INF/          ...otherconfiguration...  war/      ...JSPs, images, data files...      WEB-INF/         ...appconfiguration...  classes/         ...compiledclasses...  lib/         ...JARsforlibraries...
Paso 2: Creando la clase Servlet Crear en el directorio src/guestbook/ un fichero denominado GuestbookServlet.java con el siguiente contenido: packageguestbook;importjava.io.IOException;importjavax.servlet.http.*;publicclassGuestbookServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsIOException {      resp.setContentType("text/plain");      resp.getWriter().println("Hello, world");   }}
Paso 3: Creando el fichero de despliegue – web.xml Cuando el servidor web recibe una solicitud, decide qué clase de servlet ejecutar mediante un archivo de configuración conocido como "descriptor de implementación de la aplicación web".  Este archivo se denomina web.xml y se ubica en el directorio war/WEB-INF/ del directorio que contiene los ficheros de una aplicación web en Java <?xmlversion="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-appxmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <servlet>         <servlet-name>guestbook</servlet-name>         <servlet-class>guestbook.GuestbookServlet</servlet-class>     </servlet>     <servlet-mapping>         <servlet-name>guestbook</servlet-name>         <url-pattern>/guestbook</url-pattern>     </servlet-mapping>     <welcome-file-list>         <welcome-file>index.html</welcome-file>     </welcome-file-list> </web-app>
Paso 4: Crear el fichero de configuración de aplicación GAE: appengine-web.xml AppEngine necesita un archivo de configuración adicional para poder desarrollar y ejecutar la aplicación, denominado appengine-web.xml  Se ubica en WEB-INF/ junto a web.xml.  Incluye la ID registrada de la aplicación, el número de versión de la aplicación y listas de archivos que se deben tratar como archivos estáticos (por ejemplo, imágenes y CSS) y archivos de recursos (por ejemplo, JSP y otros datos de aplicación). El directorio war/WEB-INF/ incluye un archivo denominado appengine-web.xml que contiene lo siguiente: <?xmlversion="1.0" encoding="utf-8"?> <appengine-web-appxmlns="http://appengine.google.com/ns/1.0"> <application>librocitas</application>     <version>1</version> </appengine-web-app>
Paso 5: Ejecución del Proyecto El SDK de AppEngine incluye un servidor web de pruebas para depurar tu aplicación. El servidor simula los servicios y el entorno AppEngine, que incluyen restricciones en la zona de pruebas, el almacén de datos y los servicios. Con el fichero ant ejecuta: antrunserver Puedes detenerlo con Ctrl-C
Paso 6: Subiendo la aplicación Puedes crear y administrar aplicaciones web AppEngine con la consola de administración de AppEngine a través de la siguiente URL: http://appengine.google.com/ Para crear una nueva aplicación, haz clic en el botón "CreateanApplication" (Crear aplicación) Edita el archivo appengine-web.xml y, a continuación, cambia el valor del elemento <application> para que sea la ID registrada de tu aplicación (librocitas). Ejecuta el siguiente comando en línea de comandos para subir la aplicación: $ appcfg update www Vete a: http://librocitas.appspot.com/
El fichero de Ant Apache Ant facilita la administración de tu proyecto desde la línea de comandos o desde otros entornos de desarrollo integrados (IDE) compatibles con Ant. El SDK de Java incluye un conjunto de macros de Ant para realizar tareas de desarrollo de AppEngine, entre las que se incluyen: El inicio del servidor de desarrollo y  La subida de la aplicación a AppEngine Algunos problemas con el build.xml suministrado por new-project-template Fichero adaptado en examples/guestbook/build.xml: Hay que definir variable de entorno APP_ENGINE_SDK para desligar build.xml de su localización en disco Introducir tarea para copiar jars con dependencias
Usando el Servicio de Usuarios Google AppEngine ofrece varios servicios útiles basados en la infraestructura de Google a los que se puede acceder a través de aplicaciones utilizando una serie de bibliotecas incluidas en el kit de desarrollo de software (SDK) Por ejemplo, el servicio de usuarios te permite integrar tu aplicación con cuentas de usuarios de Google packageguestbook;importjava.io.IOException;importjavax.servlet.http.*;importcom.google.appengine.api.users.User;importcom.google.appengine.api.users.UserService;importcom.google.appengine.api.users.UserServiceFactory;publicclassGuestbookServletextendsHttpServlet {    publicvoiddoGet(HttpServletRequestreq, HttpServletResponseresp)              throwsIOException {        UserServiceuserService = UserServiceFactory.getUserService();        Useruser = userService.getCurrentUser();        if (user != null) {            resp.setContentType("text/plain");            resp.getWriter().println("Hello, " + user.getNickname());        } else {            resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));        }    }}
Uso de un JSP Aunque podríamos generar el código HTML para la interfaz de usuario directamente a partir del código Java del servlet, no sería algo fácil de mantener, ya que el código HTML se complica Es más conveniente utilizar un sistema de plantillas, en el que la interfaz de usuario esté diseñada e implementada en archivos independientes con marcadores y lógica para insertar datos proporcionados por la aplicación. Pasos: En el directorio war/, crea un archivo llamado guestbook.jsp con el contenido de la siguiente transparencia Modificar el fichero web.xml para que el welcome-file apunte a guestbook.jsp Acceder a la ruta: http://localhost:8080/guestbook.jsp o http://localhost:8080/ Al cargar una JSP por primera vez, el servidor de desarrollo lo convierte en código fuente Java y, a continuación, compila este código en código de bytes de Java Al subir la aplicación a AppEngine, el SDK compila todas las JSP en código de bytes y únicamente sube el código de bytes.
Uso de un JSP <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="com.google.appengine.api.users.User" %> <%@ page import="com.google.appengine.api.users.UserService" %> <%@ page import="com.google.appengine.api.users.UserServiceFactory" %> <html>    <body><%  UserServiceuserService = UserServiceFactory.getUserService();    Useruser = userService.getCurrentUser();     if (user != null) {%>       <p>Hello, <%= user.getNickname() %>! (You can<a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">signout</a>.)</p><%         } else {%>       <p>Hello!<a href="<%= userService.createLoginURL(request.getRequestURI()) %>">Sign in</a>toincludeyournamewithgreetingsyou post.</p><%         }%>   </body>
Formulario Libro Invitados La aplicación de libro de invitados necesita un formulario web para que el usuario publique un nuevo saludo, así como una forma de procesar ese formulario El código HTML del formulario se inserta en la JSP guestbook.jsp: <form action="/sign" method="post">    <div><textarea name="content" rows="3" cols="60"></textarea></div>    <div><input type="submit" value="Post Greeting" /></div>  </form>  El destino del formulario es una nueva URL, /sign, controlada por una nueva clase de servlet,SignGuestbookServlet que procesa el formulario y redirige a: /guestbook.jsp Es necesario modificar web.xml para crear una nueva entrada para este servlet, con los siguientes datos: <servlet>  <servlet-name>sign</servlet-name>    <servlet-class>guestbook.SignGuestbookServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>sign</servlet-name>    <url-pattern>/sign</url-pattern>  </servlet-mapping>
El Servlet que Procesa una Nueva Entrada en Libro packageguestbook; importjava.io.IOException; importjava.util.logging.Logger; importjavax.servlet.http.*; importcom.google.appengine.api.users.User; importcom.google.appengine.api.users.UserService; importcom.google.appengine.api.users.UserServiceFactory; publicclassSignGuestbookServletextendsHttpServlet { privatestatic final Logger log = Logger.getLogger(SignGuestbookServlet.class.getName()); publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp)				throwsIOException{ UserServiceuserService = UserServiceFactory.getUserService();		 Useruser = userService.getCurrentUser();		 Stringcontent = req.getParameter("content");	 if (content == null) {			 content = "(No greeting)";		     }		 if (user != null) {			       log.info("Greetingpostedbyuser " + user.getNickname() + ": " + content);     } else {			       log.info("Greetingpostedanonymously: " + content);		     }		 resp.sendRedirect("guestbook.jsp");	   } }
Logeo de Información con AppEngine El nuevo servlet utiliza la clase java.util.logging.Logger para escribir mensajes en el registro. Puedes controlar el comportamiento de esta clase a través de un archivo logging.properties y de un conjunto de propiedades del sistema en el archivo appengine-web.xml de la aplicación. Copia el archivo de ejemplo del SDK appengine-java-sdk/config/user/logging.properties en el directorio war/WEB-INF/ de la aplicación  Para modificar el nivel de registro de todas las clases del paquete guestbook, edita el archivo logging.properties y añade una entrada para guestbook.level, como se muestra a continuación: .level = WARNING guestbook.level = INFO A continuación edita el archivo war/WEB-INF/appengine-web.xml de la aplicación como se indica: <appengine-web-appxmlns="http://appengine.google.com/ns/1.0"> ...    <system-properties>      <propertyname="java.util.logging.config.file" value="WEB-INF/logging.properties"/>    </system-properties> </appengine-web-app> Los ficheros de logeo se descargan con la consola de administración o la aplicación  appcfg de AppEngine: https://appengine.google.com/logs
Uso del Almacen de Datos JDO La infraestructura de AppEngine se encarga de todas las tareas de distribución, replicación y balanceo de carga de los datos de un API sencilla, además de ofrecer un potente motor de consulta y transacciones. Ofrece dos API: un API estándar y otra de nivel inferior. AppEnginefor Java permite el uso de dos estándares de API diferentes para el almacén de datos: Objetos de datos Java (JDO) y API de persistencia Java (JPA). Estas interfaces las proporciona DataNucleus Access Platform, una implementación de software libre de varios estándares de persistencia Java, con un adaptador para Google DataStore Utilizaremos la interfaz JDO para la recuperación y la publicación de los mensajes de los usuarios en el almacén de datos de AppEngine. Access Platformnecesita un archivo de configuración que le indique que debe utilizar el almacén de datos de AppEngine como servidor para la implementación de JDO: META-INF/jdoconfig.xml Documentación detallada de JDO puede encontrarse en: http://code.google.com/appengine/docs/java/datastore/
Funcionamiento de JDO Al crear clases JDO, debes utilizar anotaciones Java para describir cómo se deben guardar las instancias en el almacén de datos y cómo se deben volver a crear al recuperarlas de dicho almacén.  Access Platform conecta las clases de datos a la implementación mediante un paso de procesamiento posterior a la compilación, que DataNucleus denomina "mejora" de las clases. JDO permite almacenar objetos Java (a veces denominados "objetos Java antiguos y simples" o POJO) en cualquier almacén de datos con un adaptador compatible con JDO, como DataNucleus Access Platform El complemento Access Platform para el almacén de datos de AppEngine permite almacenar instancias de clases definidas en el almacén de datos de AppEngine Ejemplo: la clase Greeting representará mensajes individuales publicados en el libro de invitados de nuestra aplicación
La Clase de Persistencia Greeting packageguestbook; importjava.util.Date; importjavax.jdo.annotations.IdGeneratorStrategy; importjavax.jdo.annotations.IdentityType; importjavax.jdo.annotations.PersistenceCapable; importjavax.jdo.annotations.Persistent; importjavax.jdo.annotations.PrimaryKey; importcom.google.appengine.api.users.User; @PersistenceCapable(identityType = IdentityType.APPLICATION) publicclassGreeting {     @PrimaryKey   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)     private Long id;     @Persistent privateUserauthor;       @Persistent privateStringcontent;     @Persistent private Date date;     publicGreeting(Userauthor, Stringcontent, Date date) {         this.author = author;         this.content = content;         this.date = date;       }       ... }
La Clase de Persistencia Greeting Esta sencilla clase define tres propiedades para un saludo: author, content y date Estos tres campos privados presentan la anotación @Persistent, que indica a DataNucleus que debe almacenarlos como propiedades de objetos en el almacén de datos de AppEngine. La clase también define un campo llamado id, una clave Long que presenta dos anotaciones: @Persistent y @PrimaryKey.  El almacén de datos de AppEngine tiene una noción de las claves de entidades y puede representar las claves de varias formas en un objeto. Más información sobre cómo definir modelos de datos puede encontrarse en: http://code.google.com/intl/es/appengine/docs/java/datastore/dataclasses.html
Serializando datos con JDO Cada solicitud que utiliza el almacén de datos crea una nueva instancia de la clase PersistenceManager que se obtiene a través de PersistenceManagerFactory Una instancia de PersistenceManagerFactory tarda algún tiempo en inicializarse Afortunadamente, sólo se necesita una instancia para cada aplicación Creamos la clase singletonPMF para resolverlo: packageguestbook; importjavax.jdo.JDOHelper; importjavax.jdo.PersistenceManagerFactory; public final class PMF {	 privatestatic final PersistenceManagerFactorypmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");	 private PMF() {}	 publicstaticPersistenceManagerFactoryget() {	returnpmfInstance;	   } } Para usarlo creamos una nueva instancia de Greeting mediante la ejecución del constructor.  Para guardar la instancia en el almacén de datos, crea una clase PersistenceManager a través de PMF.get() e invocamos sobre él makePersistent()
Serializando datos con JDO Dentro del fichero SignGuestBookServlet introduciríamos los siguientes cambios para serializar los saludos en AppEngineDataStore, a través de JDO: Stringcontent = req.getParameter("content");		 Date date = new Date();         Greetinggreeting = new Greeting(user, content, date);		 PersistenceManager pm = PMF.get().getPersistenceManager();		 try {			 pm.makePersistent(greeting);		 } finally {			 pm.close();		 }
Consultando datos con JDO El estándar JDO define un mecanismo para consultas de objetos persistentes denominado JDOQL.  Modificaremos guestbook.jsp para realizar la consulta introduciendo los siguientes cambios: <%@ page import="java.util.List" %><%@ page import="javax.jdo.PersistenceManager" %><%@ page import="guestbook.Greeting" %><%@ page import="guestbook.PMF" %> … <%		 PersistenceManager pm = PMF.get().getPersistenceManager(); String query = "select from " + Greeting.class.getName() + " order by date desc range 0,5";  List<Greeting> greetings = (List<Greeting>) pm.newQuery(query).execute();		 if (greetings.isEmpty()) { %>			   <p>Theguestbook has no messages.</p> <%		 } else {			 for (Greeting g : greetings) {				 if (g.getAuthor() == null) { %>					       <p>Ananonymouspersonwrote:</p> <%				     } else { %>					       <p><b><%= g.getAuthor().getNickname() %></b> wrote:</p> <%		      } %>				     <blockquote><%= g.getContent() %></blockquote>	<%			   }		 }		 pm.close();		 %>
Usando Ficheros Estáticos Hay muchos casos en los que querrás mostrar los archivos estáticos directamente en el navegador web: imágenes, vídeos Para una mayor eficiencia, AppEngine muestra los archivos estáticos desde servidores independientes en lugar de los que ejecutan servlets. AppEngine considera todos los archivos del directorio WAR como archivos estáticos, salvo JSP y los archivos de WEB-INF/ Cualquier solicitud de una URL cuya ruta coincida con un archivo estático lo muestra  Puedes configurar los archivos que quieres que AppEngine considere como archivos estáticos a través del archivo appengine-web.xml La siguiente página da más información al respecto: http://code.google.com/intl/es/appengine/docs/java/config/appconfig.html Para este ejemplo: Crear main.css con el siguiente contenido: body { font-family: Verdana, Helvetica, sans-serif; background-color: #FFFFCC; } Añadir a guestbook.jsp lo siguiente:  <head> <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" /> </head>
Creando de Objetos y Claves Para almacenar un objeto de datos sencillo en el almacén de datos, ejecuta el método makePersistent() del PersistenceManager y transfiérelo a la instancia. PersistenceManager pm = PMF.get().getPersistenceManager(); Employee e = new Employee("Alfred", "Smith", new Date()); try { pm.makePersistent(e); } finally { pm.close(); } Las claves más sencillas están basadas en los tipos Long o String, pero también se pueden crear con la clase Key.  importcom.google.appengine.api.datastore.Key; importcom.google.appengine.api.datastore.KeyFactory; // ... Key k = KeyFactory.createKey(Employee.class.getSimpleName(), "Alfred.Smith@example.com"); Para recuperar un elemento por clave podemos usar lo siguiente, se puede pasar como segundo argumento una clave, un entero o un string: Employee e = pm.getObjectById(Employee.class, "Alfred.Smith@example.com");
Actualización y Borrado de Objetos El siguiente código muestra cómo actualizar un objeto persistente: publicvoidupdateEmployeeTitle(Useruser, StringnewTitle) { PersistenceManager pm = PMF.get().getPersistenceManager(); try {    Employee e = pm.getObjectById(Employee.class, user.getEmail());    if (titleChangeIsAuthorized(e, newTitle) {       e.setTitle(newTitle);    } else {       throw new UnauthorizedTitleChangeException(e, newTitle);    } } finally {    pm.close(); } } El siguiente ejemplo muestra cómo borrar un objeto: pm.deletePersistent(e);
Realizando Consultas con JDO JDOQL es similar a SQL, aunque es más adecuado para bases de datos relacionadas con objetos, como, por ejemplo, el almacén de datos de AppEngine. Dos usos diferentes: Puedes especificar parte o la totalidad de la consulta mediante métodos de ejecución en el objeto de consulta importjava.util.List; importjavax.jdo.Query; // ... Queryquery = pm.newQuery(Employee.class); query.setFilter("lastName == lastNameParam"); query.setOrdering("hireDatedesc"); query.declareParameters("StringlastNameParam"); try {    List<Employee> results = (List<Employee>) query.execute("Smith"); if (results.iterator().hasNext()) { for (Employee e : results) { 	   // ... 	   } 	} else { 	   // ... no results ... 	} } finally { query.closeAll(); }
Realizando Consultas con JDO Puedes especificar una consulta completa en una cadena mediante la sintaxis de cadena JDOQL: Queryquery = pm.newQuery("selectfromEmployee " +    "wherelastName == lastNameParam " +    "orderbyhireDatedesc " +    "parametersStringlastNameParam"); List<Employee> results = (List<Employee>) query.execute("Smith"); Otro modo: Queryquery = pm.newQuery(Employee.class,    "lastName == lastNameParamorderbyhireDatedesc"); query.declareParameters("StringlastNameParam"); List<Employee> results = (List<Employee>) query.execute("Smith"); Query query = pm.newQuery(Employee.class,    "lastName == 'Smith' order by hireDatedesc");
Filtros y Restricciones en Consultas JDO sobre AppEngine Algunos ejemplos de filtros son: query.setFilter("lastName == 'Smith' && hireDate > hireDateMinimum"); query.declareParameters("Date hireDateMinimum"); Queryquery = pm.newQuery(Employee.class,    "(lastName == 'Smith' || lastName == 'Jones')" +    " && firstName == 'Harold'"); ATENCIÓN: importantes restricciones en las consultas, revisar: http://code.google.com/intl/es/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries Ejemplo: Los filtros de desigualdad sólo están permitidos en una propiedad
Ejemplo Objeto Serializable La siguiente clase define un objeto que puede serializarse en JDO: importjava.io.Serializable; publicclassDownloadableFileimplementsSerializable{ private byte[] content; privateStringfilename; privateStringmimeType; // ... accessors ... } La siguiente clase define cómo usarlo: importjavax.jdo.annotations.Persistent; importDownloadableFile; // ... @Persistent(serialized = "true"); privateDownloadableFilefile;
Ejemplo Relación 1 a 1 entre Entidades importcom.google.appengine.api.datastore.Key; // ... imports ... @PersistenceCapable publicclassContactInfo {    @PrimaryKey    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key;    @Persistent privateStringstreetAddress;    @Persistent privateStringcity;    @Persistent privateStringstateOrProvince;    @Persistent privateStringzipCode;    // ... accessors ... } importContactInfo; // ... imports ... @PersistenceCapable publicclassEmployee {     @PrimaryKey     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key;     @Persistent privateContactInfomyContactInfo;     // ... accessors ... }
Relaciones Uno a Varios Ejemplo de relación bidireccional uno a varios: // Employee.java importjava.util.List; // ... @Persistent private List<ContactInfo> contactInfoSets; // ContactInfo.java importEmployee; // ... @Persistent privateEmployeeemployee;
Relaciones Varios a Varios Ejemplo de relación varios a varios, sólo se puede hacer guardando colecciones de claves en ambas relaciones implicadas: //Person.java importjava.util.Set; importcom.google.appengine.api.datastore.Key; // ... @Persistent private Set<Key> favoriteFoods; //Food.java importjava.util.Set; importcom.google.appengine.api.datastore.Key; // ... @Persistent private Set<Key> foodFans; // Album.java // ... publicvoidaddFavoriteFood(Foodfood) {     favoriteFoods.add(food.getKey()); food.getFoodFans().add(getKey()); } publicvoidremoveFavoriteFood(Foodfood) { favoriteFoods.remove(food.getKey()); food.getFoodFans().remove(getKey()); }
Características Avanzadas de Google AppEngine Planificación de tareas con Cron for Java http://code.google.com/appengine/docs/java/config/cron.html Memcache Java API http://code.google.com/appengine/docs/java/memcache/overview.html URL Fech Java API http://code.google.com/appengine/docs/java/urlfetch/overview.html Envío de mensajes instantáneos con XMPP e email  http://code.google.com/appengine/docs/java/xmpp/overview.html Colas de tareas – permite ejecutar asíncronamente tareas http://code.google.com/appengine/docs/java/taskqueue/overview.html
Planificación de Tareas con Cron El servicio AppEngine Cron Service permite planificar tareas que se ejecutan en un momento o periodos determinados. Los trabajos cron (cron jobs) son ejecutados por AppEngine Cron Service Algunos ejemplos de uso serían: Envío de email con informe diario Actualización de tu caché de datos cada 10 minutos Documentación en: http://code.google.com/appengine/docs/java/config/cron.html Formato de las planificaciones: ("every"|ordinal) (days) ["of" (monthspec)] (time)
Planificación de Tareas con Cron El fichero WEB-INFron.xmlcontrolacronparatuaplicación: <?xmlversion="1.0" encoding="UTF-8"?> <cronentries> <cron>  <url>/recache</url>  <description>Repopulatethe cache every 2 minutes</description>  <schedule>every 2 minutes</schedule></cron><cron>  <url>/weeklyreport</url>  <description>Mail out a weeklyreport</description>  <schedule>everymonday 08:30</schedule>  <timezone>America/New_York</timezone></cron> </cronentries>
Memcache Java API Las aplicaciones web escalables de alto rendimiento utilizan a menudo una caché distribuida de datos integrados en memoria delante o en lugar de un sistema de almacenamiento complejo permanente para algunas tareas AppEngine incluye un servicio de memoria caché El API Java de Memcache implementa la interfaz JCache (javax.cache), un estándar en formato borrador descrito en JSR 107 JCache proporciona una interfaz en forma de mapa para recopilar datos Puedes almacenar y recuperar valores de la memoria caché mediante las claves Controlar cuándo los valores vencen en la memoria caché Inspeccionar el contenido de la memoria caché y obtener estadísticas sobre ella Utilizar "funciones de escucha" para añadir un comportamiento personalizado al establecer y borrar valores.
Pasos para Hacer uso de Memcache Obtención y configuración de una instancia de Cache, para ello hay que configurar los parámetros del método createCache importjavax.cache.Cache; importjavax.cache.CacheException; importjavax.cache.CacheFactory; // ... Cache cache; try { Mapprops = new Map;    props.put(GCacheFactory.EXPIRATION_DELTA, 3600);    props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true); CacheFactorycacheFactory = CacheManager.getInstance().getCacheFactory();    // cache = cacheFactory.createCache(Collections.emptyMap());    cache = cacheFactory.createCache(props); } catch (CacheException e) { // ... } Establecimiento y obtención de valores.   Se comporta como un mapa Puedes almacenar claves y valores a través del método put() y recuperar valores con el método get() Otros métodos de interés son: remove(), clear(), containsKey(), isEmpty() y size() Más documentación en: http://code.google.com/intl/es/appengine/docs/java/memcache/usingjcache.html
URL Fetch Java API GAE permite realizar conexiones HTTP y HTTPS a través del servicio URL Fetch, que en el caso de GAE for Java se implementa  mediante la clase java.net.URLConnection La funcionalidad que da es: Acceso sencillo a los contenidos de una página mediante java.net.URL y el método openStream() El método openConnection() de java.net.URL devuelve una instancia de HttpURLConnection, sobre la que se puede hacer getInputStream() y getOutputStream() Se pueden cambiar propiedades de la conexión como: Añadir cabeceras: connection.setRequestProperty("X-MyApp-Version", "2.7.3"); Modificar el hecho de que las peticiones se redirijan directamente: connection.setRequestProperty("X-MyApp-Version", "2.7.3"); Más detalles en: http://code.google.com/intl/en/appengine/docs/java/urlfetch/usingjavanet.html
Mail Java API Una aplicación en AppEngine puede enviar mensajes en representación del administrador de la página o de usuarios autorizados con cuentas Google La Mail Service Java API hace uso de javax.mail Se puede configurar tu aplicación para recibir mensajes en una dirección con el formato string@appid.appspotmail.com Cuando una aplicación se ejecuta en el servidor de desarrollo, el mensaje enviado se imprime en el log, no se envía
Enviando un Mensaje ... importjava.util.Properties; importjavax.mail.Message; importjavax.mail.MessagingException; importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.internet.AddressException; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeMessage; // ...  Propertiesprops = new Properties(); Sessionsession = Session.getDefaultInstance(props, null); StringmsgBody = "...“; try { Messagemsg = new MimeMessage(session); msg.setFrom(new InternetAddress("admin@example.com", "Example.com Admin")); msg.addRecipient(Message.RecipientType.TO,                             new InternetAddress("user@example.com", "Mr. User")); msg.setSubject("Your Example.com account has beenactivated"); msg.setText(msgBody); Transport.send(msg); } catch (AddressException e) {    // ... } catch (MessagingException e) {    // ... }
Recibiendo un Mensaje Los pasos a seguir son: Configurar tu aplicación para ser receptora de email en la dirección: string@appid.appspotmail.com Modificando el fichero appengine-web.xml:  <inbound-services>    <service>mail</service> </inbound-services> Modificando el fichero web.xml, que recibirá mensajes en la siguiente dirección: /_ah/mail/<address> <servlet> <servlet-name>mailhandler</servlet-name>     <servlet-class>MailHandlerServlet</servlet-class>   </servlet> <servlet-mapping>     <servlet-name>mailhandler</servlet-name>     <url-pattern>/_ah/mail/*</url-pattern>   </servlet-mapping>   <security-constraint>     <web-resource-collection>       <url-pattern>/_ah/mail/*</url-pattern>     </web-resource-collection>     <auth-constraint>       <role-name>admin</role-name>     </auth-constraint>   </security-constraint>
Recibiendo un Mensaje Los pasos a seguir son: Crear un servlet que reciba los mensajes importjava.io.IOException; importjava.util.Properties;  importjavax.mail.Session;  importjavax.mail.internet.MimeMessage;  importjavax.servlet.http.*;  publicclassMailHandlerServletextendsHttpServlet{ publicvoiddoPost(HttpServletRequestreq,  HttpServletResponseresp) throwsIOException {  Propertiesprops = new Properties();  Sessionsession = Session.getDefaultInstance(props, null); MimeMessagemessage = new MimeMessage(session, req.getInputStream());       … }
TaskQueue API Una aplicación Java puede crear una cola configurada en el fichero de configuración WEB-INF/queue.xml  Para encolar una tarea, hay que obtener una instancia de Queue usando una QueueFactory y luego invocar el método add() Puedes obtener una cola por nombre declarada en el fichero queue.xml o la cola por defecto con el método getDefaultQueue() Se puede añadir una tarea a la cola pasando una instancia de TaskOptions al método add() Se invocará un servlet que será quien ejecute la tarea encolada (ver ejemplo siguiente trasparencia) Espacio de nombres en versión beta: com.google.appengine.api.labs.taskqueue
Ejemplo de TaskQueue API El siguiente ejemplo muestra cómo añadir una tarea a una cola: importcom.google.appengine.api.labs.taskqueue.Queue; importcom.google.appengine.api.labs.taskqueue.QueueFactory; importstaticcom.google.appengine.api.labs.taskqueue.TaskOptions.Builder.*; // ... Queuequeue = QueueFactory.getDefaultQueue(); queue.add(url("/worker").param("key", key));
Ejemplo de TaskQueue API Ejemplo de queue.xml, donde s indica segundos, m minutos, h horas y d días, es decir, la frecuencia con la que las tareas encoladas serían procesadas: <queue-entries>  <queue>    <name>default</name>    <rate>1/s</rate>  </queue>  <queue>    <name>mail-queue</name>    <rate>2000/d</rate>    <bucket-size>10</bucket-size>  </queue>  <queue>    <name>background-processing</name>    <rate>5/s</rate>  </queue></queue-entries>
Combinando Struts2 y GAE Revisar ejemplo: struts2tutorial Modificaciones a realizar en la distribución de struts2tutorial: Reimplementar la clase freemarker.core.TextBlock Inicializar a null el SecurityManager de OgnlRuntime Explicación de cómo hacerlo en:  http://whyjava.wordpress.com/2009/08/30/creating-struts2-application-on-google-app-engine-gae/
Pluginfor Eclipse for Java Instrucciones en: http://code.google.com/eclipse/docs/download.html Descarga Eclipse Galileo for Java Developers de: http://www.eclipse.org/downloads/
Importación y Exportación de Datos Se pueden acceder a datos detrás de tu Intranet desde una aplicación de Google AppEngine, con Google Secure Data Connector y el servicio urlfetch (com.google.appengine.api.urlfetch.*) http://code.google.com/intl/en/securedataconnector/docs/1.3/tutorials/appengine.html Se pueden importar y exportar datos del datastore en forma de ficheros CSV Solamente disponible en Python de momento: http://code.google.com/appengine/docs/python/tools/uploadingdata.html
Google AppEnginefor Business Las aplicaciones generadas con AppEnginefor Business usan las APIs de Java y Python, pero permiten acceder al desarrollador a capacidades especiales (premium): Acceso a SSL y SQL Tendrán un coste adicional Mas información en: http://code.google.com/appengine/business/
Limitaciones Google AppEngine El servicio tiene varias limitaciones: Solo hasta recientemente no todo el mundo podía acceder a él Es gratis durante el periodo de pruebas, pero con límites de uso: 500 MB de almacenamiento, 200 millones de megaciclos/día y 10 Gb de ancho de banda Google cobra para webs que requieren alta escalabilidad Existen escasas aplicaciones comerciales desarrolladas en esta plataforma Repositorio de ejemplos: http://appgallery.appspot.com/ VOSAO CMS - http://www.vosao.org/ Limitaciones técnicas originales parcialmente resueltas: Los desarrolladores solamente tienen acceso de lectura al sistema de ficheros de AppEngine Solamente se puede ejecutar código a partir de una petición HTTP Solamente se puede subir código puramente Python (resuelto con soporte Java) No se puede descargar o ejecutar scripts en su base de datos (remote_api) Las aplicaciones deben ser escritas en Python o Java Guido van Rosum, creador de Python está detrás de Google AppEngine

Mais conteúdo relacionado

Mais procurados

03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...
03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...
03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...Neurowork
 
Database as a service con Oracle Cloud platform
Database as a service con Oracle Cloud platformDatabase as a service con Oracle Cloud platform
Database as a service con Oracle Cloud platformErick Vidal Bazini
 
Administracion y Despliegue a traves PowerShell Azure
Administracion y Despliegue a traves PowerShell Azure Administracion y Despliegue a traves PowerShell Azure
Administracion y Despliegue a traves PowerShell Azure Ivan Martinez
 
Conferencia integracion servicios azure empresarial
Conferencia integracion servicios azure empresarialConferencia integracion servicios azure empresarial
Conferencia integracion servicios azure empresarialIvan Martinez
 
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...Grissel Espinal
 
Arquitectura de la nube modelos de servicios y despliegue
Arquitectura de la nube modelos de servicios y despliegueArquitectura de la nube modelos de servicios y despliegue
Arquitectura de la nube modelos de servicios y despliegueNombre Apellidos
 
Computacion en la nube
Computacion en la nubeComputacion en la nube
Computacion en la nubeyamyenriquez30
 
Ejemplo de articulo cloud computing
Ejemplo de articulo cloud computingEjemplo de articulo cloud computing
Ejemplo de articulo cloud computingEvelynCor
 
Arquitectura en la nube
Arquitectura en la nubeArquitectura en la nube
Arquitectura en la nubeHugo Ardon
 
Arquitectura de la nube
Arquitectura de la nubeArquitectura de la nube
Arquitectura de la nubeNinfaFlores7
 
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...Amazon Web Services LATAM
 
Windows azure: Introducción a la Nube y HoL de Azure MICTT
Windows azure: Introducción a la Nube y HoL de Azure MICTTWindows azure: Introducción a la Nube y HoL de Azure MICTT
Windows azure: Introducción a la Nube y HoL de Azure MICTTMICTT Palma
 

Mais procurados (18)

03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...
03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...
03 cómo el código abierto nos impide caer cautivos de nuestros proveedores de...
 
Database as a service con Oracle Cloud platform
Database as a service con Oracle Cloud platformDatabase as a service con Oracle Cloud platform
Database as a service con Oracle Cloud platform
 
Administracion y Despliegue a traves PowerShell Azure
Administracion y Despliegue a traves PowerShell Azure Administracion y Despliegue a traves PowerShell Azure
Administracion y Despliegue a traves PowerShell Azure
 
Conferencia integracion servicios azure empresarial
Conferencia integracion servicios azure empresarialConferencia integracion servicios azure empresarial
Conferencia integracion servicios azure empresarial
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...
Presentacion arquitectura de_la_nube_-_sistemas_de_informacion_financiera_-_g...
 
Arquitectura de la nube modelos de servicios y despliegue
Arquitectura de la nube modelos de servicios y despliegueArquitectura de la nube modelos de servicios y despliegue
Arquitectura de la nube modelos de servicios y despliegue
 
Computacion en la nube
Computacion en la nubeComputacion en la nube
Computacion en la nube
 
Amazon S3 and EBS
Amazon S3 and EBSAmazon S3 and EBS
Amazon S3 and EBS
 
Ejemplo de articulo cloud computing
Ejemplo de articulo cloud computingEjemplo de articulo cloud computing
Ejemplo de articulo cloud computing
 
Arquitectura en la nube
Arquitectura en la nubeArquitectura en la nube
Arquitectura en la nube
 
Microsoft Azure
Microsoft AzureMicrosoft Azure
Microsoft Azure
 
tipos de nubes de redes en ofimática
tipos de nubes de redes en ofimática tipos de nubes de redes en ofimática
tipos de nubes de redes en ofimática
 
Arquitectura de la nube
Arquitectura de la nubeArquitectura de la nube
Arquitectura de la nube
 
Flisol amazon-ec2
Flisol amazon-ec2Flisol amazon-ec2
Flisol amazon-ec2
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...
AWS Webinar Series Latinoamérica: Cómo salir de su datacenter y modernizar la...
 
Windows azure: Introducción a la Nube y HoL de Azure MICTT
Windows azure: Introducción a la Nube y HoL de Azure MICTTWindows azure: Introducción a la Nube y HoL de Azure MICTT
Windows azure: Introducción a la Nube y HoL de Azure MICTT
 

Destaque

Ohl Concesiones2009anexos Oficial Ing
Ohl Concesiones2009anexos Oficial IngOhl Concesiones2009anexos Oficial Ing
Ohl Concesiones2009anexos Oficial IngArteris S.A.
 
Wicsa2011 cloud tutorial
Wicsa2011 cloud tutorialWicsa2011 cloud tutorial
Wicsa2011 cloud tutorialAnna Liu
 
AWS Cloud School | London - Part 1
AWS Cloud School | London - Part 1AWS Cloud School | London - Part 1
AWS Cloud School | London - Part 1Amazon Web Services
 
El Cloud Computing & Amazon Web Services
El Cloud Computing & Amazon Web ServicesEl Cloud Computing & Amazon Web Services
El Cloud Computing & Amazon Web Servicescloudimpulsion
 

Destaque (6)

Ohl Concesiones2009anexos Oficial Ing
Ohl Concesiones2009anexos Oficial IngOhl Concesiones2009anexos Oficial Ing
Ohl Concesiones2009anexos Oficial Ing
 
Por.Apimec 2 T07
Por.Apimec 2 T07Por.Apimec 2 T07
Por.Apimec 2 T07
 
Wicsa2011 cloud tutorial
Wicsa2011 cloud tutorialWicsa2011 cloud tutorial
Wicsa2011 cloud tutorial
 
Introduction to AWS tools
Introduction to AWS toolsIntroduction to AWS tools
Introduction to AWS tools
 
AWS Cloud School | London - Part 1
AWS Cloud School | London - Part 1AWS Cloud School | London - Part 1
AWS Cloud School | London - Part 1
 
El Cloud Computing & Amazon Web Services
El Cloud Computing & Amazon Web ServicesEl Cloud Computing & Amazon Web Services
El Cloud Computing & Amazon Web Services
 

Semelhante a To Cloud or not To Cloud, That is the question!

Redes y seguridad en AWS - CongresoSSI
Redes y seguridad en AWS - CongresoSSIRedes y seguridad en AWS - CongresoSSI
Redes y seguridad en AWS - CongresoSSIKatherine Cancelado
 
Cloud Hosting: la nueva generación del hosting
Cloud Hosting: la nueva generación del hostingCloud Hosting: la nueva generación del hosting
Cloud Hosting: la nueva generación del hostingArsys
 
Virtualizacion - Virtualizacion_Cloud.pdf
Virtualizacion - Virtualizacion_Cloud.pdfVirtualizacion - Virtualizacion_Cloud.pdf
Virtualizacion - Virtualizacion_Cloud.pdfssuserbd237f
 
Los beneficios de migrar sus cargas de trabajo de big data a AWS
Los beneficios de migrar sus cargas de trabajo de big data a AWSLos beneficios de migrar sus cargas de trabajo de big data a AWS
Los beneficios de migrar sus cargas de trabajo de big data a AWSAmazon Web Services LATAM
 
Cloud computing
Cloud computingCloud computing
Cloud computingLiz Gomez
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
CloudcomputingisummitUlises Diaz
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
CloudcomputingisummitUlises Diaz
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
CloudcomputingisummitUlises Diaz
 
Cloud computing
Cloud computingCloud computing
Cloud computingcarcass316
 

Semelhante a To Cloud or not To Cloud, That is the question! (20)

Bases de Datos No Relacionales (NoSQL)
Bases de Datos No Relacionales (NoSQL) Bases de Datos No Relacionales (NoSQL)
Bases de Datos No Relacionales (NoSQL)
 
Cloud Computing Amazon
Cloud Computing AmazonCloud Computing Amazon
Cloud Computing Amazon
 
Cloud Computing (Open Source)
Cloud Computing (Open Source)Cloud Computing (Open Source)
Cloud Computing (Open Source)
 
Cloud Computing: una perspectiva tecnológica
Cloud Computing: una perspectiva tecnológicaCloud Computing: una perspectiva tecnológica
Cloud Computing: una perspectiva tecnológica
 
2. Amazon Web Services
2.  Amazon Web Services2.  Amazon Web Services
2. Amazon Web Services
 
Sobrevolando AWS
Sobrevolando AWSSobrevolando AWS
Sobrevolando AWS
 
Servidores web: cloud
Servidores web: cloudServidores web: cloud
Servidores web: cloud
 
Redes y seguridad en AWS - CongresoSSI
Redes y seguridad en AWS - CongresoSSIRedes y seguridad en AWS - CongresoSSI
Redes y seguridad en AWS - CongresoSSI
 
Cloud Hosting: la nueva generación del hosting
Cloud Hosting: la nueva generación del hostingCloud Hosting: la nueva generación del hosting
Cloud Hosting: la nueva generación del hosting
 
Virtualizacion - Virtualizacion_Cloud.pdf
Virtualizacion - Virtualizacion_Cloud.pdfVirtualizacion - Virtualizacion_Cloud.pdf
Virtualizacion - Virtualizacion_Cloud.pdf
 
CLASE 2 ORACLE CLOUD
CLASE 2 ORACLE CLOUDCLASE 2 ORACLE CLOUD
CLASE 2 ORACLE CLOUD
 
Los beneficios de migrar sus cargas de trabajo de big data a AWS
Los beneficios de migrar sus cargas de trabajo de big data a AWSLos beneficios de migrar sus cargas de trabajo de big data a AWS
Los beneficios de migrar sus cargas de trabajo de big data a AWS
 
Data Center as a Service
Data Center as a ServiceData Center as a Service
Data Center as a Service
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
Cloudcomputingisummit
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
Cloudcomputingisummit
 
Proyectos de nubes de computación
Proyectos de nubes de computaciónProyectos de nubes de computación
Proyectos de nubes de computación
 
Cloudcomputingisummit
CloudcomputingisummitCloudcomputingisummit
Cloudcomputingisummit
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
Semana 7 Instalación servicios OCI
Semana 7   Instalación servicios OCISemana 7   Instalación servicios OCI
Semana 7 Instalación servicios OCI
 

Mais de Diego López-de-Ipiña González-de-Artaza

Humanized Computing: the path towards higher collaboration and reciprocal lea...
Humanized Computing: the path towards higher collaboration and reciprocal lea...Humanized Computing: the path towards higher collaboration and reciprocal lea...
Humanized Computing: the path towards higher collaboration and reciprocal lea...Diego López-de-Ipiña González-de-Artaza
 
Ontological Infrastructure for Interoperable Research Information Systems: HE...
Ontological Infrastructure for Interoperable Research Information Systems: HE...Ontological Infrastructure for Interoperable Research Information Systems: HE...
Ontological Infrastructure for Interoperable Research Information Systems: HE...Diego López-de-Ipiña González-de-Artaza
 
Fostering multi-stakeholder collaboration through co-production and rewarding
Fostering multi-stakeholder collaboration through co-production and rewarding Fostering multi-stakeholder collaboration through co-production and rewarding
Fostering multi-stakeholder collaboration through co-production and rewarding Diego López-de-Ipiña González-de-Artaza
 
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...Diego López-de-Ipiña González-de-Artaza
 
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...Diego López-de-Ipiña González-de-Artaza
 
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...Diego López-de-Ipiña González-de-Artaza
 
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...Diego López-de-Ipiña González-de-Artaza
 
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...Diego López-de-Ipiña González-de-Artaza
 
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios Estándar
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios EstándarROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios Estándar
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios EstándarDiego López-de-Ipiña González-de-Artaza
 

Mais de Diego López-de-Ipiña González-de-Artaza (20)

Humanized Computing: the path towards higher collaboration and reciprocal lea...
Humanized Computing: the path towards higher collaboration and reciprocal lea...Humanized Computing: the path towards higher collaboration and reciprocal lea...
Humanized Computing: the path towards higher collaboration and reciprocal lea...
 
Generative AI How It's Changing Our World and What It Means for You_final.pdf
Generative AI How It's Changing Our World and What It Means for You_final.pdfGenerative AI How It's Changing Our World and What It Means for You_final.pdf
Generative AI How It's Changing Our World and What It Means for You_final.pdf
 
Democratizing Co-Production Of Sustainable Public Services
Democratizing Co-Production Of Sustainable Public Services Democratizing Co-Production Of Sustainable Public Services
Democratizing Co-Production Of Sustainable Public Services
 
Ontological Infrastructure for Interoperable Research Information Systems: HE...
Ontological Infrastructure for Interoperable Research Information Systems: HE...Ontological Infrastructure for Interoperable Research Information Systems: HE...
Ontological Infrastructure for Interoperable Research Information Systems: HE...
 
Fostering multi-stakeholder collaboration through co-production and rewarding
Fostering multi-stakeholder collaboration through co-production and rewarding Fostering multi-stakeholder collaboration through co-production and rewarding
Fostering multi-stakeholder collaboration through co-production and rewarding
 
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...
A Collaborative Environment to Boost Sustainable Engaged Research & Co-Produc...
 
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...
A Collaborative Environment to Boost Co-Production of Sustainable Public Serv...
 
PrácticaParticipación-INTERLINK-realizingcoproduction_final.pdf
PrácticaParticipación-INTERLINK-realizingcoproduction_final.pdfPrácticaParticipación-INTERLINK-realizingcoproduction_final.pdf
PrácticaParticipación-INTERLINK-realizingcoproduction_final.pdf
 
INTERLINK: Engaged Research through co-production
INTERLINK: Engaged Research through co-production INTERLINK: Engaged Research through co-production
INTERLINK: Engaged Research through co-production
 
Internet of People: towards a Human-centric computing for Social Good
Internet of People: towards a Human-centric computing for Social GoodInternet of People: towards a Human-centric computing for Social Good
Internet of People: towards a Human-centric computing for Social Good
 
Boosting data-driven innovation in Europe with the support of DIHs
Boosting data-driven innovation in Europe with the support of DIHs Boosting data-driven innovation in Europe with the support of DIHs
Boosting data-driven innovation in Europe with the support of DIHs
 
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...
Social Coin: Blockchain-mediated incentivization of citizens for sustainable ...
 
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...
Human-centric Collaborative Services : IoT, Broad Data, Crowdsourcing, Engage...
 
Role of Data Incubators shaping European Data Spaces: EDI & REACH cases
Role of Data Incubators shaping European Data Spaces: EDI & REACH casesRole of Data Incubators shaping European Data Spaces: EDI & REACH cases
Role of Data Incubators shaping European Data Spaces: EDI & REACH cases
 
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...
Transiting to SMART COMMUNITIES by fostering Collaboration & CO-CREATION for ...
 
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios Estándar
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios EstándarROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios Estándar
ROH: Proceso de Ingeniería Ontológica & Uso y Extensión de Vocabularios Estándar
 
Introduction to FAIR Data and Research Objects
Introduction to FAIR Data and Research ObjectsIntroduction to FAIR Data and Research Objects
Introduction to FAIR Data and Research Objects
 
Introducción a Linked Open Data (espacios enlazados y enlazables)
Introducción a Linked Open Data (espacios enlazados y enlazables)Introducción a Linked Open Data (espacios enlazados y enlazables)
Introducción a Linked Open Data (espacios enlazados y enlazables)
 
Red Ontologías Hércules – ROH
Red Ontologías Hércules – ROHRed Ontologías Hércules – ROH
Red Ontologías Hércules – ROH
 
Internet de las cosas y datos de ciencia ciudadana para uso público
Internet de las cosas y datos de ciencia ciudadana para uso públicoInternet de las cosas y datos de ciencia ciudadana para uso público
Internet de las cosas y datos de ciencia ciudadana para uso público
 

Último

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 

Último (20)

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 

To Cloud or not To Cloud, That is the question!

  • 1. To Cloud or not Cloud, That is the Question! 22 Noviembre de 2010, 9:00-14:00 BizkaiaEnpresaDigitala, Parque Tecnológico de Zamudio. Edificio ESI, #204 Dr. Diego Lz. de Ipiña Glz. de Artazadipina@deusto.eshttp://paginaspersonales.deusto.es/dipinahttp://www.slideshare.net/dipina
  • 2. Agenda Introducción a Cloud Computing (30’) Concepto y campos relacionados Diferentes manifestaciones (SaaS, PaaS e IaaS) Ejemplos de servicios, infraestructura y aplicaciones en la nube Ejemplo de IaaS: Amazon Web Services (AWS) (90’ + 60’) Introducción Amazon Elastic Cloud (EC2) Amazon Simple Storage Service (S3) y CloudFront Amazon Simple DB y RDS Desarrollo de una aplicación de ejemplo sobre AWS
  • 3. Agenda Ejemplo de PaaS: Google AppEngine (60’ + 90’) Introducción DataStore API y GQL Memcache y Cron Versiones Python y Java de Google AppEngine Desarrollo de una aplicación de ejemplo sobre GoogleApp Conclusiones (30’) Comparativa AWS, Google AppEngine y Azure Patrones de diseño Cuándo y cómo adoptaré Cloud Computing en mi empresa Ejemplos en: http://dl.dropbox.com/u/2763621/CursoCloudComputingUDEUSTO/CloudComputing_examples.zip
  • 4. Misión de la Future Internet (FI) Ofrecer a todos los usuarios un entorno seguro, eficiente, confiable y robusto, que: Permita un acceso abierto, dinámico y descentralizado a la red y a su información y Sea escalable, flexible y adapte su rendimiento a las necesidades de los usuarios y su contexto
  • 5. Arquitectura de la Internet del Futuro
  • 6. Internet de los Servicios Una multitud de servicios IT conectados, que son ofrecidos, comprados, vendidos, utilizados, adaptados y compuestos por una red universal de proveedores, consumidores y agregadores de servicios o brokers - resultando en - una nueva manera de ofrecer, utilizar, y organizar funcionalidad soportada por IT Adapted from SAP Research, 2008, and SEEKDA, 2008
  • 7. Campos de Actuación de la Internet de los Servicios Cloud computing: virtualización de servicios y optimización de recursos tanto en capacidad de procesamiento como almacenamiento Open serviceplatforms: modularidad de servicios para facilitar su integración por usuarios finales Autonomiccomputing: sistemas autogestionados Green IT: optimización del consumo energético
  • 8. El Futuro del Desarrollo Software
  • 9. Infraestructura Virtualizada:Cloud Computing Un paradigma de computación emergente donde los datos y servicios residen en centros de datos muy escalables que pueden ser accedidos ubicuamente desde cualquier dispositivo conectado a Internet1 Merrill Lynch: Cloud computing market opportunity by 2011 = $95bn in business and productivity apps + $65bn in online advertising = $160bn (1) Source: IBM
  • 10. Cloud Computing es … … capacidad computacional y almacenamiento virtualizadaexpuesta mediante infraestructura agnóstica a la plataforma y accedida por Internet Recursos IT compartidos en demanda, creados y eliminados eficientemente y de modo escalable a través de una variedad de interfaces programáticos facturados en base a su uso
  • 11. Forrester Research “A pool of abstracted, highly scalable, and managed compute infrastructure capable of hosting end-customer applications and billed by consumption1” 1- “Is Cloud Computing Ready for The Enterprise?” Forrester Research, Inc.
  • 12.
  • 13.
  • 15.
  • 18. Características de Cloud Tipos de despliegue Manifestaciones Cloud privada Propiedad de o alquilada por una empresa (centros de datos,…) Cloud comunitaria Infraestructura compartida por una comunidad específica Cloud pública Vendida al público, gran escala (ec2, S3,…) Cloud híbrida Composición de dos o más clouds Cloud Software as a Service (SaaS) Uso de la aplicación del proveedor sobre la red, e.j., Salesforce.com,… Cloud Platform as a Service (PaaS) Despliega aplicaciones creadas por los clientes a la nube, e.j. Google AppEngine, Microsoft Azure, … Cloud Infrastructure as a Service (IaaS) Alquilar procesamiento, almacenamiento, capacidad de red y otros recursos computacionales e.j., EC2 – Elastic Compute Cloud, S3 – Simple Storage Service, Simple DB,…
  • 20. Cloud Computing vs. Centros de Datos Tradicionales
  • 21. Componentes de Cloud Computing
  • 22. Taxonomía de Cloud Computing
  • 23. Evolución de Tecnologías de Cloud Computing Maduración de tecnología de virtualización La virtualización permite nubes de computación Las nubes de computación demandan nubes de almacenamiento Las nubes de almacenamiento y computación crean infraestructura cloud La infraestructura cloud da lugar a plataformas y aplicaciones cloud Diferentes tipos de cloud dan lugar a Cloud Aggregators Nichos de requisitos dan lugar a Cloud Extenders
  • 24. Aplicaciones Cloud Corresponden con lo que se denomina como SaaS Manifestación de cloud más popular Ejemplos: SalesForce, Gmail, Yahoo! Mail, rememberthemilk, doodle, Google Docs, DropBox, picnik, Panda Cloud Antivirus, scribd, slideshare Ventajas: Libre, Fácil, Adopción de consumo Desventajas: funcionalidad limitada, no hay control de acceso a la tecnología subyacente
  • 25. Plataformas Cloud Contenedores de aplicaciones Entornos cerrados Ejemplos: Google AppEngine, Microsoft Azure, Heroku, Mosso, Engine Yard, Joyent o Force.com Ventajas: buenas para desarrolladores, más control que en las aplicaciones cloud, configuradas estrechamente Desventajas: restringidas a lo que está disponible, otras dependencias, dependencia tecnológica
  • 26. Infraestructura Cloud Proveen nubes de computación y almacenamiento Ofrecen capas de virtualización (hardware/software) Ejemplos: Amazon EC2, GoGrid, Amazon S3, Nirvanix, Linode, Arsys Cloud Flexible, EyeOS Ventajas: control completo del entorno y la infraestructura Desventajas: precio premium, competencia limitada
  • 27. Extensores de la Cloud Proveen extensiones a infraestructura y plataformas cloud con funcionalidad básica Ejemplos: Amazon SimpleDB, Amazon SQS, Google BigTable Ventajas: extienden la funcionalidad de las nubes de computación y almacenamiento para integrar sistemas heredados u otras cloud Desventajas: a veces requieren el uso de plataformas o infraestructura específica
  • 28. Agregadores Cloud Se apoyan en varias infraestructuras cloud para su gestión Ejemplos: RightScale, Appistry Ventajas: proveen más opciones para entornos cloud Desventajas: dependientes de proveedores de cloud
  • 29. ¿Qué framework o plataforma usar para mis aplicaciones Cloud?
  • 30. Amazon Web Services (AWS) AWS proporciona una infraestructura de servicios elástica donde alojar computación, almacenamiento o sistemas empresariales Amazon Elastic Cloud (EC2) – permite configurar y ejecutar un Amazon Machine Instance (AMI) – servidores en demanda Amazon Simple Storage Service (S3) – permite guardar y recuperar datos en la nube Amazon SimpleDB– proporciona la funcionalidad de una base de datos sobre S3 – basada en pares clave-valor Amazon Simple Queue Service (SQS) – servicio de mensajería para encolar tareas y mensajes Amazon RelationalDatabase Service (RDS) – servicio web para crear, operar y escalar una base de datos en la nube Amazon CloudFront– copias de tus objetos más populares son cacheados en una red de nodos alrededor del mundo … Documentación: http://aws.amazon.com/documentation/
  • 33. Amazon Elastic Compute Cloud: EC2 Permite ejecutar varios servidores Linux o Windows virtuales en demanda, facilitando tantos ordenadores como necesites para procesar tus datos o ejecutar una aplicación Otorga acceso root al sistema operativo de cada servidor, un cortafuegos para gestionar el acceso a la red y la libertad para instalar cualquier software Una vez configurado un servidor adecuadamente, se guarda como Amazon Machine Image (AMI) que puede ser lanzada para crear máquinas virtuales en demanda La EC2 API (Query o SOAP) ofrece funcionalidad para empezar y parar instancias de servidor, aplicar permisos de acceso y red o gestionar tus imágenes de servidor. Cada servidor individual se gestiona usando herramientas Linux o Windows sobre una sesión de shell segura. Se factura en función de los recursos consumidos : CPU y datos transferidos Más información en: http://aws.amazon.com/products/ec2
  • 34. Conceptos EC2 AMI (Amazon Machine Instance) Basadas en XEN Instancia: AMI en ejecución Es necesario crear instancias EBS si queremos pararlas y reiniciarlas Dos IPs: IP pública e IP elástica Volúmenes EBS (Elastic Block Storage): almacenamiento para las instancias Conceptos de credenciales: Access Key ID y Secret Access Key X.509 certificate y clave privada (SOAP y EC2 Tools) IP Elástica – asociada a tu cuenta no una instancia, te permite controlar a qué instancia o instancias apunta (útil por robustez). Conceptos y herramientas para usar EC2 en: http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html
  • 35. EC2: Regiones y Zonas de Disponibilidad Las instancias en EC2 se pueden colocar en diferentes localizaciones: Las regiones están dispersas geográficamente (ver tabla debajo) Las zonas de disponibilidad son localizaciones diferentes dentro de una Región que están aisladas de fallos en otras zonas y facilitan conectividad de red económica, de baja latencia a otras zonas de disponibilidad dentro de la Región
  • 36. CloudWatch Amazon CloudWatches un servicio que proporciona monitorización para recursos gestionados por AWS Muestra utilización de recursos como CPU, lecturas y escrituras de disco o tráfico de red http://aws.amazon.com/cloudwatch/ http://awsdocs.s3.amazonaws.com/AmazonCloudWatch/latest/acw-dg.pdf http://awsdocs.s3.amazonaws.com/AmazonCloudWatch/latest/acw-qrc.pdf Elastic Load Balancingdistribuye automáticamente el tráfico de aplicación entrante entre varias instancias EC2 http://aws.amazon.com/elasticloadbalancing/ http://awsdocs.s3.amazonaws.com/ElasticLoadBalancing/latest/elb-dg.pdf http://awsdocs.s3.amazonaws.com/ElasticLoadBalancing/latest/elb-qrc.pdf Auto Scalingpermite escalar automáticamente hacia arriba o abajo tu capacidad EC2 en función de triggers que defines http://aws.amazon.com/autoscaling/ http://awsdocs.s3.amazonaws.com/AutoScaling/latest/as-qrc.pdf
  • 39. Elastic Load Balancing en Funcionamiento
  • 41. Amazon Simple Storage Service: S3 Ofrece espacio de almacenamiento seguro para cualquier tipo de datos en los data centers de Amazon Es una alternativa a construir, mantener y utilizar tus propios sistemas de almacenamiento No tiene límites sobre cuánta información, por cuánto tiempo y con qué ancho de banda puede transferirse. Ofrece una simple API agnóstica a la información a guardar Depende de ti qué datos y qué representación interna tienen El modelo de datos interno consta de dos tipos de recursos de almacenamiento: Objects: guardan datos y metadatos Buckets: contenedores que pueden contener infinidad de objetos Incorpora mecanismos de control de acceso (ACL) que pueden aplicarse a objetos y buckets
  • 42. Amazon Simple Storage Service: S3 Los recursos en S3 se identifican mediante URIs: http://<s3-repository>.amazonaws.com/<bucket-name>/<folder-name>/<s3object-name> Ejemplo: https://s3-eu-west-1.amazonaws.com/misimages/oct2010/image1.png Algunas características de su arquitectura son: Los objetos S3 no pueden ser manipulados como ficheros estándar Los cambios sobre ellos tardan en propagarse Las peticiones a objetos pueden fallar ocasionalmente Permite guardar versiones Se deben resolver las direcciones IP de los nombres DNS de S3 periódicamente Se pueden guardar infinitos objetos de hasta 5GB en tamaño Se paga por almacenamiento, transferencia y operaciones Algunos posibles usos de S3: Compartir grandes ficheros Como repositorio de back-up de tus ficheros Sistema de ficheros mapeado sobre S3 (ElasticDrive) Más información en: http://aws.amazon.com/s3/,
  • 43. Amazon CloudFront Mientras que en Amazon S3 se guardan contenidos (ficheros) con CloudFront se garantiza que tus objetos en S3 buckets son servidos rápidamente. Lo hace copiando los ficheros en buckets S3 a diferentes edgelocationsque sirven contenidos a los usuarios finales. Tales edgelocationsse distribuyen por el planeta asegurándose que los contenidos son servidos del servidor Amazon más cercano Es ventajoso porque el 80-90% del tiempo invertido esperando a una respuesta web se debe a la descarga de los componentes de la página: imágenes, hojas de estilo, scripts, Flash, etc. La clave es colocar la parte estática de nuestra web en una red de distribución de contenidos como Akamai. Con CloudFront hay que pagar las transferencias desde S3 a las localizaciones de los bordes. Más información en: http://aws.amazon.com/cloudfront/
  • 44. ¿Cómo usar CloudFront? Las redes de distribución de contenidos tienen servidores distribuidos por Internet y determinan la ruta más rápida y corta entre el servidor que aloja el contenido y el usuario final Los 4 sencillos pasos que hay que seguir para utilizar CloudFront han sido extraídos del artículo: http://www.labnol.org/internet/setup-content-delivery-network-with-amazon-s3-cloudfront/5446 Get the S3 Fox add-on for Firefox and log-in to your Amazon S3 account. Now right-click your S3 bucket and select "Manage Distributions.“ Next we’ll associate a CNAME (some easy to remember sub-domain name) with our S3 bucket so it become easy to link to the files from our web pages. In this example, I use the web address "cache.labnol.org" and then click Create Distribution. The status will change from "In Progress" to "Deployed". Now copy the resource URL to the clipboard which is of the format xyz.cloudfront.net Log in to your account on your web hosting service’s website, and go to the DNS management page. Create a new CNAME record as shown in the screenshot.
  • 45. Amazon SimpleDB Almacén de claves/valor: trabaja con los conceptos domain, item y attribute Diseñado para minimizar la complejidad y el coste de mantenimiento de tus datos Guarda pequeñas piezas de información textual en una estructura de base de datos sencilla simple de gestionar, modificar y buscar Ofrece su propio lenguaje de consultas de datos Ejemplos de consultas sencillas: ['Date' > '2007-07-01' and Not 'Date' starts-with '2007-07-04'] ['Suburb' = 'Newtown'] or['Price' < '100000'] intersection ['Bedrooms' = '3'] Si tus aplicaciones están basadas en bases de datos simples, este servicio puede reemplazar a tu RDBMS dejándote con una pieza de infraestructura menos que comprar y mantener No exige la especificación de un schema previo, tú puedes modificar la estructura y contenidos de tu base de datos cuando quieras Indexa cada pieza almacenada Guarda tu información de modo seguro, y redundante en la red de data centers de Amazon Pagas por almacenamiento, datos transferidos y operaciones Más información en: http://aws.amazon.com/simpledb/
  • 46. Amazon SimpleDB Ofrece tres recursos principales: Dominios: nombre de un contenedor con información relacionada (similar a base de datos) Solamente se procesan consultas dentro de un dominio Elementos: es una colección con nombre de los atributos que representan un objeto de datos Atributos: es una categoría individual de información guardada dentro de un elemento. Identificado por un nombre contiene una colección de valores de tipo string, obligatorio que tenga al menos un valor. Es una base de datos sencilla, no un RDBMS: Los elementos se guardan en una estructura jerárquica, no una tabla Todos los datos se guardan como texto Capacidades de consulta limitadas La consistencia de la información depende de retardos de propagación Los valores de atributos pueden ser colecciones y alcanzar hasta 1024 bytes SimpleDB está concebido para usarse en conjunción con S3
  • 50. Amazon RelationalDatabase Service (Amazon RDS) Es un servicio web que facilita la instalación, operación y escalabilidad de una base de datos relacional en la nube Te da completo acceso a las capacidades de una base de datos MySQL Las aplicaciones que ya funcionan con MySQL también lo harán con Amazon RDS Amazon RDS modifica el software MySQL para programar la creación de back-ups o garantizar la escalabilidad, todo ello controlado a través de una API sencilla. Solamente se paga por los recursos utilizados. Más información en: http://aws.amazon.com/rds Herramienta: Amazon RDS Command Line Toolkit http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2928&categoryID=294 Tutorial en: http://docs.amazonwebservices.com/AmazonRDS/latest/GettingStartedGuide/
  • 51. Amazon SQS Implementa el servicio de mensajería basado en colas Los mensajes son siempre strings Útil para crear trabajos asíncronos y descargar de actividad a un web server Se paga por mensajes y datos transferidos Más información en: http://aws.amazon.com/sqs
  • 52. Registro y Documentación Se puede ver en detalle cómo acceder a AWS: http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services?src=related_normal&rel=3462501 http://docs.amazonwebservices.com/AWSEC2/2009-11-30/GettingStartedGuide/ http://aws.amazon.com/free/ (Free usagetier)
  • 53. AWS Free UserTier La condiciones de uso son las siguientes: AWS Free Usage Tier (Per Month): 750 hours of Amazon EC2 Linux Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough hours to run continuously each month* 750 hours of an Elastic Load Balancer plus 15 GB data processing* 10 GB of Amazon Elastic Block Storage, plus 1 million I/Os, 1 GB of snapshot storage, 10,000 snapshot Get Requests and 1,000 snapshot Put Requests* 5 GB of Amazon S3 storage, 20,000 Get Requests, and 2,000 Put Requests* 30 GB per of internet data transfer (15 GB of data transfer “in” and 15 GB of data transfer “out” across all services except Amazon CloudFront)* 25 Amazon SimpleDB Machine Hours and 1 GB of Storage** 100,000 Requests of Amazon Simple Queue Service** 100,000 Requests, 100,000 HTTP notifications and 1,000 email notifications for Amazon Simple Notification Service** In addition to these services, the AWS Management Console is available at no charge to help you build and manage your application on AWS.
  • 54. Proceso para usar AWS EC2 Vamos a seguir el siguiente workflow para aprender a usar EC2, crear instancias y conectarnos a ellas, tanto desde Windows como UNIX.
  • 55. Fase 1: Registro en AWS Para utilizar Amazon EC2, necesitasunacuenta Amazon AWS Ir a http://aws.amazon.com/ec2 y hacer click en Sign Up for Amazon EC2. Seguir las instrucciones de pantalla Pasarás a estar suscrito también a Amazon Simple Storage and Amazon Virtual Private Cloud Recibirás una llamada donde introducir el PIN que te asignan vía web
  • 61. Fase 1: Obteniendo los Identificadores de Acceso Vete a http://aws.amazon.com/account/, logueate, haz click en Security Credentials y recupera: Access Key ID y Access Key, pestaña Access Keys Accountnumber se ve en la parte derecha, superior de la página de Security Credentials X.509 Private Key File (pestaña X.509 Certificates) X.509 CertificateFile (pestaña KeyPairs) Los siguientes pantallazos muestran cómo obtener estos datos Guárdalos en ficheros para luego usarlos en tus aplicaciones
  • 62. Fase 1: Obteniendo los Identificadores de Acceso
  • 63. Fase 1: Obteniendo los Identificadores de Acceso
  • 64. Fase 1: Registrarse para EC2 y S3 Acceder a la consola de administración de AWS en: http://aws.amazon.com/console Logearse o Registrarse Durante el registro se solicitan los datos de cargo bancario Recibirás un email de confirmación tanto para EC2 como S3 Alternativamente puedes registrarte individualmente en los diferentes productos yendo al enlace Products y seleccionando el servicio concreto en: http://aws.amazon.com/account/
  • 65. Fase 1: Registrarse para EC2 y S3
  • 66. Fase 1: Registrarse para EC2 y S3
  • 67. Fase 2: Lanzar una Instancia de EC2 Iniciar el “dashboard”, panel de control de AWS Console y realizar los siguientes pasos: https://console.aws.amazon.com Pulsar el botón de nueva instancia Seleccionar una instancia concreta Fedora LAMP Web Server para ejemplo completo Instancia AMI de Windows básica Instancia AMI de UNIX básica Generar o reutilizar un par de claves Guardar las claves Configurar el firewall Revisar los detalles de la instancia desplegada Lanzar la instancia y comprobar que está en ejecución
  • 68. Paso 2.1: Lanzar una Nueva Instancia
  • 69. Paso 2.2: Seleccionar la instancia
  • 70. Paso 2.3: Configurar la Instancia
  • 71. Paso 2.4: Asignar Par de Claves
  • 72. Paso 2.5: Configurar el Firewall
  • 73. Paso 2.6: Revisar los Detalles de la Instancia Configurada
  • 74. Paso 2.7: Lanzar la Instancia y Operar sobre Ella
  • 75. Detalles de la Instancia Creada
  • 76. Fase 2: Lanzando Otras Instancias Vamos a lanzar otra instancia en Windows y otra en UNIX con soporte EBS: Accede a AWS Management Console: http://aws.amazon.com/console/ y regístrate Desde EC2 ConsoleDashboard, haz click en LaunchInstance Elige un AMI, vamos a trabajar bien con Fedora 8 Core o Microsoft Windows Server 2008 Selecciona y acepta los detalles de la instancia Crea un par de claves, que es un credencial utilizado para conectarse a una instancia Crea un grupo de seguridad que define reglas de firewall para tu instancia Revisa tus configuraciones y pulsa el botón Launch
  • 77. Fase 3: Accediendo a la instancia vía web (Servidor LAMP Fedora)
  • 78. Fase 3: Modificando la Página por Defecto Pasos a seguir en cliente UNIX: Logeo en el servidor remoto: ssh -i <instancia> root@public_dns ssh –i ami-f04f6484 root@ec2-79-125-61-32.eu-west-1.compute.amazonaws.com Vamos al directorio htdocs cd /home/webuser/helloworld/htdocs Modificamos la página index.php (ver contenido siguiente trasparencia)
  • 79. Fase 3: Ejemplo de contenido para index.php <html> <head> <title>Nuestro propio Servidor Web</title> <meta http-equiv="Content-Type" content="text/html; charset-ISO-8859-1"> </head> <body> <Nuestro propio Servidor Web ejecut&aacute;ndose en AWS</h1> <p>Unademostraci&oacute;n del curso To Cloud or not To Cloud. That is the question! en EnpresaDigitala.</p> <p>Ejemplo adaptado de <a href="http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services"> http://www.slideshare.net/ronaldbradford/getting-started-with-mysql-in-amazon-web-services </a> </p> </body> </html>
  • 80. Fase 3: Herramientas para Conectarse a Instancia UNIX desde Windows Software necesario (cygwin también valdría): Putty – Putty es un terminal cliente de SSH, descargable de: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuttyGen – programa que convierte la clave privada de Amazon al formato PPK usado por putty Se descarga de la misma página que putty WinSCP – cliente de SFTP y SSH para Windows que permite la transferencia segura de ficheros entre ordenadores. Soporta los protocols SSH, FTP y SCP. Se descarga desde: http://sourceforge.net/projects/winscp/ Tutorial detallado en: http://it.toolbox.com/blogs/managing-infosec/connecting-to-amazon-aws-from-windows-to-a-linux-ami-30656  
  • 81. Fase 3: Conectándose a UNIX AMI desde Windows – Conversión de Clave para putty Cargar el fichero LAMPServerFedora.pem y pulsar en SavePrivate Key que guardará un fichero con extensión ppk que usa putty
  • 82. Fase 3: Conectándose a UNIX AMI desde Windows – Logeo en Windows con putty Arrancar putty Introducir el nombre público DNS del servidor (ec2-79-125-61-32.eu-west-1.compute.amazonaws.com) Ir a al menú ssh->Auth->Browse y cargar clave privada LAMPServerFedora.ppk Loguéate como root
  • 83. Fase 3: Accediendo a ficheros en UNIX AMI desde Windows – Edición de index.php con WinSCP
  • 84. Página Final en Instancia EC2
  • 85. Fase 3: Conectándose a una Instancia de Windows Obteniendo la contraseña Haz click con el botón derecho del ratón sobre la instancia Windows y selecciona “Get Windows Password” Aparece el diálogo Retrieve Default Windows AdministratorPassword, pega ahí la privatekey obtenida antes, parte del fichero de claves entre BEGIN RSA PRIVATE KEY y END RSA PRIVATE KEY Selecciona descrifrar clave Conectarse a la instancia usando Remote Desktop Connection Start AllPrograms  Accessories Introduce el nombre DNS de la instancia Logéate como Administrator/<password-recuperada>
  • 86. Fase 4: Terminar Instancia No es lo mismo “parar” (stop) que “terminar” (terminate) en AWS Cuando terminas una instancia no la puedes reiniciar, ¡dejas de pagar! Sólo la puedes parar si tiene un EBS asociado Para terminar una instancia en la AWS Console, haz click con el botón derecho del ratón y selecciona terminate
  • 88. Probando SimpleDB ScratchpadforSimpleDB es una aplicación web que permite usar Amazon SimpleDB sin necesidad de realizar programación http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1137 Te permite: Crear dominios Poblarlos con datos Consultarlos Modificarlos Borrar el dominio
  • 90. Probando RDS Para utilizarlo hay que seguir los siguientes pasos: Ir a http://aws.amazon.com/rds y registrarte con Amazon RDS Lanzar la instancia y rellenar los datos de tamaño, tipo de base de datos, nombre y clave de usuario Asignar accesos a la instancia de la base de datos, se utiliza CIDR (Classless Inter-DomainRouting) para indicar sólo una dirección IP o un conjunto de direcciones desde las que se permite la conexión Acceso total: 0.0.0.0/0 Conectarse a la instancia usando la herramienta mysql, en la descripción de la instancia en AWS Console aparecerá el string de conexión mysql -h <nombre-host-amazon-rds> -u <username> -p Terminar la instancia para que dejen de facturarnos por su uso
  • 91. Probando SQS El Simple Queue Service (SQS) puede probarse con una sencilla herramienta: JavaScriptScratchpadfor Amazon SQS http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1254&categoryID=122
  • 92. Probando CloudFront Ejemplo de uso desde consola de administración de Amazon
  • 93. Desregistro de un Servicio Para cancelar un servicio: Firma en AWS Haz click en YourAccount y luego en AccountActivity. Selecciona View/Edit Service debajo del servicio que quieres cancelar Haz click en el enlace cancel thisservice.
  • 94. Calculadora de Costes en Amazon La siguiente herramienta te permite estimar costes de consumo de servicios en Amazon: http://calculator.s3.amazonaws.com/calc5.html Además, desde la página http://aws.amazon.com/account, se puede acceder al menú “AccountActivity” que ilustra el gasto actual incurrido.
  • 95.
  • 96. Deriva de un protocolo creado por David Winer en 1998, llamado XML-RPC.
  • 97. Fue creado por Microsoft, IBM, y otros y actualmente se encuentra bajo el auspicio de la W3C.
  • 98. Su arquitectura consiste en varias capas de especificaciones para formato de mensajes:
  • 100. Protocolos de transporte (SMTP y HTTP/S)
  • 101. Modelos de procesado de mensajes
  • 103.
  • 104. Introducido en la tésis doctoral de Roy Fielding en el año 2000.
  • 105. Se refiere a una colección de principios de arquitectura de red, que marcan cómo definir e invocar los recursos.
  • 106. El término se usa a veces para describir una simple interfaz que transmite datos de un dominio específico por HTTP sin capas adicionales como SOAP o uso de cookies.
  • 107.
  • 108. APIs Disponibles por Servicio AWS
  • 109. Revisión APIs de los Principales Servicios EC2: http://aws.amazon.com/documentation/ec2/ (mirar quickreferencecard) http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ S3: http://aws.amazon.com/documentation/s3/ http://docs.amazonwebservices.com/AmazonS3/latest/gsg/index.html?WorkingWithS3.html http://docs.amazonwebservices.com/AmazonS3/2006-03-01/API/ SimpleDB: http://aws.amazon.com/documentation/simpledb/ http://docs.amazonwebservices.com/AmazonSimpleDB/latest/GettingStartedGuide/index.html http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/ SQS Documentation: http://aws.amazon.com/documentation/sqs/ http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/APIReference/ RDS http://aws.amazon.com/documentation/rds http://docs.amazonwebservices.com/AmazonRDS/latest/APIReference/
  • 110. Invocación de Servicios Web AWS Recetas para el uso de la API SOAP desde Java: Recipe 27.5 Getting Set Up with Amazon's Web Services API http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-5.html#jsvltjspckbk-CHP-27-SECT-5 Recipe 27.6 Creating a JavaBean to Connect with Amazon http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-6.html#jsvltjspckbk-CHP-27-SECT-6 Recipe 27.7 Using a Servlet to Connect with Amazon http://g168.net/txt/servlet/0596005725_jsvltjspckbk-chp-27-sect-7.html
  • 111. AWS SDK for Java Ofrece una API basada en Java para acceder a los servicios de infraestructura de AWS, haciendo sencillo el desarrollo de aplicaciones que usan las características de la nube AWS: eficiente en costes, escalable y robusta Descargar de:  http://aws.amazon.com/sdkforjava, incluye: AWS Java Library Ejemplos de código Soporte para Eclipse Soporta los siguientes servicios: Amazon Elastic Compute Cloud (EC2), Amazon Simple Storage Service (S3), Amazon Virtual Private Cloud, Amazon SimpleDB, Amazon RelationalDatabase Service, Amazon Simple Notification Service, Amazon Simple Queue Service, Amazon ElasticMapReduce, Amazon CloudWatch, Elastic Load Balancing, Auto Scaling  Documentación: http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3586 http://developer.amazonwebservices.com/connect/entry.jspa?externalID=848&categoryID=152
  • 112. Usando AWS SDK for Java Se puede obtener documentación detallada en: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/ Antes de empezar, debes registrarte en cada servicio que quieras utilizar. Necesitas obtener tus credenciales de seguridad de: http://aws.amazon.com/security-credentials Previamente puede que tengas que firmar en http://aws.amazon.com/products Los credenciales son un par de claves públicas y privadas que contienen: Access Key ID Secret Access Key Revisar ejemplos en carpeta examples/aws
  • 113. Herramientas para Usar Amazon ScratchPadforSimpleDB y SQS http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1137&categoryID=189 http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1254 ElasticDrive – http://www.elasticdrive.com/ ElasticFox – http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609 S3 Fox – plugin para Firefox, http://www.s3fox.net/ Amazon EC2 API Tools Programas de línea de comandos para intermediar con Amazon EC2 Sirven para registrar, lanzar instancias, manipular grupos de seguridad y más http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&categoryID=88
  • 114. Caso práctico de Álbum de Fotos Álbum de fotos que permite subir fotos, organizarlas y visualizarlas Arquitectura tradicional:
  • 115. Caso práctico de Álbum de Fotos Solución Cloud con: S3, SDB, SQS y CloudFront Ejemplo descrito en: http://www.slideshare.net/javasymposium/developing-with-amazon-web-services-highly-scalable-services-that-are-someone-elses-headache-to-maintain-and-develop
  • 116. Caso práctico de Álbum de Fotos
  • 117. Despliegue de Django en EC2 Seguir los pasos indicados en: http://www.dottostring.com/2009/10/django-deployment-on-amazon-ec2-step-by-step-tutorial/
  • 118. Soporte para Otros Lenguajes Existe soporte para otros lenguajes como Python, Ruby, PHP o .NET PHP: Tarzan AWS (http://code.google.com/p/tarzan-aws/) http://www.slideshare.net/federicof/cloudify-your-applications-with-amazon-web-services?src=related_normal&rel=3462501 Más información en: http://developer.amazonwebservices.com
  • 119. Ejemplo Plataforma Cloud: Google App Engine Google AppEngine es una herramienta para el alojamiento de aplicaciones web escalables sobre la infraestructura de Google Su misión es permitir al desarrollador web crear fácilmente aplicaciones web escalables sin ser un experto en sistemas Aporta las siguientes características a los desarrolladores: Limita la responsabilidad del programador al desarrollo y primer despliegue – Google AppEngine provee recursos computacionales dinámicamente según son necesarios Toma control de los picos de tráfico – si nuestro portal crece en popularidad no es necesario actualizar nuestra infraestructura (servidores, BBDD) Ofrece replicación y balanceo de carga automática apoyado en componentes como Bigtable Fácilmente integrable con otros servicios de Google – los desarrolladores pueden hacer uso de componentes existentes y la librería de APIs de Google (email, autenticación, pagos, etc.)
  • 120. Google AppEngine:Características Ofrece una plataforma completa para el alojamiento y escalado automático de aplicaciones, consistiendo en: Servidores de aplicaciones Python y Java La base de datos BigTable El sistema de ficheros GFS Como desarrollador simplemente tienes que subir tu código Python o Java compilado a Google, lanzar la aplicación y monitorizar el uso y otras métricas Google AppEngine incluye la librería estándar de Python 2.5 y soporta Java 1.6 No todas las acciones se permiten (acceso a ficheros, llamadas al SO, algunas llamadas de red) Se ejecuta en un entorno restringido para permitir que las aplicaciones escalen Ejemplo: https://appengine.google.com http://enpresadigitala.appspot.com/encuestas http://code.google.com/intl/en/appengine/docs/
  • 121.
  • 122. Página de presupuestado y facturación de recursos: http://code.google.com/intl/es/appengine/docs/billing.html
  • 123.
  • 124. Google AppEngine: Python y Java Vamos a revisar primero (brevemente) cómo realizar aplicaciones con Python Luego nos centraremos en cómo hacerlo desde Java en mayor grado de detalle
  • 125. GAE forPython: Instalación Descargar Google AppEngine SDK para Python de: http://code.google.com/appengine/downloads.html Herramientas de la SDK para Python: dev_appserver.py, el servidor web de desarrollo appcfg.py, sirve para subir tu aplicación a App Engine Herramienta de descarga de datos – esunaherramientasencillaquetepermitesubirdatos en ficheros CSV al almacen de datos de appengine http://code.google.com/intl/es/appengine/docs/python/tools/uploadingdata.html
  • 126. Principios Una aplicación de AppEngine se comunica con el servidor que la aloja a través de CGI Cuando recibe una petición el servidor lee de la entrada estándar y de las variables de entorno Cuando genera una respuesta escribe a la salida estándar
  • 127.
  • 128. Ejecutando Hola Mundo en Google App Engine
  • 129. Opciones Avanzadas para GAE forPython Framework webapp que soporta el estándar WSGI Acceso a datos de usuarios mediante la Users API DataStore API Plantillas en Google AppEngine
  • 130. Usando el Almacén de Datos de Google AppEngine Guardar datos en una aplicación web escalable puede ser difícil La infraestructura de AppEngine se encarga de la distribución, replicación y balanceo de carga de los datos detrás de una API sencilla que también ofrece un motor de consultas y transacciones App Engine incluye una API de modelado de datos para Python Se asemeja a la API de Django pero utiliza el servidor de datos escalable BigTable por detrás. No esrelacional, todaslasentidades de un mismotipotienenlasmismaspropiedades Unapropiedadpuedeteneruno o variosvalores El siguiente import nos da acceso a la base de datos de Google AppEngine: fromgoogle.appengine.extimportdb Para más detalles sobre el DataStore API ir a: http://code.google.com/appengine/docs/datastore/
  • 131. La API del DataStore Incluye una API de modelado de datos y un lenguaje similar a SQL que NO permite JOINs y que se llama GQL, haciendo el desarrollo de aplicaciones escalables basadas en datos muy sencillo. fromgoogle.appengine.extimportdbfromgoogle.appengine.apiimportusersclassPet(db.Model):  name = db.StringProperty(required=True)  type = db.StringProperty(required=True, choices=set(["cat", "dog", "bird"]))  birthdate = db.DateProperty()  weight_in_pounds = db.IntegerProperty()  spayed_or_neutered = db.BooleanProperty()  owner = db.UserProperty()pet = Pet(name="Fluffy",          type="cat",          owner=users.get_current_user())pet.weight_in_pounds = 24pet.put()
  • 132. GQL Query Language Para limpiar la base de datos creada: dev_appserver.py --clear_datastorehelloworld/ Ejemplo GQL: ifusers.get_current_user(): user_pets = db.GqlQuery("SELECT * FROM Pet WHERE pet.owner = :1“, users.get_current_user()) forpet in user_pets: pet.spayed_or_neutered = True db.put(user_pets)
  • 133. Usando plantillas en Google App Engine Empotrar HTML en código es algo lioso y difícil de mantener. Los sistemas de plantillas están diseñados para mantener HTML aparte en otro fichero donde elementos con sintaxis especial indican dónde deberían aparecer los datos de la aplicación Dentro de AppEngine puede utilizarse cualquier motor de plantillas empaquetándolo con el código de tu aplicación, webapp incluye el mecanismo de plantillas de Django, donde se pueden pasar objetos del modelo datos Para utilizarlo hay que incluir los dos siguientes imports: import os fromgoogle.appengine.ext.webappimporttemplate Además reemplazar las sentenciasself.response.out.write por la sentencia template.render(path, template_values), quetomacomoparámetros de entrada: El camino al fichero de la plantilla Un diccionario de valores Y retorna: El texto a renderizar
  • 137. Registrando la aplicación en appengine.google.com
  • 139. Subiendo la aplicación Es necesario realizar los siguientes pasos: Editar el fichero app.yaml file y cambiar el valor de la aplicación: de helloworld al nombre de id de aplicación (enpresadigitala) Ejecutar el siguiente comando: appcfg.py updatehelloworld/ Acceder a la aplicación en http://application-id.appspot.com, por ejemplo en http://enpresadigitala.appspot.com/
  • 141. Accediendo a la aplicación
  • 142. Programando Google App Engine con Django Google AppEngine y Django tienen la habilidad de usar el estándar WSGI para ejecutar aplicaciones Como consecuencia podemos utilizar la pila de Django en Google AppEngine, incluso su parte de middleware Lo único que tenemos que hacer es cambiar los modelos de datos de Django para que usen la DataStore API de Google AppEngine Como ambas APIs son muy similares, tenemos la misma flexibilidad usando la potencia de BigTable, es trivial adaptar un modelo Django a Google AppEngine Además como Google AppEngine ya incluye Django, solamente hay que importar los módulos que utilizarías normalmente Para usar el gestor WSGI tenemos que realizar los siguientes pasos: Importar util de google.appengine.ext.webapp Importar WSGI handler de Django [OPCIONAL] Redirigir los logs a la AdminConsole de Google AppEngine Es conveniente cambiar las siguientes configuraciones en Django: Dejar vacías las variables DATABASE_* de settings.py Deshabilitar el middleware de session y autenticación que hace uso de los modelos Django Más info en: http://code.google.com/appengine/articles/django.html Revisar ejemplo de encuestas programado en Django para AppEngine en: examples/googleappengine/python/djangosolopsiteappengine
  • 143. Ejemplo Django Compleja sobre AppEngine
  • 144. AppEngine para Java Crea aplicaciones web a través de tecnologías estándar de Java y las ejecuta en la infraestructura escalable Google Usa JVM Java 6, interfaz de servlets Java y la compatibilidad de interfaces estándar como JDO, JPA, JavaMail y JCache AppEngine utiliza el estándar Java Servlet para aplicaciones web JVM se ejecuta en un entorno seguro de la "zona de pruebas" para aislar tu aplicación por servicio y seguridad. Una aplicación en GAE sólo pueda realizar acciones que no interfieran con el rendimiento ni con la escalabilidad de otras aplicaciones. 
  • 145. Funcionalidad de AppEnginefor Java AppEngine proporciona un conjunto de servicios escalables que pueden utilizar las aplicaciones para: Almacenar datos persistentes. En Java, el almacén de datos admite 2 interfaces Java estándar: los objetos de datos Java (JDO) 2.3 y el API de persistencia de Java (JPA) 1.0. Acceder a recursos en la red. A través de la URL Fectch API. Cachear información. Memcache de AppEngine proporciona un almacenamiento en caché distribuido, transitorio y rápido de los resultados de cálculos y consultas de almacén de datos. La interfaz Java implementa JCache (JSR 107). Enviar email. Da soporte de JavaMail para el envío de correos Procesar imágenes. A través de la Images Java API, permite a las aplicaciones transformar y manipular datos de imágenes en varios formatos. Gestionar usuarios. A través de la Users Java API permite utilizar Cuentas de Google para la autenticación del usuario. Lanzar tareas planificadas o en background. Mediante la TaskQueue Java API y la gestión de tareas por Cron.
  • 146. Instalación de AppEnginefor Java Descargar el fichero de: http://code.google.com/intl/es/appengine/downloads.html#Google_App_Engine_SDK_for_Java Descomprimir el fichero .zip Crear una variable de entorno APPENGINE_JAVA_SDK que apunte al directorio raíz de instalación de la SDK Incluir el directorio %APPENGINE_JAVA_SDK%inen la variable de entorno PATH
  • 147. Pasos para crear una Aplicación con Google AppEngine para Java Crear el proyecto de la aplicación Crear la clase servlet Crear el fichero de despliegue de la aplicación: web.xml Crear el archivo appengine-web.xml Ejecutar el proyecto Probar el proyecto: http://localhost:8080/<nombre-aplicación> Subir la aplicación al dominio appspot.com
  • 148. Configuración del Entorno Instalar java Descomprimir la distribución de GAE for Java a una carpeta de tu disco duro Modificar la variable de entorno APPENGINE_JAVA_SDK para que apunte a ese directorio Modificar la variable de entorno PATH para que apunte a %APPENGINE_JAVA_SDK%in Descomprimir el fichero downloadspache-ant-1.8.1-bin.zip Modificar la variable de entorno PATH para que apunte a <ANT_DIR>in cdexamplesoogleappengineavauestbook ant
  • 149. Paso 1: Creando la estructura del proyecto Dos opciones: Usar el plug-in para Eclipse: http://code.google.com/intl/es/appengine/docs/java/tools/eclipse.html Usar la plantilla de proyecto disponible en %APP_ENGINE_HOME%emosew_project_template Las aplicaciones Java de AppEngine utilizan el API Java Servlet para interactuar con el servidor web. Un servlet HTTP es una clase de aplicación que puede procesar y responder solicitudes web. Esta clase amplía la clase javax.servlet.GenericServlet o a la clase javax.servlet.http.HttpServlet. La estructura del directorio de trabajo será la siguiente: Guestbook/ src/ ...Java sourcecode... META-INF/ ...otherconfiguration... war/ ...JSPs, images, data files... WEB-INF/ ...appconfiguration... classes/ ...compiledclasses... lib/ ...JARsforlibraries...
  • 150. Paso 2: Creando la clase Servlet Crear en el directorio src/guestbook/ un fichero denominado GuestbookServlet.java con el siguiente contenido: packageguestbook;importjava.io.IOException;importjavax.servlet.http.*;publicclassGuestbookServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsIOException {    resp.setContentType("text/plain");      resp.getWriter().println("Hello, world");   }}
  • 151. Paso 3: Creando el fichero de despliegue – web.xml Cuando el servidor web recibe una solicitud, decide qué clase de servlet ejecutar mediante un archivo de configuración conocido como "descriptor de implementación de la aplicación web". Este archivo se denomina web.xml y se ubica en el directorio war/WEB-INF/ del directorio que contiene los ficheros de una aplicación web en Java <?xmlversion="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-appxmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <servlet> <servlet-name>guestbook</servlet-name> <servlet-class>guestbook.GuestbookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>guestbook</servlet-name> <url-pattern>/guestbook</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
  • 152. Paso 4: Crear el fichero de configuración de aplicación GAE: appengine-web.xml AppEngine necesita un archivo de configuración adicional para poder desarrollar y ejecutar la aplicación, denominado appengine-web.xml  Se ubica en WEB-INF/ junto a web.xml. Incluye la ID registrada de la aplicación, el número de versión de la aplicación y listas de archivos que se deben tratar como archivos estáticos (por ejemplo, imágenes y CSS) y archivos de recursos (por ejemplo, JSP y otros datos de aplicación). El directorio war/WEB-INF/ incluye un archivo denominado appengine-web.xml que contiene lo siguiente: <?xmlversion="1.0" encoding="utf-8"?> <appengine-web-appxmlns="http://appengine.google.com/ns/1.0"> <application>librocitas</application> <version>1</version> </appengine-web-app>
  • 153. Paso 5: Ejecución del Proyecto El SDK de AppEngine incluye un servidor web de pruebas para depurar tu aplicación. El servidor simula los servicios y el entorno AppEngine, que incluyen restricciones en la zona de pruebas, el almacén de datos y los servicios. Con el fichero ant ejecuta: antrunserver Puedes detenerlo con Ctrl-C
  • 154. Paso 6: Subiendo la aplicación Puedes crear y administrar aplicaciones web AppEngine con la consola de administración de AppEngine a través de la siguiente URL: http://appengine.google.com/ Para crear una nueva aplicación, haz clic en el botón "CreateanApplication" (Crear aplicación) Edita el archivo appengine-web.xml y, a continuación, cambia el valor del elemento <application> para que sea la ID registrada de tu aplicación (librocitas). Ejecuta el siguiente comando en línea de comandos para subir la aplicación: $ appcfg update www Vete a: http://librocitas.appspot.com/
  • 155. El fichero de Ant Apache Ant facilita la administración de tu proyecto desde la línea de comandos o desde otros entornos de desarrollo integrados (IDE) compatibles con Ant. El SDK de Java incluye un conjunto de macros de Ant para realizar tareas de desarrollo de AppEngine, entre las que se incluyen: El inicio del servidor de desarrollo y La subida de la aplicación a AppEngine Algunos problemas con el build.xml suministrado por new-project-template Fichero adaptado en examples/guestbook/build.xml: Hay que definir variable de entorno APP_ENGINE_SDK para desligar build.xml de su localización en disco Introducir tarea para copiar jars con dependencias
  • 156. Usando el Servicio de Usuarios Google AppEngine ofrece varios servicios útiles basados en la infraestructura de Google a los que se puede acceder a través de aplicaciones utilizando una serie de bibliotecas incluidas en el kit de desarrollo de software (SDK) Por ejemplo, el servicio de usuarios te permite integrar tu aplicación con cuentas de usuarios de Google packageguestbook;importjava.io.IOException;importjavax.servlet.http.*;importcom.google.appengine.api.users.User;importcom.google.appengine.api.users.UserService;importcom.google.appengine.api.users.UserServiceFactory;publicclassGuestbookServletextendsHttpServlet {    publicvoiddoGet(HttpServletRequestreq, HttpServletResponseresp)              throwsIOException {        UserServiceuserService = UserServiceFactory.getUserService();        Useruser = userService.getCurrentUser();        if (user != null) {            resp.setContentType("text/plain");            resp.getWriter().println("Hello, " + user.getNickname());        } else {            resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));        }    }}
  • 157. Uso de un JSP Aunque podríamos generar el código HTML para la interfaz de usuario directamente a partir del código Java del servlet, no sería algo fácil de mantener, ya que el código HTML se complica Es más conveniente utilizar un sistema de plantillas, en el que la interfaz de usuario esté diseñada e implementada en archivos independientes con marcadores y lógica para insertar datos proporcionados por la aplicación. Pasos: En el directorio war/, crea un archivo llamado guestbook.jsp con el contenido de la siguiente transparencia Modificar el fichero web.xml para que el welcome-file apunte a guestbook.jsp Acceder a la ruta: http://localhost:8080/guestbook.jsp o http://localhost:8080/ Al cargar una JSP por primera vez, el servidor de desarrollo lo convierte en código fuente Java y, a continuación, compila este código en código de bytes de Java Al subir la aplicación a AppEngine, el SDK compila todas las JSP en código de bytes y únicamente sube el código de bytes.
  • 158. Uso de un JSP <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="com.google.appengine.api.users.User" %> <%@ page import="com.google.appengine.api.users.UserService" %> <%@ page import="com.google.appengine.api.users.UserServiceFactory" %> <html> <body><% UserServiceuserService = UserServiceFactory.getUserService(); Useruser = userService.getCurrentUser(); if (user != null) {%> <p>Hello, <%= user.getNickname() %>! (You can<a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">signout</a>.)</p><% } else {%> <p>Hello!<a href="<%= userService.createLoginURL(request.getRequestURI()) %>">Sign in</a>toincludeyournamewithgreetingsyou post.</p><% }%> </body>
  • 159. Formulario Libro Invitados La aplicación de libro de invitados necesita un formulario web para que el usuario publique un nuevo saludo, así como una forma de procesar ese formulario El código HTML del formulario se inserta en la JSP guestbook.jsp: <form action="/sign" method="post"> <div><textarea name="content" rows="3" cols="60"></textarea></div> <div><input type="submit" value="Post Greeting" /></div> </form>  El destino del formulario es una nueva URL, /sign, controlada por una nueva clase de servlet,SignGuestbookServlet que procesa el formulario y redirige a: /guestbook.jsp Es necesario modificar web.xml para crear una nueva entrada para este servlet, con los siguientes datos: <servlet> <servlet-name>sign</servlet-name> <servlet-class>guestbook.SignGuestbookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>sign</servlet-name> <url-pattern>/sign</url-pattern> </servlet-mapping>
  • 160. El Servlet que Procesa una Nueva Entrada en Libro packageguestbook; importjava.io.IOException; importjava.util.logging.Logger; importjavax.servlet.http.*; importcom.google.appengine.api.users.User; importcom.google.appengine.api.users.UserService; importcom.google.appengine.api.users.UserServiceFactory; publicclassSignGuestbookServletextendsHttpServlet { privatestatic final Logger log = Logger.getLogger(SignGuestbookServlet.class.getName()); publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsIOException{ UserServiceuserService = UserServiceFactory.getUserService(); Useruser = userService.getCurrentUser(); Stringcontent = req.getParameter("content"); if (content == null) { content = "(No greeting)"; } if (user != null) { log.info("Greetingpostedbyuser " + user.getNickname() + ": " + content); } else { log.info("Greetingpostedanonymously: " + content); } resp.sendRedirect("guestbook.jsp"); } }
  • 161. Logeo de Información con AppEngine El nuevo servlet utiliza la clase java.util.logging.Logger para escribir mensajes en el registro. Puedes controlar el comportamiento de esta clase a través de un archivo logging.properties y de un conjunto de propiedades del sistema en el archivo appengine-web.xml de la aplicación. Copia el archivo de ejemplo del SDK appengine-java-sdk/config/user/logging.properties en el directorio war/WEB-INF/ de la aplicación  Para modificar el nivel de registro de todas las clases del paquete guestbook, edita el archivo logging.properties y añade una entrada para guestbook.level, como se muestra a continuación: .level = WARNING guestbook.level = INFO A continuación edita el archivo war/WEB-INF/appengine-web.xml de la aplicación como se indica: <appengine-web-appxmlns="http://appengine.google.com/ns/1.0"> ... <system-properties> <propertyname="java.util.logging.config.file" value="WEB-INF/logging.properties"/> </system-properties> </appengine-web-app> Los ficheros de logeo se descargan con la consola de administración o la aplicación appcfg de AppEngine: https://appengine.google.com/logs
  • 162. Uso del Almacen de Datos JDO La infraestructura de AppEngine se encarga de todas las tareas de distribución, replicación y balanceo de carga de los datos de un API sencilla, además de ofrecer un potente motor de consulta y transacciones. Ofrece dos API: un API estándar y otra de nivel inferior. AppEnginefor Java permite el uso de dos estándares de API diferentes para el almacén de datos: Objetos de datos Java (JDO) y API de persistencia Java (JPA). Estas interfaces las proporciona DataNucleus Access Platform, una implementación de software libre de varios estándares de persistencia Java, con un adaptador para Google DataStore Utilizaremos la interfaz JDO para la recuperación y la publicación de los mensajes de los usuarios en el almacén de datos de AppEngine. Access Platformnecesita un archivo de configuración que le indique que debe utilizar el almacén de datos de AppEngine como servidor para la implementación de JDO: META-INF/jdoconfig.xml Documentación detallada de JDO puede encontrarse en: http://code.google.com/appengine/docs/java/datastore/
  • 163. Funcionamiento de JDO Al crear clases JDO, debes utilizar anotaciones Java para describir cómo se deben guardar las instancias en el almacén de datos y cómo se deben volver a crear al recuperarlas de dicho almacén. Access Platform conecta las clases de datos a la implementación mediante un paso de procesamiento posterior a la compilación, que DataNucleus denomina "mejora" de las clases. JDO permite almacenar objetos Java (a veces denominados "objetos Java antiguos y simples" o POJO) en cualquier almacén de datos con un adaptador compatible con JDO, como DataNucleus Access Platform El complemento Access Platform para el almacén de datos de AppEngine permite almacenar instancias de clases definidas en el almacén de datos de AppEngine Ejemplo: la clase Greeting representará mensajes individuales publicados en el libro de invitados de nuestra aplicación
  • 164. La Clase de Persistencia Greeting packageguestbook; importjava.util.Date; importjavax.jdo.annotations.IdGeneratorStrategy; importjavax.jdo.annotations.IdentityType; importjavax.jdo.annotations.PersistenceCapable; importjavax.jdo.annotations.Persistent; importjavax.jdo.annotations.PrimaryKey; importcom.google.appengine.api.users.User; @PersistenceCapable(identityType = IdentityType.APPLICATION) publicclassGreeting { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent privateUserauthor; @Persistent privateStringcontent; @Persistent private Date date; publicGreeting(Userauthor, Stringcontent, Date date) { this.author = author; this.content = content; this.date = date; } ... }
  • 165. La Clase de Persistencia Greeting Esta sencilla clase define tres propiedades para un saludo: author, content y date Estos tres campos privados presentan la anotación @Persistent, que indica a DataNucleus que debe almacenarlos como propiedades de objetos en el almacén de datos de AppEngine. La clase también define un campo llamado id, una clave Long que presenta dos anotaciones: @Persistent y @PrimaryKey. El almacén de datos de AppEngine tiene una noción de las claves de entidades y puede representar las claves de varias formas en un objeto. Más información sobre cómo definir modelos de datos puede encontrarse en: http://code.google.com/intl/es/appengine/docs/java/datastore/dataclasses.html
  • 166. Serializando datos con JDO Cada solicitud que utiliza el almacén de datos crea una nueva instancia de la clase PersistenceManager que se obtiene a través de PersistenceManagerFactory Una instancia de PersistenceManagerFactory tarda algún tiempo en inicializarse Afortunadamente, sólo se necesita una instancia para cada aplicación Creamos la clase singletonPMF para resolverlo: packageguestbook; importjavax.jdo.JDOHelper; importjavax.jdo.PersistenceManagerFactory; public final class PMF { privatestatic final PersistenceManagerFactorypmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional"); private PMF() {} publicstaticPersistenceManagerFactoryget() { returnpmfInstance; } } Para usarlo creamos una nueva instancia de Greeting mediante la ejecución del constructor. Para guardar la instancia en el almacén de datos, crea una clase PersistenceManager a través de PMF.get() e invocamos sobre él makePersistent()
  • 167. Serializando datos con JDO Dentro del fichero SignGuestBookServlet introduciríamos los siguientes cambios para serializar los saludos en AppEngineDataStore, a través de JDO: Stringcontent = req.getParameter("content"); Date date = new Date(); Greetinggreeting = new Greeting(user, content, date); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(greeting); } finally { pm.close(); }
  • 168. Consultando datos con JDO El estándar JDO define un mecanismo para consultas de objetos persistentes denominado JDOQL. Modificaremos guestbook.jsp para realizar la consulta introduciendo los siguientes cambios: <%@ page import="java.util.List" %><%@ page import="javax.jdo.PersistenceManager" %><%@ page import="guestbook.Greeting" %><%@ page import="guestbook.PMF" %> … <% PersistenceManager pm = PMF.get().getPersistenceManager(); String query = "select from " + Greeting.class.getName() + " order by date desc range 0,5"; List<Greeting> greetings = (List<Greeting>) pm.newQuery(query).execute(); if (greetings.isEmpty()) { %> <p>Theguestbook has no messages.</p> <% } else { for (Greeting g : greetings) { if (g.getAuthor() == null) { %> <p>Ananonymouspersonwrote:</p> <% } else { %> <p><b><%= g.getAuthor().getNickname() %></b> wrote:</p> <% } %> <blockquote><%= g.getContent() %></blockquote> <% } } pm.close(); %>
  • 169. Usando Ficheros Estáticos Hay muchos casos en los que querrás mostrar los archivos estáticos directamente en el navegador web: imágenes, vídeos Para una mayor eficiencia, AppEngine muestra los archivos estáticos desde servidores independientes en lugar de los que ejecutan servlets. AppEngine considera todos los archivos del directorio WAR como archivos estáticos, salvo JSP y los archivos de WEB-INF/ Cualquier solicitud de una URL cuya ruta coincida con un archivo estático lo muestra Puedes configurar los archivos que quieres que AppEngine considere como archivos estáticos a través del archivo appengine-web.xml La siguiente página da más información al respecto: http://code.google.com/intl/es/appengine/docs/java/config/appconfig.html Para este ejemplo: Crear main.css con el siguiente contenido: body { font-family: Verdana, Helvetica, sans-serif; background-color: #FFFFCC; } Añadir a guestbook.jsp lo siguiente: <head> <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" /> </head>
  • 170. Creando de Objetos y Claves Para almacenar un objeto de datos sencillo en el almacén de datos, ejecuta el método makePersistent() del PersistenceManager y transfiérelo a la instancia. PersistenceManager pm = PMF.get().getPersistenceManager(); Employee e = new Employee("Alfred", "Smith", new Date()); try { pm.makePersistent(e); } finally { pm.close(); } Las claves más sencillas están basadas en los tipos Long o String, pero también se pueden crear con la clase Key. importcom.google.appengine.api.datastore.Key; importcom.google.appengine.api.datastore.KeyFactory; // ... Key k = KeyFactory.createKey(Employee.class.getSimpleName(), "Alfred.Smith@example.com"); Para recuperar un elemento por clave podemos usar lo siguiente, se puede pasar como segundo argumento una clave, un entero o un string: Employee e = pm.getObjectById(Employee.class, "Alfred.Smith@example.com");
  • 171. Actualización y Borrado de Objetos El siguiente código muestra cómo actualizar un objeto persistente: publicvoidupdateEmployeeTitle(Useruser, StringnewTitle) { PersistenceManager pm = PMF.get().getPersistenceManager(); try {  Employee e = pm.getObjectById(Employee.class, user.getEmail());    if (titleChangeIsAuthorized(e, newTitle) {    e.setTitle(newTitle);    } else {    throw new UnauthorizedTitleChangeException(e, newTitle);    } } finally {  pm.close(); } } El siguiente ejemplo muestra cómo borrar un objeto: pm.deletePersistent(e);
  • 172. Realizando Consultas con JDO JDOQL es similar a SQL, aunque es más adecuado para bases de datos relacionadas con objetos, como, por ejemplo, el almacén de datos de AppEngine. Dos usos diferentes: Puedes especificar parte o la totalidad de la consulta mediante métodos de ejecución en el objeto de consulta importjava.util.List; importjavax.jdo.Query; // ... Queryquery = pm.newQuery(Employee.class); query.setFilter("lastName == lastNameParam"); query.setOrdering("hireDatedesc"); query.declareParameters("StringlastNameParam"); try { List<Employee> results = (List<Employee>) query.execute("Smith"); if (results.iterator().hasNext()) { for (Employee e : results) { // ... } } else { // ... no results ... } } finally { query.closeAll(); }
  • 173. Realizando Consultas con JDO Puedes especificar una consulta completa en una cadena mediante la sintaxis de cadena JDOQL: Queryquery = pm.newQuery("selectfromEmployee " +    "wherelastName == lastNameParam " +    "orderbyhireDatedesc " +    "parametersStringlastNameParam"); List<Employee> results = (List<Employee>) query.execute("Smith"); Otro modo: Queryquery = pm.newQuery(Employee.class,    "lastName == lastNameParamorderbyhireDatedesc"); query.declareParameters("StringlastNameParam"); List<Employee> results = (List<Employee>) query.execute("Smith"); Query query = pm.newQuery(Employee.class,    "lastName == 'Smith' order by hireDatedesc");
  • 174. Filtros y Restricciones en Consultas JDO sobre AppEngine Algunos ejemplos de filtros son: query.setFilter("lastName == 'Smith' && hireDate > hireDateMinimum"); query.declareParameters("Date hireDateMinimum"); Queryquery = pm.newQuery(Employee.class,    "(lastName == 'Smith' || lastName == 'Jones')" +    " && firstName == 'Harold'"); ATENCIÓN: importantes restricciones en las consultas, revisar: http://code.google.com/intl/es/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries Ejemplo: Los filtros de desigualdad sólo están permitidos en una propiedad
  • 175. Ejemplo Objeto Serializable La siguiente clase define un objeto que puede serializarse en JDO: importjava.io.Serializable; publicclassDownloadableFileimplementsSerializable{ private byte[] content; privateStringfilename; privateStringmimeType; // ... accessors ... } La siguiente clase define cómo usarlo: importjavax.jdo.annotations.Persistent; importDownloadableFile; // ... @Persistent(serialized = "true"); privateDownloadableFilefile;
  • 176. Ejemplo Relación 1 a 1 entre Entidades importcom.google.appengine.api.datastore.Key; // ... imports ... @PersistenceCapable publicclassContactInfo { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent privateStringstreetAddress; @Persistent privateStringcity; @Persistent privateStringstateOrProvince; @Persistent privateStringzipCode; // ... accessors ... } importContactInfo; // ... imports ... @PersistenceCapable publicclassEmployee { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent privateContactInfomyContactInfo; // ... accessors ... }
  • 177. Relaciones Uno a Varios Ejemplo de relación bidireccional uno a varios: // Employee.java importjava.util.List; // ... @Persistent private List<ContactInfo> contactInfoSets; // ContactInfo.java importEmployee; // ... @Persistent privateEmployeeemployee;
  • 178. Relaciones Varios a Varios Ejemplo de relación varios a varios, sólo se puede hacer guardando colecciones de claves en ambas relaciones implicadas: //Person.java importjava.util.Set; importcom.google.appengine.api.datastore.Key; // ... @Persistent private Set<Key> favoriteFoods; //Food.java importjava.util.Set; importcom.google.appengine.api.datastore.Key; // ... @Persistent private Set<Key> foodFans; // Album.java // ... publicvoidaddFavoriteFood(Foodfood) { favoriteFoods.add(food.getKey()); food.getFoodFans().add(getKey()); } publicvoidremoveFavoriteFood(Foodfood) { favoriteFoods.remove(food.getKey()); food.getFoodFans().remove(getKey()); }
  • 179. Características Avanzadas de Google AppEngine Planificación de tareas con Cron for Java http://code.google.com/appengine/docs/java/config/cron.html Memcache Java API http://code.google.com/appengine/docs/java/memcache/overview.html URL Fech Java API http://code.google.com/appengine/docs/java/urlfetch/overview.html Envío de mensajes instantáneos con XMPP e email http://code.google.com/appengine/docs/java/xmpp/overview.html Colas de tareas – permite ejecutar asíncronamente tareas http://code.google.com/appengine/docs/java/taskqueue/overview.html
  • 180. Planificación de Tareas con Cron El servicio AppEngine Cron Service permite planificar tareas que se ejecutan en un momento o periodos determinados. Los trabajos cron (cron jobs) son ejecutados por AppEngine Cron Service Algunos ejemplos de uso serían: Envío de email con informe diario Actualización de tu caché de datos cada 10 minutos Documentación en: http://code.google.com/appengine/docs/java/config/cron.html Formato de las planificaciones: ("every"|ordinal) (days) ["of" (monthspec)] (time)
  • 181. Planificación de Tareas con Cron El fichero WEB-INFron.xmlcontrolacronparatuaplicación: <?xmlversion="1.0" encoding="UTF-8"?> <cronentries> <cron> <url>/recache</url>  <description>Repopulatethe cache every 2 minutes</description>  <schedule>every 2 minutes</schedule></cron><cron> <url>/weeklyreport</url>  <description>Mail out a weeklyreport</description>  <schedule>everymonday 08:30</schedule>  <timezone>America/New_York</timezone></cron> </cronentries>
  • 182. Memcache Java API Las aplicaciones web escalables de alto rendimiento utilizan a menudo una caché distribuida de datos integrados en memoria delante o en lugar de un sistema de almacenamiento complejo permanente para algunas tareas AppEngine incluye un servicio de memoria caché El API Java de Memcache implementa la interfaz JCache (javax.cache), un estándar en formato borrador descrito en JSR 107 JCache proporciona una interfaz en forma de mapa para recopilar datos Puedes almacenar y recuperar valores de la memoria caché mediante las claves Controlar cuándo los valores vencen en la memoria caché Inspeccionar el contenido de la memoria caché y obtener estadísticas sobre ella Utilizar "funciones de escucha" para añadir un comportamiento personalizado al establecer y borrar valores.
  • 183. Pasos para Hacer uso de Memcache Obtención y configuración de una instancia de Cache, para ello hay que configurar los parámetros del método createCache importjavax.cache.Cache; importjavax.cache.CacheException; importjavax.cache.CacheFactory; // ... Cache cache; try { Mapprops = new Map; props.put(GCacheFactory.EXPIRATION_DELTA, 3600); props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true); CacheFactorycacheFactory = CacheManager.getInstance().getCacheFactory(); // cache = cacheFactory.createCache(Collections.emptyMap()); cache = cacheFactory.createCache(props); } catch (CacheException e) { // ... } Establecimiento y obtención de valores. Se comporta como un mapa Puedes almacenar claves y valores a través del método put() y recuperar valores con el método get() Otros métodos de interés son: remove(), clear(), containsKey(), isEmpty() y size() Más documentación en: http://code.google.com/intl/es/appengine/docs/java/memcache/usingjcache.html
  • 184. URL Fetch Java API GAE permite realizar conexiones HTTP y HTTPS a través del servicio URL Fetch, que en el caso de GAE for Java se implementa mediante la clase java.net.URLConnection La funcionalidad que da es: Acceso sencillo a los contenidos de una página mediante java.net.URL y el método openStream() El método openConnection() de java.net.URL devuelve una instancia de HttpURLConnection, sobre la que se puede hacer getInputStream() y getOutputStream() Se pueden cambiar propiedades de la conexión como: Añadir cabeceras: connection.setRequestProperty("X-MyApp-Version", "2.7.3"); Modificar el hecho de que las peticiones se redirijan directamente: connection.setRequestProperty("X-MyApp-Version", "2.7.3"); Más detalles en: http://code.google.com/intl/en/appengine/docs/java/urlfetch/usingjavanet.html
  • 185. Mail Java API Una aplicación en AppEngine puede enviar mensajes en representación del administrador de la página o de usuarios autorizados con cuentas Google La Mail Service Java API hace uso de javax.mail Se puede configurar tu aplicación para recibir mensajes en una dirección con el formato string@appid.appspotmail.com Cuando una aplicación se ejecuta en el servidor de desarrollo, el mensaje enviado se imprime en el log, no se envía
  • 186. Enviando un Mensaje ... importjava.util.Properties; importjavax.mail.Message; importjavax.mail.MessagingException; importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.internet.AddressException; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeMessage; // ... Propertiesprops = new Properties(); Sessionsession = Session.getDefaultInstance(props, null); StringmsgBody = "...“; try { Messagemsg = new MimeMessage(session); msg.setFrom(new InternetAddress("admin@example.com", "Example.com Admin")); msg.addRecipient(Message.RecipientType.TO,                             new InternetAddress("user@example.com", "Mr. User")); msg.setSubject("Your Example.com account has beenactivated"); msg.setText(msgBody); Transport.send(msg); } catch (AddressException e) { // ... } catch (MessagingException e) { // ... }
  • 187. Recibiendo un Mensaje Los pasos a seguir son: Configurar tu aplicación para ser receptora de email en la dirección: string@appid.appspotmail.com Modificando el fichero appengine-web.xml: <inbound-services> <service>mail</service> </inbound-services> Modificando el fichero web.xml, que recibirá mensajes en la siguiente dirección: /_ah/mail/<address> <servlet> <servlet-name>mailhandler</servlet-name> <servlet-class>MailHandlerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mailhandler</servlet-name> <url-pattern>/_ah/mail/*</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <url-pattern>/_ah/mail/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
  • 188. Recibiendo un Mensaje Los pasos a seguir son: Crear un servlet que reciba los mensajes importjava.io.IOException; importjava.util.Properties; importjavax.mail.Session; importjavax.mail.internet.MimeMessage; importjavax.servlet.http.*; publicclassMailHandlerServletextendsHttpServlet{ publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsIOException { Propertiesprops = new Properties(); Sessionsession = Session.getDefaultInstance(props, null); MimeMessagemessage = new MimeMessage(session, req.getInputStream()); … }
  • 189. TaskQueue API Una aplicación Java puede crear una cola configurada en el fichero de configuración WEB-INF/queue.xml  Para encolar una tarea, hay que obtener una instancia de Queue usando una QueueFactory y luego invocar el método add() Puedes obtener una cola por nombre declarada en el fichero queue.xml o la cola por defecto con el método getDefaultQueue() Se puede añadir una tarea a la cola pasando una instancia de TaskOptions al método add() Se invocará un servlet que será quien ejecute la tarea encolada (ver ejemplo siguiente trasparencia) Espacio de nombres en versión beta: com.google.appengine.api.labs.taskqueue
  • 190. Ejemplo de TaskQueue API El siguiente ejemplo muestra cómo añadir una tarea a una cola: importcom.google.appengine.api.labs.taskqueue.Queue; importcom.google.appengine.api.labs.taskqueue.QueueFactory; importstaticcom.google.appengine.api.labs.taskqueue.TaskOptions.Builder.*; // ... Queuequeue = QueueFactory.getDefaultQueue(); queue.add(url("/worker").param("key", key));
  • 191. Ejemplo de TaskQueue API Ejemplo de queue.xml, donde s indica segundos, m minutos, h horas y d días, es decir, la frecuencia con la que las tareas encoladas serían procesadas: <queue-entries>  <queue>    <name>default</name>    <rate>1/s</rate>  </queue>  <queue>    <name>mail-queue</name>    <rate>2000/d</rate>    <bucket-size>10</bucket-size>  </queue>  <queue>    <name>background-processing</name>    <rate>5/s</rate>  </queue></queue-entries>
  • 192. Combinando Struts2 y GAE Revisar ejemplo: struts2tutorial Modificaciones a realizar en la distribución de struts2tutorial: Reimplementar la clase freemarker.core.TextBlock Inicializar a null el SecurityManager de OgnlRuntime Explicación de cómo hacerlo en: http://whyjava.wordpress.com/2009/08/30/creating-struts2-application-on-google-app-engine-gae/
  • 193. Pluginfor Eclipse for Java Instrucciones en: http://code.google.com/eclipse/docs/download.html Descarga Eclipse Galileo for Java Developers de: http://www.eclipse.org/downloads/
  • 194. Importación y Exportación de Datos Se pueden acceder a datos detrás de tu Intranet desde una aplicación de Google AppEngine, con Google Secure Data Connector y el servicio urlfetch (com.google.appengine.api.urlfetch.*) http://code.google.com/intl/en/securedataconnector/docs/1.3/tutorials/appengine.html Se pueden importar y exportar datos del datastore en forma de ficheros CSV Solamente disponible en Python de momento: http://code.google.com/appengine/docs/python/tools/uploadingdata.html
  • 195. Google AppEnginefor Business Las aplicaciones generadas con AppEnginefor Business usan las APIs de Java y Python, pero permiten acceder al desarrollador a capacidades especiales (premium): Acceso a SSL y SQL Tendrán un coste adicional Mas información en: http://code.google.com/appengine/business/
  • 196. Limitaciones Google AppEngine El servicio tiene varias limitaciones: Solo hasta recientemente no todo el mundo podía acceder a él Es gratis durante el periodo de pruebas, pero con límites de uso: 500 MB de almacenamiento, 200 millones de megaciclos/día y 10 Gb de ancho de banda Google cobra para webs que requieren alta escalabilidad Existen escasas aplicaciones comerciales desarrolladas en esta plataforma Repositorio de ejemplos: http://appgallery.appspot.com/ VOSAO CMS - http://www.vosao.org/ Limitaciones técnicas originales parcialmente resueltas: Los desarrolladores solamente tienen acceso de lectura al sistema de ficheros de AppEngine Solamente se puede ejecutar código a partir de una petición HTTP Solamente se puede subir código puramente Python (resuelto con soporte Java) No se puede descargar o ejecutar scripts en su base de datos (remote_api) Las aplicaciones deben ser escritas en Python o Java Guido van Rosum, creador de Python está detrás de Google AppEngine
  • 197. Google App Engine vs. Amazon Web Services A primera vista Google AppEngine es un competidor a la suite de servicios web ofrecida por Amazon: S3 para almacenamiento EC2 para la creación de servidores virtuales SimpleDB como base de datos Pero … Google AppEngine es una plataforma mucho más acoplada y menos flexible Si quieres hacer uso de BigTable tienes que escribir y desplegar un script de Python a su servidor de aplicaciones ofreciendo una interfaz web accesible a BigTable (resuelto parcialmente)
  • 198. Google App Engine vs. Amazon Web Services
  • 199. Microsoft’s Windows AzurePlatform Windows Azure es un servicio utilizado para ejecutar aplicaciones y guardar datos en máquinas de Microsoft accesibles vía Internet Proporciona tres componentes: El servicio Compute ejecuta aplicaciones con web role y worker role El servicio Storage permite guarda datos como blobs, tables y queues El Windows AzureFabricproporciona una API para gestionar y monitorizar aplicaciones que usan la plataforma Azure Más información en: http://www.microsoft.com/windowsazure
  • 201. Comparativa AWS, GAE y Azure AWS es IaaS pero cada vez con más características de PaaS GAE y Azure son PaaS que permiten la creación de aplicaciones (GAE sólo web) en la infraestructura Cloud de Google y Microsoft, respectivamente AWS te permite usar tus herramientas favoritas, aunque recomienda su uso de servicios escalables de almacenamiento, bases de datos o mensajes a través de interfaces REST GAE es muy sencillo pero exige el uso de las APIs exclusivas provistas por Google, aunque están basadas en estándares de facto de la industria Azure no limita el uso de .NET para las aplicaciones desplegadas aunque lo promociona Comparativa detallada en: http://blog.kitetail.com/wp-content/uploads/2010/03/Comparison-CloudOffering.pdf
  • 202. Patrones de Diseño en Cloud Computing Fuente: http://architects.dzone.com/news/cloud-computing-patterns Usar la nube para el escalado Usar en cada momento sólo los recursos necesarios Dos mecanismos: Passivelistenermodel Active workermodel Compartir la nube entre varios usuarios
  • 203. Patrones de Diseño en Cloud Computing Usar la nube para batchprocessing Usar la nube para almacenamiento Usar la nube para comunicación
  • 204. Ventajas de Cloud Computing Ahorros de costes en IT empresariales Ordenadores de bajo coste para los usuarios Costes más bajos en infraestructura IT Costes de software más bajos Mejora del rendimiento global Elasticidad para conseguir una escalabilidad superior Menos problemas en mantenimiento Actualizaciones inmediatas de software Capacidad de almacenamiento ilimitada Incremento de la seguridad de los datos (safety)
  • 205. Desventajas de Cloud Computing Requiere una conexión a Internet continua y rápida Puede ofrecer bastante latencia Características disponibles todavía limitadas Falta de confianza Los datos guardados pueden ser accedidos por otros Nuestros datos ya no están en la empresa Problemas legales (LODP): Safe Harbor Dependencia tecnológica en otras compañías ajenas Si la nube pierde los datos, ¡estás perdido!
  • 206. Conclusiones Cloud Computing nos ofrece un nuevo paradigma para alojar nuestros sistemas de información, aplicaciones y datos en la nube de Internet Son muchas las ventajas potenciales de este enfoque Ahorro de costes, pago por uso Escalabilidad exponencial PERO también muchos los riesgos para su implantación global inmediata Falta de control sobre nuestros datos y sistemas Relativa baja madurez de los productos que hacen posible Cloud Computing Ahora están surgiendo las herramientas y plataformas, pero tenemos que trabajar en patrones de diseño para asegurarnos buenas prácticas en Cloud Computing El futuro inmediato de los sistemas de información empresarial combinará los enfoques tradicionales, donde los sistemas y datos se ejecutan en infraestructura propia, con un paulatino e incremental despliegue de datos y aplicaciones a la nube.
  • 207. Referencias Cloud Computing – DisruptiveInnovation & EnablingTechnology http://blog.gogrid.com/2008/08/20/presentation-cloud-computing-disruptive-innovation-enabling-technology Cloud Computing and Amazon Web Services http://www.slideshare.net/aditya_n_jha/cloud-computing-and-amazon-web-services-presentation Architecting for the Cloud: Best Practices http://www.slideshare.net/AmazonWebServices/aws-architectingdesantislondon Are You Ready for Computing in the Cloud? http://www.informit.com/articles/article.aspx?p=1234970 Is Cloud Computing Ready for the Enterprise? http://www.3tera.com/download/Forrester-Cloud-computing-report080307.pdf
  • 208. Referencias Amazon Web Services http://aws.amazon.com/ Developing With Amazon Web Services - Highly Scalable Services that are Someone Else's Headache to Maintain and Develop http://www.slideshare.net/javasymposium/developing-with-amazon-web-services-highly-scalable-services-that-are-someone-elses-headache-to-maintain-and-develop How to Setup Amazon S3 with CloudFront as a Content Delivery Network http://www.labnol.org/internet/setup-content-delivery-network-with-amazon-s3-cloudfront/5446/ Google AppEngine http://code.google.com/appengine/ Microsoft Windows AzurePlatform http://www.microsoft.com/windowsazure
  • 209. To Cloud or not Cloud, That is the Question! 22 Noviembre de 2010, 9:00-14:00 BizkaiaEnpresaDigitala, Parque Tecnológico de ZamudioEdificio ESI, #204 Dr. Diego Lz. de Ipiña Glz. de Artazadipina@deusto.eshttp://paginaspersonales.deusto.es/dipinahttp://www.slideshare.net/dipina

Notas do Editor

  1. Message:The future consists of services (the boxes on the ring) and users of services (the others).All interaction is free without central controlStandards are needed for the interactionsIs there a need for a platform / infrastructure to coordinate interactions?SAP Services mantra: Services will become tradable, composed from services of different providers, be offered, delivered &amp; executed automatically &amp; supported by ITThe Internet of Services will offercustomized &amp; personalized servicescommunity involvement to improve services, both for providers &amp; consumers of services seamless &amp; smooth adaptation and integration of services into the user environment These network infrastructures need to support an Internet of dynamically combined services with worldwide service delivery platforms and flexibly enable the creation of opportunities for new market entrant. The &apos;third party generated service&apos; is emerging as a trend supporting the move towards user-centric services, as shown by the advances in Service-Oriented-Architectures and in service front-ends as the interface to users and communities. Virtualisation of resources remains an important research driver enabling the delivery of networked services independently from the underlying platform, an important issue for service providers. Advances in these domains also require breakthroughs in software engineering methods and architectures addressing complexity in distributed, heterogeneous and dynamically composed environments, as well as non-functional requirements.