One of the most common problems in modern software development is the phrase, “It works on my machine,” when a particular piece of code runs on developer’s machine but produces error on other team member’s machine. Thankfully, now there is a plugin that can help determine why something works only in particular environments, turning the phrase into more an observation than an excuse.
Vagrant to the Rescue
Vagrant is a tool for building and maintaining portable software development environments. It isolates your project’s dependencies and configuration from your projects without disturbing the tools your application is consuming. You could easily reproduce similar environments on other machines by using the same configuration as your machine.
Basic Concepts in Vagrant
Before going further, it is important to understand the following basic concepts that are essential to the working of Vagrant.
Provisioners provide automation for installing different software and configurations. It is useful in cases when you don’t want to install software manually to your machine.
Providers provide basic services that are required to run your machine. Although Vagrant provides support for VirtualBox, Hyper-V and Docker, other providers can also be used through appropriate plugin.
Boxes are Vagrant environment packages that can be copied to any other machine to replicate a similar environment. Vagrant provides a repository of these boxes that can be downloaded, and you can contribute to the list by adding your own customized box.
Install the Plugin
The first step in the process is to make sure that you have Vagrant installed on your machine. As I mentioned earlier, you could use providers by installing the respective plugins. For the purpose of this tutorial, I will download the vagrant-aws plugin through the following command:
vagrant plugin install vagrant-aws
Next, verify the plugin installation through the command:
vagrant plugin list
The vagrant-aws plugin should be present in the plugins list
Set Up the Vagrant Box
After installing plugin, the next step is to install a Vagrant box. The problem is that there is no box for AWS provider. To make things work, I recommend you use the dummy box provided by Mitchell Hashimoto.
Run the following command to add the dummy box:
vagrant box add aws https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
Although I have named the box aws, you can give it any name that works for you. Once the process finishes, I am ready to create AWS instances.
Create the Instance
Run the vagrant init command to create a vagrant file:
Next, edit the vagrant file as follows:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Require the AWS provider plugin
# Creating and configuring the AWS instance
Vagrant.configure(‘2’) do |config|
# Use dummy AWS box
config.vm.box = ‘aws’
# Specify configuration of AWS provider
config.vm.provider ‘aws’ do |aws, override|
# Read AWS authentication information from environment variables
aws.access_key_id = ‘ABCR2NDJKZJIAJ5QVXGJK’
aws.secret_access_key = ‘WAuZE39lKHXAJnCfbZf2y6DzRfeCsPUU/yZMRDWo’
# Specify SSH keypair to use
aws.keypair_name = ‘vagrant’
# Specify region, AMI ID, Instance and security group
aws.region = ‘ap-southeast-2’
aws.ami = ‘ami-14b55f76’
aws.instance_type = ‘t2.micro’
aws.security_groups = [‘default’]
# Specify username and private key path
override.ssh.username = ‘ubuntu’
override.ssh.private_key_path = ‘~/vagrant/vagrant’
The following list explains the important variables and aspects of the above file:
- config.vm.box : Specify the box. Using dummy aws box for AWS deployment
- aws.access_key_id : Access key ID of your Amazon account
- aws.secret_access_key : The secret access key for your Amazon account
- aws.keypair_name : Your SSH keypair in AWS
- aws.region : The AWS region in which you want to create your instance
- aws.ami : The AMI ID you want to use. AMI specifies the information needed to launch a virtual machine within EC2
- aws.instance_type : The AWS instance you want to create
- aws.security_groups : Specify the names of security groups that will be applied to your instance
- override.ssh.username : The username that will be used to access the instance
- override.ssh.private_key_path : The path of your SSH private key
Launch the Instance
After configuring the Vagrantfile, I will simply run the vagrant up command. Vagrant will launch an AWS instance through the AWS AMI provided in the configuration using the credentials provided in the Vagrantfile.
You can view the newly created instance in the AWS console panel.
You can now SSH into your AWS instance or perform other Vagrant operations.
As you can see, using Vagrant to launch a AWS instance is simply a matter of installing the plugin and then launching the instances through easy steps. If you need help with the process, do leave a comment below.
About the Author / Ali Azmi
Ali Azmi is Associate DevOps Engineer at Cloudways – A Managed PHP Cloud Hosting Platform. He is skilled in developing PHP applications particularly in Laravel. He is passionate about contributing to open source projects.