public cloud services (digitalocean, aws) and vagrant

07 Nov 2013

I like to keep a fast, ordered and stable computer, that’s why I use virtual machines, containers, public cloud services and other means to keep it that way, all my ram belongs to firefox 😅

The cloud is great, I can do more with less because they usually have more resources than my laptop and plenty of bandwidth 😍. My favorite elastic cloud is DigitalOcean ($5/month), sometime ago also tried Ec2 but its pricing scheme made me uncomfortable. Other than that, I also use Low End Boxes (LEB) when running long term tasks, it’s amazing how far you can go with a $20/year box.

So, getting back to the main topic, it turns out than through plugins, vagrant is able to launch and provision to remote machines, that’s what I’m using to interact with cloud instances.

$ vagrant up --provider=digital_ocean
$ vagrant up --provider=aws

It’s not perfect, vagrant takes ages just to print a help screen, but I think I can manage to use it till I find something better, recommendations are welcome.

Vagrant

Vagrant installation process is a breeze, it supports OSX, Windows and Linux, in some Linux distributions it’s even included in official repositories, but such versions are commonly out of date, that’s the case with Ubuntu, so it’s better to download Vagrant from its site.

$ sudo dpkg -i vagrant_version.deb
$ #vagrant will be installed in /opt/vagrant/

Vagrant-digitalocean

Once vagrant is onboard, it can be used to download plugins.

$ vagrant plugin install vagrant-digitalocean

Vagrant-aws

The vagrant-aws plugin is somekind troublesome, even when its documentation doesn’t mention it, it requires some dependencies:

$ sudo apt-get install build-essential libxslt-dev libxml2-dev zlib1g-dev

The plugin installation isn’t that bad:

$ vagrant plugin install vagrant-aws

To play well with aws, you’ll need to create a new default security group that allows inbound connections through port 22, it’s dump considering the plugin can deploy new instances but it doesn’t upload a valid security group afterwards. Don’t forget to upload your public ssh key too.

Vagrantfile

Finally, the additional providers can be used in Vagrantfile files:

VAGRANT_API_VERSION = "2"

Vagrant.configure(VAGRANT_API_VERSION) do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/id_rsa'
    override.ssh.username = 'admin'
    override.vm.box = 'digital_ocean'
    override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
    override.vm.provision "shell", inline: "su - #{override.ssh.username} -c \"sh <(wget -qO- javier.io/s)\""

    provider.image = 'ubuntu-12-04-x64'
    provider.region = 'nyc2'
    #provider.size = '16gb'
    #provider.size = '8gb'
    #provider.size = '4gb'
    #provider.size = '2gb'
    #provider.size = '1gb'
    provider.size = '512mb'
    provider.private_networking = 'false'
    provider.setup = 'true'
    provider.token = 'ACCESS_KEY_SECRET'
    provider.ca_path = '/etc/ssl/certs/ca-certificates.crt'
  end

  config.vm.provider :aws do |provider, override|
    #depends on: 'build-essential libxslt-dev libxml2-dev zlib1g-dev' on ubuntu
    #requires a custom security group to allow input connections to port 22

    override.ssh.private_key_path = "~/.ssh/id_rsa"
    override.ssh.username = "ubuntu"
    override.vm.box = 'dummy'
    override.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
    override.vm.provision "shell", inline: "su - #{override.ssh.username} -c \"sh <(wget -qO- javier.io/s)\""

    provider.access_key_id = "ACCESS_KEY_SECRET"
    provider.secret_access_key = "ACCESS_KEY_SECRET"
    provider.ami = "ami-a73264ce"
    provider.instance_type = "t1.micro"
    provider.keypair_name = "id_rsa"
  end
end

# vi:ft=ruby:

And used with vagrant to launch empty remote boxes:

$ vagrant up --provider=digital && vagrant ssh
$ vagrant up --provider=aws     && vagrant ssh

Don’t forget to destroy the instances to avoid extra charges.

$ vagrant destroy

That’s it, how do you launch remote environments?