Usually the deployment task is conducted by a team of experts that establishes how the different components are to be
installed and connected together. The deployment process is then automated by coding it in custom scripts. This approach
is effective only if the architecture of the system is decided once and for all and is not expected to be customized for the
different needs of the potential end-users, or shaped differently to, e.g., optimize the usage of the available resources.
Currently, developing an application for the cloud is accomplished by relying on the Infrastructure as a Service (IaaS) or
the Platform as a Service (PaaS) levels. The IaaS level provides a set of low-level resources forming a “bare” computing en vironment. Developers pack the whole software stack into virtual machines containing the application and its dependencies
and run them on physical machines of the provider’s cloud. Exploiting the IaaS directly allows a great flexibility but requires
also a great expertise and knowledge of the cloud and application entities involved in the process. At the PaaS level (e.g., [8,
9]) a full development environment is provided. Applications are directly written in a programming language supported by
the framework offered by the provider, and then automatically deployed to the cloud. The high-level of automation comes
however at the price of flexibility: the choice of the programming language to use is restricted to the ones supported by
the PaaS provider, and the application code must conform to specific APIs.