/cloud-configurator

manages cloud environment

Primary LanguageJavaMIT LicenseMIT

cloud-configurator

A program for configuring cloud environments (like aws, azure) for multi-tier webapps/ webapi. Preference is to use convention over configuration.

use case

We find that building out and maintaining cloud environments is surprisingly hard. There are many solutions available from vendors, but each one comes with a vendor lock in (eg: aws opsworks). Our particular needs (and we feel others are in this bucket too), are pretty vanilla. However, managing even a single cloud application with dev, qa, stage & production pipeline is tricky!

With this project, we are able to define an application using the language of application developers and map it to a cloud providers environment configuration. This cloud configuration can be run at will of the application developer to generate appropriate cloud artifacts.

At UL, completely automate our entire development workflow by using Chef to label (calling it a chef environment) a set of cloud resources and run a parametrized (using chef roles) set of recipes against them.

status

travis-ci

Still under development. read as NOT READY!

application

Abstraction for a commonly used cloud application. Most developers will use this level of abstraction to configure their applications. An example of this is provided below:

// building a cloud ResourceList

Application.create("myAwesomeApp-dev")
    .dataService("C*", Integer[] { 3120 })
    .httpService("api")
    .proxyService("api", "api.myawesomeapp.com", new File("privateApiKeyFile.cer")
    .httpService("app")
    .proxyService("app", "app.myawesomeapp.com", new File("privateAppKeyFile.cer")
    .build("us-west-2")

template

Low level abstraction for users with more controlled needs over their environment. Example:

String zoneA = region + "a";

String zoneB = region + "b";

return ResourceList
    .start(name)  // name of the environment
    .dns("ELB", "APP", webDomain) // CNAME to load balancer
    .dns("ELB", "API", apiDomain) // CNAME to load balancer
    .vpc("10.0.0.0/16", region)
    .subnet("ELB", "10.0.12.0/24", /* isPubliclyAccessible */ true, zoneA, zoneB)
    .subnet("APP", "10.0.51.0/24", zoneA, zoneB)
    .subnet("DB", "10.0.91.0/24", zoneA, zoneB)
    .subnet("OPS", "10.0.0.0/24", /* isPubliclyAccessible */ true, zoneB)
    .end();

provider

An abstraction that allows same program to be used across multiple cloud providers.

aws-provider

For now, AWSProvider is the only one that's provided in the source code. It uses AWS's excellent CloudFormation service for building out a set of cloud resources.

A new vpc is created for every pipeline stage of a given web application.