# Kitchen::Ec2: A Test Kitchen Driver for Amazon EC2 [![Gem Version](https://badge.fury.io/rb/kitchen-ec2.png)](http://badge.fury.io/rb/kitchen-ec2) [![Build Status](https://travis-ci.org/opscode/kitchen-ec2.png)](https://travis-ci.org/opscode/kitchen-ec2) [![Code Climate](https://codeclimate.com/github/opscode/kitchen-ec2.png)](https://codeclimate.com/github/opscode/kitchen-ec2) A Test Kitchen Driver for Amazon EC2. This driver uses the [fog gem][fog_gem] to provision and destroy EC2 instances. Use Amazon's cloud for your infrastructure testing! ## Requirements There are **no** external system requirements for this driver. However you will need access to an [AWS][aws_site] account. ## Installation and Setup Please read the [Driver usage][driver_usage] page for more details. ## Default Configuration This driver can determine AMI and username login for a select number of platforms in each region. Currently, the following platform names are supported: ```ruby --- platforms: - name: ubuntu-10.04 - name: ubuntu-12.04 - name: ubuntu-12.10 - name: ubuntu-13.04 - name: centos-6.4 - name: debian-7.1.0 ``` This will effectively generate a configuration similar to: ```ruby --- platforms: - name: ubuntu-10.04 driver_config: image_id: ami-1ab3ce73 username: ubuntu - name: ubuntu-12.04 driver_config: image_id: ami-2f115c46 username: ubuntu # ... - name: centos-6.4 driver_config: image_id: ami-bf5021d6 username: root # ... ``` For specific default values, please consult [amis.json][amis_json]. ## Configuration ### availability\_zone **Required** The AWS [availability zone][region_docs] to use. The default is `"us-east-1b"`. ### aws\_access\_key\_id **Required** The AWS [access key id][credentials_docs] to use. The default will be read from the `AWS_ACCESS_KEY` environment variable if set, or `nil` otherwise. ### aws\_secret\_access\_key **Required** The AWS [secret access key][credentials_docs] to use. The default will be read from the `AWS_SECRET_KEY` environment variable if set, or `nil` otherwise. ### aws\_ssh\_key\_id **Required** The EC2 [SSH key id][key_id_docs] to use. The default will be read from the `AWS_SSH_KEY_ID` environment variable if set, or `nil` otherwise. ### flavor\_id The EC2 [instance type][instance_docs] (also known as size) to use. The default is `"m1.small"`. ### groups An Array of EC [security groups][group_docs] which will be applied to the instance. The default is `["default"]`. ### image\_id **Required** The EC2 [AMI id][ami_docs] to use. The default will be determined by the `aws_region` chosen and the Platform name, if a default exists (see [amis.json][ami_json]). If a default cannot be computed, then the default is `nil`. ### port The SSH port number to be used when communicating with the instance. The default is `22`. ### region **Required** The AWS [region][region_docs] to use. The default is `"us-east-1"`. ### require\_chef\_omnibus Determines whether or not a Chef [Omnibus package][chef_omnibus_dl] will be installed. There are several different behaviors available: * `true` - the latest release will be installed. Subsequent converges will skip re-installing if chef is present. * `latest` - the latest release will be installed. Subsequent converges will always re-install even if chef is present. * `` (ex: `10.24.0`) - the desired version string will be passed the the install.sh script. Subsequent converges will skip if the installed version and the desired version match. * `false` or `nil` - no chef is installed. The default value is unset, or `nil`. ### ssh\_key Path to the private SSH key used to connect to the instance. The default is unset, or `nil`. ### subnet\_id The EC2 [subnet][subnet_docs] to use. The default is unset, or `nil`. ### sudo Whether or not to prefix remote system commands such as installing and running Chef with `sudo`. The default is `true`. ### tags The Hash of EC tag name/value pairs which will be applied to the instance. The default is `{ "created-by" => "test-kitchen" }`. ### username The SSH username that will be used to communicate with the instance. The default will be determined by the Platform name, if a default exists (see [amis.json][amis_json]). If a default cannot be computed, then the default is `"root"`. ## Example The following could be used in a `.kitchen.yml` or in a `.kitchen.local.yml` to override default configuration. ```yaml --- driver_plugin: ec2 driver_config: aws_access_key_id: KAS... aws_secret_access_key: 3UK... aws_ssh_key_id: id_rsa-aws ssh_key: /path/to/id_rsa-aws region: us-east-1 availability_zone: us-east-1b require_chef_omnibus: true subnet_id: subnet-6d6... platforms: - name: ubuntu-12.04 driver_config: image_id: ami-fd20ad94 username: ubuntu - name: centos-6.3 driver_config: image_id: ami-ef5ff086 username: ec2-user suites: # ... ``` Both `.kitchen.yml` and `.kitchen.local.yml` files are pre-processed through ERB which can help to factor out secrets and credentials. For example: ```yaml --- driver_plugin: ec2 driver_config: aws_access_key_id: <%= ENV['AWS_ACCESS_KEY'] %> aws_secret_access_key: <%= ENV['AWS_SECRET_KEY'] %> aws_ssh_key_id: <%= ENV['AWS_SSH_KEY_ID'] %> ssh_key: <%= File.expand_path('~/.ssh/id_rsa') %> region: us-east-1 availability_zone: us-east-1b require_chef_omnibus: true platforms: - name: ubuntu-12.04 driver_config: image_id: ami-fd20ad94 username: ubuntu - name: centos-6.3 driver_config: image_id: ami-ef5ff086 username: ec2-user suites: # ... ``` ## Development * Source hosted at [GitHub][repo] * Report issues/questions/feature requests on [GitHub Issues][issues] Pull requests are very welcome! Make sure your patches are well tested. Ideally create a topic branch for every separate change you make. For example: 1. Fork the repo 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Added some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request ## Authors Created and maintained by [Fletcher Nichol][author] () ## License Apache 2.0 (see [LICENSE][license]) [author]: https://github.com/fnichol [issues]: https://github.com/opscode/kitchen-ec2/issues [license]: https://github.com/opscode/kitchen-ec2/blob/master/LICENSE [repo]: https://github.com/opscode/kitchen-ec2 [driver_usage]: http://docs.kitchen-ci.org/drivers/usage [chef_omnibus_dl]: http://www.opscode.com/chef/install/ [amis_json]: https://github.com/opscode/kitchen-ec2/blob/master/data/amis.json [ami_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html [aws_site]: http://aws.amazon.com/ [credentials_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/SettingUp_CommandLine.html#using-credentials-access-key [fog_gem]: http://fog.io/ [group_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html [instance_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html [key_id_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/verifying-your-key-pair.html [region_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html [subnet_docs]: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html