Amazon Elastic Beanstalk can deploy an application and auto-scale the platform depending on the load you are using or you need. You can also manage multiple environments for your application.
Amazon has created a package with useful tools to deploy your app named AWS Dev Tools.
Download and installation of AWS Dev Tools
Remember to get the latest available version on the following page: http://aws.amazon.com/code/6752709412171743.
Install those tools in the /opt directory and add executables directories in the PATH environment variable:
$ sudo wget -O /opt/aws.zip https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.5.1.zip $ sudo unzip -d /opt /opt/aws.zip $ export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.5.1/api/bin/:/opt/AWS-ElasticBeanstalk-CLI-2.5.1/eb/linux/python2.7/
AWS Dev Tools are now ready to use.
Configure your Git repository to deploy your application
We will now use a setup tool available in the AWS Dev Tools package to prepare the Git repository and add some commands to it.
To do that, go to the root directory of your Git repository project and type:
No output should appear but you must have a new AWSDevTools subdirectory in the .git directory. Verify with:
$ ls .git/AWSDevTools aws aws.elasticbeanstalk.config aws.elasticbeanstalk.push
Your Git is ready, you can know use those new git commands :
git aws.config : to configure your Amazon identifiers (Access key & Secret key) and specify your application/environment name,
git aws.push : to push your repository content on your Amazon Elastic Beanstalk application.
Configure your git project by typing the git aws.config command:
$ git aws.config AWS Access Key:
AWS Secret Key: AWS Region [default to us-east-1]: AWS Elastic Beanstalk Application: AWS Elastic Beanstalk Environment: NOTE: "git aws.push" will use the credentials found in the following file: /home/ /.elasticbeanstalk/aws_credential_file You can supply different credentials by editing that file or editing .elasticbeanstalk/config to reference a different file. The file should have the following format: AWSAccessKeyId=your key AWSSecretKey=your secret
As the output says, a new file with your Amazon API identifiers (Access key and Secret key) has been created in the following path: /home/
Also please note that the .elasticbeanstalk directory has been automatically added to your .gitignore file.
Deploy the app!
You just had to type the following command:
$ git aws.push
The Amazon AMI images for Amazon Elastic Beanstalk already has some useful hooks installed on during deploying as they automatically run composer install when a composer.json file is found on the root project path.
You can list all available hooks by connecting on the server and typing:
$ ls -R /opt/elasticbeanstalk/hooks/appdeploy/ /opt/elasticbeanstalk/hooks/appdeploy/: enact pre /opt/elasticbeanstalk/hooks/appdeploy/enact: 01_flip.sh 09clean.sh 99_reload_app_server.sh /opt/elasticbeanstalk/hooks/appdeploy/pre: 01_unzip.sh 02_setup_envvars.sh 05_configure_php.sh 10_composer_install.sh 12_update_permissions.sh
Define custom deployment hooks
Amazon permit you to write custom deployment hooks by adding files named
They will be executed in alphabetically order (protip: you can prefix them with a number: 01installcomposer.config, 02assetsinstall.config, etc ...).
Configuration files must be written in YAML format and can have multiple commands in them, executed in alphabetically order too. See this example:
container_commands: 01updatecomposer: command: "composer.phar self-update" leader_only: true 02getcomposer: command: "cd /var/app/ondeck/html/ && composer.phar install --prefer-source" leader_only: true
For your information please note that during application deployment the action takes place in the /var/app/ondeck/ directory and when deployment is finished (and succeed) the application is available in /var/app/current/.
You can also define environment variables in them, create users, install packages, etc ... for more information on available syntaxes, go to: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html.