Is it possible to locally create a single AMI file of say Debian Jessie and use it directly (or with little changes) on any AMI-compatible cloud service providers (eg. AWS, CloudStack, Digital Ocean or Rackspace)?
Create local AMI file for future use on various cloud service
amazon-amiamazon-web-servicescloud computingcloudstackrackspace
Related Solutions
An AMI, as you note, is a machine image. It's a total snapshot of a system stored as an image that can be launched as an instance. We'll get back to AMIs in a second.
Lets look at EBS. Your other two items are sub-items of this. EBS is a virtual block device. You can think of it as a hard drive, although it's really a bunch of software magic to link into another kind of storage device but make it look like a hard drive to an instance.
EBS is just the name for the whole service. Inside of EBS you have what are called volumes. These are the "unit" amazon is selling you. You create a volume and they allocate you X number of gigabytes and you use it like a hard drive that you can plug into any of your running computers (instances). Volumes can either be created blank or from a snapshot copy of previous volume, which brings us to the next topic.
Snapshots are ... well ... snapshots of volumes: an exact capture of what a volume looked like at a particular moment in time, including all its data. You could have a volume, attach it to your instance, fill it up with stuff, then snapshot it, but keep using it. The volume contents would keep changing as you used it as a file system but the snapshot would be frozen in time. You could create a new volume using this snapshot as a base. The new volume would look exactly like your first disk did when you took the snapshot. You could start using the new volume in place of the old one to roll-back your data, or maybe attach the same data set to a second machine. You can keep taking snapshots of volumes at any point in time. It's like a freeze-frame instance backup that can then easy be made into a new live disk (volume) whenever you need it.
So volumes can be based on new blank space or on a snapshot. Got that? Volumes can be attached and detached from any instances, but only connected to one instance at a time, just like the physical disk that they are a virtual abstraction of.
Now back to AMIs. These are tricky because there are two types. One creates an ephemeral instances where the root files system looks like a drive to the computer but actually sits in memory somewhere and vaporizes the minute it stops being used. The other kind is called an EBS backed instance. This means that when your instances loads up, it loads its root file system onto a new EBS volume, basically layering the EC2 virtual machine technology on top of their EBS technology. A regular EBS volume is something that sits next to EC2 and can be attached, but an EBS backed instance also IS a volume itself.
A regular AMI is just a big chunk of data that gets loaded up as a machine. An EBS backed AMI will get loaded up onto an EBS volume, so you can shut it down and it will start back up from where you left off just like a real disk would.
Now put it all together. If an instance is EBS backed, you can also snapshot it. Basically this does exactly what a regular snapshot would ... a freeze frame of the root disk of your computer at a moment in time. In practice, it does two things different. One is it shuts down your instance so that you get a copy of the disk as it would look to an OFF computer, not an ON one. This makes it easier to boot up :) So when you snapshot an instance, it shuts it down, takes the disk picture, then starts up again. Secondly, it saves that images as an AMI instead of as a regular disk snapshot. Basically it's a bootable snapshot of a volume.
From what I've found in researching bits and pieces, it's not easy to do.
To get the image, you can take a snapshot, and mount it to a running instance then just copy down the contents to a local raw file with something like dd over ssh. Then disconnect the volume from the instance, verify you have the image locally stored, and delete the EBS block. That part isn't too difficult if you know how to use DD/compression/ssh to transfer the image and mount it as a local loopback to examine the raw disk image. Tutorials are available for that.
The hard part is getting it to boot. Depending on how your instance was created, it seems that the kernels are usually stripped down Xen kernels, so they may lack hardware support for something like VMWare. You'd have to mount the disk image and install a more generic kernel along with modifying the boot manager. You also would have to iron out the networking, as Amazon had some tweaks put in for handling their virtual network management (DHCP assignments, firewall, routing).
This must be possible; there are tools and tutorials for uploading your own AMI's into the Amazon cloud, just there isn't too much out there on how to go the other way. By the time you're done figuring out how to unravel the spaghetti of configuration hassles you might be better off just getting a list of dependencies for your applications and transferring the configurations and installing dependencies as a new local machine.
Bottom line...it's probably possible, it's possible to go the other way in the conversion, but with the hassle involved unless you're skilled at Linux surgery on the kernel and configuration you might as well use your EC2 instances as a template for rebuilding from the bottom up.
Best Answer
AMIs are somewhat unique in that the kernel is separate from the image. It depends on the provider and whether they support the upload of AMI-style images.
The Rackspace Public Cloud supports upload of images in VHD format, while Rackspace Private Clouds support the use of AMIs.
As of October 2013 Digital Ocean did not support image uploads.
CloudStack isn't the same thing as a Rackspace Public Cloud, EC2, or Digital Ocean, which are hosted offerings built on one cloud stack or another. CloudStack is an open source cloud stack, similar to OpenStack. OpenStack and CloudStack both support AMI images.
If you want maximum portability between clouds it's probably worth looking at those you'd like to use and figure out which image format (AMI, VHD, QCOW2, etc) is best supported among them.