What's our plan?
Establish a cloudy baseline
we need some common understanding and terminology
Examine a half-dozen vendors
keeping in mind this is NOT a complete list
Draw no judgments!
which you choose is entirely up to you
like most IT terms, it's ridiculously vague
my "cloud" and your "cloud" are almost guaranteed to mean different things
Consumer cloud vs. Developer cloud
vs. IT cloud vs. Management cloud vs ...
industry has established a few core terms...
... but they're consistent only at very vague/strategic levels
"it's not your problem"
third-party providers take IT load off your shoulders
this can be hardware, infrastructure, whatever
"economies of scale"
cloud providers can afford to invest in infrastructure
you wouldn't (or couldn't)
"Fire them!"
cloud providers take IT costs off your shoulders
... including people and their associated costs
"Get more!"
acquiring additional resources is trivial
cloud providers will already have a pool to draw from
pool will be installed and ready to go
"Maintain it!"
cloud providers handle maintenance/upgrades/etc
cloud providers handle monitoring, recovery, etc
... and more along these lines
Let's come to agreement on a few terms
Without this, we're shooting past each other
These are my accepted definitions
but it's my talk, so deal with it
More importantly, this gives us a starting point
Important foundataional terms
"dirt": literally, who owns the ground on which the servers reside
"hardware": the actual computing machinery
"commodity": no difference between same offering from more than one vendor
"elasticity": ability to scale up/down
"as-a-service": "It's not directly under your control"
Cloud "models"
Public cloud
it's hosted on the cloud provider's dirt on their hardware
older versions were called "hosting"
Community cloud
shared by several organizations in support of a single community
typically a particular-purpose public cloud with costs shared
Private cloud (or "enterprise private cloud")
adds cloud-like support (virtualization, etc) on-premises
it's hosted on your dirt on your hardware
this also used to be called "server rooms"
Cloud "models"
Virtual private cloud
private to you
hosted on cloud provider's dirt on their hardware
Hybrid cloud
a combination of private and public cloud
Co-location
your hardware, their dirt
Vendor platform
a vendor extends their app/tool/etc into the cloud space
typically through the public release of an API
Cloud "models"
PaaS: Platform-as-a-Service
hardware, OS
IaaS: Infrastructure-as-a-Service
compute, storage, networking,
SaaS: Software-as-a-Service
generic term covering anything specific "as-a-Service"
"verticals": very specific niche services
authentication, databases, functions, etc
Cloud "services"
Compute
CPUs, processing, etc
Storage
SQL, NoSQL, all modes in between
Communications
Messaging-oriented middleware, REST, etc
Networking
physical and virtual connections
Acquisition
bringing up more hardware resources
Cloud "platform services"
Analytics
big data, big data analytics
Deployment
putting "stuff" into where it needs to go
Management
dashboards, statistics, trend analysis
Mobile-specific services
sync, push notifications
collection of services providing cloud-based functionality
Amazon offering
wide variety of services (IaaS, PaaS, SaaS)
to many, the "gold standard" of cloud offerings
Compute and Networking Services
EC2, virtual private cloud, etc
Storage and Content Delivery
S3, CloudFront (CDN), Instance Store, Elastic Block Store (EBS), Glacier (vault storage)
Database Services
Relational Database Services (RDS), Redshift (Big Data), DynamoDB, ElastiCache
Analytics Services
Elastic MapReduce (EMR), Data Pipeline, Kinesis
App Services
Message Queues, Notifications, Workflows, Email, Search, Streaming, Transcoding
Deployment Services
Elastic Beanstalk, CloudFormation, CodeDeploy, OpsWorks
Management Services
this list is constantly changing
keep track via their documentation page
docs are also accessible as Kindle books
which makes a lot of sense, actually
growing support for Docker containers
likely to be a lot of churn/enhancement here
.NET (NuGet, GitHub and standalone download)
VisualStudio integration
Java (Maven, GitHub and standalone download)
Eclipse integration
JavaScript
Ruby
Command-line tools
also includes PowerShell
many services also accessible via HTTP API calls
most of these will require crypto hashing sent as part of HTTP headers
for this reason, it's usually easier to use the SDKs
see the AWS documentation page
http://aws.amazon.com/documentation/
Microsoft Azure
Microsoft's Cloud implementation
supports IaaS, PaaS and SaaS
wide variety of plugins/services
portal-based access
command-line access (NodeJS or PowerShell)
Azure Offerings
Compute: Virtual Machines, Websites, Cloud Services
Data: SQL, Storage (Blogs, Tables, Files)
Networking
Development Services: Visual Studio Online
Identify and Access: ActiveDirectory, Multi-Factor Authentication
Mobile Services, Notification Hubs
Azure Offerings
Backup
Messaging: Service Bus, BizTalk, Storage Queues
Big Data/Big Compute
Media Services
... plus a few more things
Azure Offerings
this list is constantly changing
keep track via the Azure documentation page
fledgling support for Docker
currently appears to be just for Linux VMs on Azure
Azure SDKs
.NET
VisualStudio integration
Java
Eclipse integration
NodeJS/Javascript
Mobile
PHP
Ruby
Command-line tools (PoSh and Node/npm)
Azure Offerings
See the Azure docs for a complete introduction
http://azure.microsoft.com/en-us/documentation/articles/fundamentals-introduction-to-azure/
Google Cloud Platform
Google knows scale, so....
wide variety of services (mostly PaaS and SaaS)
highly integrated with Android
Google Cloud offerings
Compute
Compute Engine: large-scale compute
App Engine: traditional PaaS
Container Engine: Docker
Managed VMs: managed platform for Docker-based apps
Storage
Cloud Datastore: NoSQL
Cloud SQL: SQL
Cloud Storage: large-scale opaque binaries
Cloud Spanner: SQL-at-scale
Google Cloud offerings
Big Data
BigQuery: big data query language
Dataflow: data-processing pipelines
Cloud Pub/Sub: messaging
Networking
Load Balancing: balance between Compute Engine instances
Interconnect: VPN to Google direct
Cloud DNS: manage DNS records
Authentication: use OAuth 2.0 to manage federated authentication
Google Cloud offerings
Services
Cloud endpoints: HTTP APIs for mobile clients
Translate API: language translation
Prediction API: machine learning algorithms
Management
Cloud Monitoring
Cloud Deployment Manager
Google Cloud SDKs
technically just one SDK: "gcloud" (CLI)
Java, .NET, Obj-C, Python
Javascript, PHP (beta)
Dart, Go, NodeJS, Ruby (alpha)
many are also accessible as Web APIs
For more information...
see the Google Cloud Platform documation
https://cloud.google.com/docs/
SalesForce is a cloud-hosted vertical CRM
custom application extensions
hosted storage
Apex programming language (Java-based)
hosted UI solutions
mobile-friendly
Force.com: SalesForce's PaaS play
multitenant
easy access to SalesForce apps/data/UIs
workflow services (Process Builder)
hosted storage (relational database, objects)
UI integration (Visualforce)
Apex language (some integration w/Java)
reporting baked in
Heroku
a "Platform-as-a-Service" aimed at developers
variety of platforms available
NodeJS, Ruby, Java, PHP, Python, Scala, Clojure, Go
deploy through Git
offers variety of free/paid plugins
offers an API for the cloud itself
Heroku plugins
always in flux, check the website
Plugin list includes (but not limited to):
AppDynamics, Auth0, Autobus, Bablic, Beekeeper Data, binnacle, Blackfire.io, Blitline, Blower.io SMS, Bonsai Elasticsearch, ClearDB MySQL, CloudAMQP, CloudBoost, CloudKarafka, Compose MongoDB, Elasticsearch, Elegant CMS, Fastly, Filestack, Force.com Dev Hub Integration, GrapheneDB, Heroku Scheduler, IronCache, IronMQ, JawsDB Maria, JawsDB MySQL, Keen IO, Logmatic.io, Mailgun, Memcached Cloud, mLab MongoDB, New Relic APM
Heroku Platform API
https://devcenter.heroku.com/categories/platform-api
List includes (but not limited to):
Account, Add-on, App, Application Formation Set, App Setup, App Transfer, Build, Buildpack Installations, Collaborator, Config Vars, Credit, Domain, Dyno, Event, Failed Event, Filters, Formation, Identity Provider, Inbound Ruleset, Invitation, Invoice, Log Drain, Log Session, OAuth, Organization, Outbound Ruleset, PasswordReset, Pipeline, Plan, Rate Limit, Region, Release, Slug, SMS Number, SNI Endpoint, Source, Space, SSL Endpoint, Stack, Team, User Preferences
a "Platform-as-a-Service" aimed at developers
based on .NET platform
deploy through Git
offers ASP.NET, SQLServer, and other plugins
offers variety of free/paid plugins
offers an API for the cloud itself
always in flux, check the website
Plugin list includes:
Airbrake, Appfail, Blitline, blitz, CloudAMQP, Cloudinary, CloudMailin, Dedicated mySQL, Dedicated SQLServer, ElephantSQL, Found Elasticsearch, Hosted Graphite, IronMQ, Librato, loader.io, Logentries, Mailgun, Memcached Cloud, Memcacher, MemCachier, MongoHQ, Mongolab, MySQL, NewRelic, RabbitMQ Bigwig, RavenHQ, Redis Cloud, Redis ToGo, Searchify Hosted Search, Searchly Elasticsearch, SendGrid, Spreedly, SQL Server, StatsMix, StillAlive, SVNSailor
APIs for driving the cloud itself (provisioning, configuring, etc)
List:
OAuth 2
Applications
Builds
Collaborators
Errors
Config Variables
Hostnames
Service Hooks
Users
Tests
Log Session
Drains
Meteor (meteor.com) is an all-Javascript stack
Think AngularJS + NodeJS + Mongo + other support
Can either host with Meteor's cloud...
... or bundle as a Node/Mongo app and host elsewhere
Includes command-line tools and ecosystem (Atmosphere)
Meteor's core concepts:
develop in one language
data on the wire (not HTML)
embrace the ecosystem (NodeJS/npm)
full-stack reactivity
Meteor buzzword bingo:
Pure JavaScript
Live page updates
Clean, powerful data synchronization
Latency compensation
Hot Code Pushes
Sensitive code runs in privileged environment
Fully self-contained application bundles
Interoperability
Smart packages
Meteor architecture:
Client-side: HTML, CSS, JS
"Blaze" (Meteor's own)
AngularJS
React
Server-side: NodeJS + middleware packages
Database: MongoDB
What is the Cloud to you?
virtualization of resources?
opportunities for outsourcing?
faster development due to quicker server spin-up?
an automated failover system?
Cloud doesn't eliminate the Fallacies of Distributed Computing, just changes the concerns a bit
Tenancy and instancing
Resource elasticity
Geo-distribution
Customer relationships
Recoverability and fault-tolerance
Cloud doesn't eliminate the Fallacies of Distributed Computing, just changes the concerns a bit
Cost structures
Data storage and retrieval
Testing
Upgrades and deployments
Flexibility
Diagnostics, debugging and monitoring
Fundamental models of Cloud apps:
Single-tenant, single-instance
(AKA "big honkin' server")
Multi-tenant, single-instance
Single-tenant, multi-instance
(AKA instance-per-tenant)
Multi-tenant, multi-instance
it's about quickly spinning servers up, true
it's also about spinning them down
load-testing
DDoS attacks
the non-technical components of the business
do you care?
lots of server apps written without concern to topology, or assuming a single fixed topology
remember that Cloud providers can move machines around without telling you
how does this change your programming model?
remember that latency is not zero!
Your customers are your customers
... and you are a Cloud customer
write SLAs accordingly
examine legal and regulatory requirements carefully
Cloud providers usually admin the server better than you...
... but when the servers go down, it's a BFD
... and usually it's not just a "reboot the server" fix
build architectures that minimize dependencies
build "watertight compartments"
build the Cloud app as the back-end, not the front-end
... and contrary to popular opinion, it's rarely cheaper!
Cap-ex vs Op-ex
be aware of tax breaks, budget structures, etc
Be aware that lots of different costs come up:
uptime
receiving a request
sending a response
dropping a message in a queue
writing to a BLOB
writing to a table
More importantly, how would your app's costs change if the pricing model changed?
Do the math! $.12 doesn't sound like much, but it adds up
and keep an eye on the dashboard to avoid surprise end-of-the-month costs
BLOBs offer some schema flexibility
Pro: no more database upgrades!
Con: no more database validation!
Tables offer more support and interoperability
Pro: less complicated code!
Con: schemas! schemas aren't yours anymore!
Keep OLAP and OLTP separate
Note that "unit" testing takes on a whole new complexity here
do yo mock out the cloud, or just use it?
Unit-testing the components on the developer machine may result in subtle differences
Judicious use of mocking here can help eliminate surprises
Whole-application-testing/acceptance-testing should be done in another cloud environment (not a dev environment) provisioned similarly
In other words, treat testing exactly as you would for Production servers
When upgrading, does your upgrade require...
restarted instances?
reprovisioning the instances?
changing the instance mappings (DNS, etc)?
... and if so, how will it be handled?
OS version, platform (JVM, .NET Framework, etc) version
Virtual machine size
Application configuration settings
and so on
Great--does your Cloud provider support it?
custom bits on those instances resists that strategy
this may completely screw up your Cloud strategy
For starters, you're not sitting in front of the machine
Never use the console or other home-grown mechanisms
Practice debugging the app while it's in the Cloud
Instrumenting the app with your own instrumentation
Cloud is everywhere
it should be your default choice
but not your only choice
as a developer, we have a choice about the degree of "cloudiness" we want when developing greenfield apps
but be concerned about various things
each cloud provider is unique
their offerings
their "culture"
their pricing
... so be sure to evaluate carefully
Who is this guy?
Architect, Engineering Manager/Leader, "force multiplier"
Principal -- Neward & Associates
http://www.newardassociates.com
Educative (http://educative.io) Author
Performance Management for Engineering Managers
Author
Professional F# 2.0 (w/Erickson, et al; Wrox, 2010)
Effective Enterprise Java (Addison-Wesley, 2004)
SSCLI Essentials (w/Stutz, et al; OReilly, 2003)
Server-Based Java Programming (Manning, 2000)