Setting up an Amazon AMI
Start with the CS462 AMI.
Edit multiverse.list
sudo vi /etc/apt/sources.list.d/multiverse.list
Add the following lines to multiverse.list:
deb http://us.ec2.archive.ubuntu.com/ubuntu/ karmic multiverse deb-src http://us.ec2.archive.ubuntu.com/ubuntu/ karmic main
Then run the following commands:
sudo apt-get update sudo apt-get install apache2 sudo apt-get install php5 php5-cli php-pear php5-gd php5-curl sudo apt-get install libapache2-mod-php5 sudo apt-get install libapache2-mod-python sudo apt-get install ec2-ami-tools sudo apt-get install ec2-api-tools sudo apt-get install python-cheetah sudo apt-get install python-dev sudo apt-get install python-setuptools sudo apt-get install python-simplejson sudo apt-get install python-pycurl sudo apt-get install python-imaging sudo apt-get install subversion sudo apt-get install git-core
Note: the sun-java6-bin and libphp-cloudfusion packages are not strictly necessary (OpenJDK will be installed instead of the former, and the AWS PHP SDK instructions are given below instead of the latter). unzip could come in handy as well. The python packages are installed to allow for python web development without having to install the appropriate packages after starting the server.
git config --global user.name "Johny Boy" git config --global user.email johnyboy@gmail.com sudo vi /etc/apache2/sites-available/default
Next, install Smarty as per the Smarty documentation (lines 1-3) and the Zend Framework as well (lines 4-7) since it may come in handy.
cd /usr/local/lib sudo wget http://www.smarty.net/files/Smarty-3.0.7.tar.gz sudo tar vxzf Smarty-3.0.7.tar.gz cd /opt sudo wget http://framework.zend.com/releases/ZendFramework-1.11.4/ZendFramework-1.11.4-minimal.tar.gz sudo tar vxzf ZendFramework-1.11.4-minimal.tar.gz sudo mv ZendFramework-1.11.4-minimal ZendFramework-1.11.4
Install System_Daemon as well to enable running PHP Daemons. There’s also a sample daemon illustrating how to use this class.
sudo pear install -f System_Daemon
Clone the AWS PHP SDK into /usr/share/php as documented in the “Getting Started with the AWS SDK for PHP” tutorial (lines 1-3) and then configure the SDK security credentials (lines 4-6).
sudo mkdir -p /usr/share/php cd /usr/share/php sudo git clone git://github.com/amazonwebservices/aws-sdk-for-php.git awsphpsdk mkdir -p ~/.aws/sdk cp /usr/share/php/awsphpsdk/config-sample.inc.php ~/.aws/sdk/config.inc.php vi ~/.aws/sdk/config.inc.php
Now we can prepare to create the image and then run the ec2 commands to create, upload, and register the image. See the AMI tools reference for information about these commands. Of course the actual access key, secret key, bucket names, etc need to be substituted with the correct values.
cd /mnt sudo mkdir image sudo mv /home/ubuntu/PrivateKey.pem . sudo mv /home/ubuntu/X509Cert.pem . sudo ec2-bundle-vol -k PrivateKey.pem -c X509Cert.pem -u 999988887777 -d /mnt/image sudo ec2-upload-bundle -b cs462-machines/mybucket -m /mnt/image/image.manifest.xml -a AKIADQKE4SARGYLE -s eW91dHViZS5jb20vd2F0Y2g/dj1SU3NKMTlzeTNKSQ== ec2-register cs462-machines/mybucket/image.manifest.xml --K PrivateKey.pem -C X509Cert.pem
Once the process is complete, the instance can be launched with the following user data:
#! /bin/bash sudo git clone git://github.com/pathtorepo/cs462.git /home/ubuntu/www > /home/ubuntu/gitclone.log sudo chown -R ubuntu /home/ubuntu/www/ sudo chown nobody:nogroup /home/ubuntu/www/smarty/templates_c/ sudo chown nobody:nogroup /home/ubuntu/www/smarty/cache/ sudo chmod 770 /home/ubuntu/www/smarty/templates_c/ sudo chmod 770 /home/ubuntu/www/smarty/cache/
Note that the owner of the checked out www folder is set to ubuntu to ensure files can be edited conveniently without sudo. The “nobody” user is then made the owner of the smarty folders and they are assigned to the “nogroup” group. The permissions are then set to 770 for maximum security. I actually ended up using 777 to speed up development on my server – see the apache error log if nothing is displayed from the templates (most likely a case of permission errors).
Here’s are some options to include in the apache configuration file:
DocumentRoot /home/ubuntu/www/htdocs <Directory /home/ubuntu/www/htdocs/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all DirectoryIndex index.php index.html index.py AddHandler mod_python .py AddHandler php5-script .php PythonHandler mod_python.publisher PythonDebug On </Directory>
I ended up pushing my server configuration as well to a public git server containing my entire application. Server configuration is then reduced to:
sudo cp /home/ubuntu/www/serverconfig/apache/appserver/default /etc/apache2/sites-available/default sudo apache2ctl restart