The Java web application used in this guide is a demo application called dbapp. The source code for the WAR (web application archive) can be downloaded on the Opscode GitHub account. The application consists of a servlet that does a simple database query via a JDBC datasource that is retrieved from JNDI and forwards the results onto a JSP page for rendering.
We're going to reuse a number of cookbooks from the Cookbooks Community Site to build the environment.
The application cookbook assumes some sort of build process, such as Maven or a Continuous Integration server like Hudson, will create a deployable artifact and make it available for download via HTTP (such as S3). The application cookbook will install Tomcat, download and deploy the dbapp WAR file and create the required Tomcat context.xml files (which contains database connection information). The database cookbook installs MySQL, creates any application specific databases and grants application users access to these databases.
We are also following the recommended pattern of creating a cookbook named after the application that is being deployed which contains application specific setup and configurations. In this case, the dbapp cookbook contains a recipe that will be used for bootstrapping our database.
Guide Based Upon Ubuntu 10.04 on Amazon AWS EC2 with Chef 0.10.0.
Note: At this time, the steps described above have only been tested on the identified platform(s). Opscode has not researched and does not support alternative steps that may lead to successful completion on other platforms. Platform(s) supported by this guide may change over time, so please do check back for updates. If you'd like to undertake this guide on an alternate platform, you may desire to turn to open source community resources for support assistance.
First, let's configure the local workstation.
Obtain the repository used for this guide. It contains all the components required. Use git:
Chef and Knife
All Users: You'll need some additional gems for Knife to launch instances in Amazon EC2:
As part of the Fast Start Guide, you cloned a chef-repo and copied the Knife configuration file (knife.rb), validation certificate (ORGNAME-validator.pem) and user certificate (USERNAME.pem) to
Add the Amazon AWS credentials to the Knife configuration file.
Add the following two lines to the end:
Once the java-quick-start and knife configuration is in place, we'll work from this directory.
Amazon AWS EC2
In addition to the credentials, two additional things need to be configured in the AWS account.
Configure the default security group to allow incoming connections for the following ports.
Add these to the default security group for the account using the AWS Console.
1. Sign into the Amazon AWS Console.
Create an SSH Key Pair and save the private key in
1. In the AWS Console, click on "Key Pairs" in the left sidebar.
The java-quick-start has all the cookbooks we need for this guide. They were downloaded along with their dependencies from the cookbooks site using Knife. These are in the
A single new non-community cookbook was also created for this quick-start. This dbapp cookbook contains a recipe that is used to bootstrap our database. This follows the recommended pattern of creating a cookbook named after the application which contains application specific setup and configurations.
Upload all the cookbooks to Hosted Chef.
All the required roles have been created in the java-quick-start repository. They are in the
Upload all the roles to Hosted Chef.
Data Bag Item
The java-quick-start repository contains a data bag item that has all the information required to deploy and configure the Java web application archive (WAR) from S3 using the recipes in the application and database cookbooks.
The data bag name is apps and the item name is dbapp. Upload this to Hosted Chef.
It is time for you to decide whether you want a single instance running dbapp, or a few instances as a small infrastructure.
In either case, we're going to use m1.small instances with the 32 bit Ubuntu 10.04 image provided by Canonical. The identifier is ami-7000f019 for the AMI in us-east-1 with instance storage that we will use in this guide. We'll show you the *knife ec2 server create* sub-command to launch instances.
This command will:
See the appropriate section below for instruction on launching a single instance, or launching the multi-system infrastructure.
Launch Single Instance
Launch the entire stack on a single instance.
Once complete, the instance will be running MySQL and the Java webapp under Tomcat. With only one system, a load balancer is unnecessary.
Launch Multi-instance Infrastructure
We will launch one database server, two application servers and one load balancer. One of the application server instances will include the role for setting up the database as discussed before.
First, launch the database instance.
Once the database master is up, launch one node that will create the database schema and set up the database with default data.
Launch the second application instance w/o the dbapp::db_bootstrap recipe.
Once the second application instance is up, launch the load balancer.
Once complete, we'll have four instances running in EC2 with MySQL, Tomcat and haproxy up and available to serve traffic.
Knife will output the fully qualified domain name of the instance when the commands complete. Navigate to the public fully qualified domain name on port 80:
You can access the haproxy admin interface at:
The data bag item for dbapp contains default passwords that should certainly be changed to something stronger.
The passwords in the dbapp Data Bag Item are set to the values show below:
To change the password to something stronger, modify mysql_root, mysql_debian, mysql_repl values. Something like the following secure passwords:
Once the entries are modified, simply load the data bag item from the json file:
For people not using Amazon EC2, other Cloud computing providers can be used. Supported by knife and fog as of this revision:
See the Launch Cloud Instances with Knife for more information about using Knife to launch these instance types.
For people not using cloud at all, but have their own infrastructure and hardware, use the Knife Bootstrap knife command. Note that the run-list specification is slightly different. For the first example of the single instance:
See the contextual help for knife bootstrap on the additional options to set for SSH.
A Note about EC2 Instances
We used m1.small instances. This is a low performance instance size in EC2 and just fine for testing. Visit the Amazon AWS documentation to learn more about instance sizes.